2011-05-04 48 views
0

让我具体的例子说明一下:有不同Sitecore的项目类型不同的显示

我有3种类型(模板)的消息:新的,外部新闻,产品发布;

我想以不同的方式在主页上显示它们。

现在我做一个简单的在我的xsl:

<xsl:variable name="upcoming" select="./item[sc:formatdate(sc:fld('End Date',.),'yyyyMMdd') >= sc:formatdate($now,'yyyyMMdd')" /> 
<xsl:for-each select="$upcoming"> 
    <div> 
     <h2> 
      <sc:text field="Name" /> 
     </h2> 
     <p> 
      <sc:text field="Description" /> 
     </p> 
    </div> 
</xsl:for-each> 

拳的解决方案是类似的东西(很显然,我不知道真正的语法):

<xsl:choose> 
    <xsl:when test="template = 'external news'"> 
     <!-- something --> 
    </xsl:when> 
</xsl:choose> 

但更好的是一个更加面向对象的方法,并有一个make_body()函数绑定到我可以从我的主页渲染调用的项目。

或者Sitecore有一种方法来渲染一个可以显示在任何页面上的项目;由物品本身处理的渲染?

您认为如何?


更新

我想我是不够清楚:

我想在我的主页上最后的消息框:

<div class="last_news"> 
    <h2>Last News</h2> 
    <!-- Loop Goes here --> 
</div> 

我不同的新闻类型(新,外新闻,产品发布)当它们在该框中列出时具有不同的外观:

新:

<div class="news"> 
    <h2><!-- title --></h2> 
    <p><!-- abridged text goes here --><p> 
    <a href="##news url##">read more</a> 
</div> 

外部新闻:

<div class="news external"> 
    <img src="##website logo##"> 
    <h2><!-- title --></h2> 
    <p><!-- abridged text goes here --><p> 
    <a href="##external url##">read more on www.<!-- site name --></a> 
</div> 

产品发布:

<div class="news product_release"> 
    <div class="float_left"> 
     <img src="##product logo##"> 
     <a href="##product url##">Download now</a> 
     <a href="##product download url##">Download now</a> 
    </div> 
    <h2><!-- title --></h2> 
    <p><!-- abridged text goes here --><p> 
    <a href="##news url##">read more</a> 
</div> 

每个新闻类型都有它不同的领域

  • 新的自己的模板:标题,删节的文字,全文
  • 外部新闻:标题,删节的文字,外部网址,网站选择框
  • 产品发布:标题,删节的文字,全文,产品选择框

我可以做一个sublayouts(的.ascx)或效果图(.xslt),但现在我想知道如何在我的循环中显示那些

我可以在我的循环中放置一个占位符,并且Sitecore会知道占位符必须由当前项使用吗?

+0

您是否希望坚持使用XSLT(yuck!)或愿意切换到C#并使用子布局(用户控件)或编译的Web控件? – 2011-05-05 03:42:34

+0

您尚未提供正在处理的XML文档。如果你这样做,我会向你展示一个简单而优雅的XSLT解决方案。 – 2011-05-05 03:50:39

+0

我强烈建议你使用C#并使用子布局。 xsl适合简单的解决方案,但是当事情变得更加复杂时,您可能需要切换到子布局/用户控件。 – Younes 2011-05-05 07:28:37

回答

0

我认为这个答案完全取决于你要展示什么样的内容。您可以将任何您想要的内容放在Rich文本字段中,并使其对该项目是唯一的。这是迄今为止最简单的解决方案,对我来说最有意义......但也许我误解了你想要做的事情。但我相当肯定你不想在XSLT中这样做。 (当然,我有偏见......我在XSLT中没有做任何事情)

如果我真的必须根据模板使渲染行为有所不同,那么我会让它成为一个带有代码隐藏的子布局。把业务逻辑放在XSL中是没有意义的。

也可以动态地将子布局添加到占位符。毕竟,这就是Sitecore在后端执行的操作......因此,您可以根据您正在显示的(随机)项目指定特定的子布局,并将数据源设置为您的项目。

3

也许我失去了一些东西,但是你不能只是有一个渲染(xslt)og sublayout(asp.net控件)每个模板绑定到该模板的演示文稿?

而不是创建一个“复杂”,如果或切换处理不同的模板,使一个简单的每个模板?

例如,你有这些asp.net控件:

  • new.ascx
  • external_news.ascx
  • product_release.ascx

否则,如果您喜欢使用XSLT 1,因为他们有很多的共享字段,您可以使用

<xsl:template match="*"> 

功能。我想你会这样写:

<xsl:template match="@template='external news'"> 
    //do something specific for the 'external news' template 
</xsl:template> 

然后你只是为每个模板制作一个。警告我不是100%确定@ template ='x'是正确的语法。

我希望这会有所帮助。

+0

你的拳头解决方案是我正在寻找的,但我似乎无法找到如何输出一个绑定sublayont在我每个。 – Kevthunder 2011-05-06 12:42:50

+0

但是你有不同的模板,每种类型?即是否有模板“外部新闻”,“产品发布”等或仅有不同的主/分支? 如果存在不同的模板,则只需设置这些模板的布局(在标准值子项上)。 IE浏览器。使用占位符添加子布局(.ascx)或渲染(.xslt)的布局(.aspx页面)。这只是标准的Sitecore的东西。 如果它是不同的主/分支(即相同的模板),那么我建议把它做为继承的模板。 IE浏览器。制作一个“主”新闻模板,并与其他模板一起继承。 – Holger 2011-05-09 10:48:55

+0

是的,我可以为每个模板制作一个子布局(.ascx)或渲染(.xslt)。但我不想显示**一个**项目,但最后** 10 **添加项目。我不知道如何在许多项目列表中显示这些子布局。 – Kevthunder 2011-05-11 19:07:02