在不同的Sitecore项类型上显示不同的内容

时间:2011-05-04 18:50:22

标签: xslt sitecore ascx

让我们用我的具体例子来解释:

我有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>

每种新闻类型都有自己的模板,包含不同的字段

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

我可以为每种类型制作子布局(.ascx)或渲染(.xslt),但现在我想知道如何在循环中显示那些

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

2 个答案:

答案 0 :(得分:3)

也许我错过了一些东西,但是你不能只为每个模板绑定到该模板的演示文稿的渲染(xslt)og子布局(asp.net控件)吗?

不是创建“复杂”if或切换到处理不同的模板,而是为每个模板制作一个简单的文件?

EG。你有这些asp.net控件:

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

否则如果您更喜欢使用1 xslt,因为它们有很多共享字段,您可以使用

<xsl:template match="*">

功能。我想你会写这样的东西:

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

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

我希望这会有所帮助。

答案 1 :(得分:0)

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

如果我真的不得不根据模板使渲染行为不同,我会将其作为带有代码隐藏的子布局。将业务逻辑放在XSL中是没有意义的。

也可以动态地将子布局添加到占位符。毕竟,这就是Sitecore在后端做的事情......所以你可以根据你正在显示的(随机?)项目来指定特定的子布局,并将数据源设置为你的项目。