【问题标题】:Having different display on different Sitecore item types在不同的 Sitecore 项目类型上具有不同的显示
【发布时间】:2011-05-04 18:50:21
【问题描述】:

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

我有 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 会知道当前项目必须使用该占位符吗?

【问题讨论】:

  • 您是要坚持使用 XSLT(糟糕!)还是愿意切换到 C# 并使用子布局(用户控件)或编译的 Web 控件?
  • 您尚未提供正在处理的 XML 文档。如果你这样做了,我会向你展示一个简单而优雅的 XSLT 解决方案。
  • 我强烈建议您使用 C# 并同时使用子布局。 xsl 适合简单的解决方案,但当事情变得更复杂时,您可能需要切换到子布局/用户控件。
  • 看看周围似乎子布局就是解决方案。现在我需要从所选项目中获取子布局并告诉它渲染我的项目?

标签: xslt sitecore ascx


【解决方案1】:

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

与其创建一个“复杂”的 if 或 switch 来处理不同的模板,不如为每个模板制作一个简单的?

例如。你会有这些 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' 是正确的语法。

我希望这会有所帮助。

【讨论】:

  • 你的第一个解决方案是我正在寻找的,但我似乎无法找到如何在我的 for each 中输出绑定的 sublayont。
  • 但是每种类型都有不同的模板吗?即是否有模板“外部新闻”、“产品发布”等或只有不同的主/分支?如果有不同的模板,您只需为这些模板设置布局(在标准值子项上)。 IE。具有带有占位符的布局(.aspx 页面),您可以在其中添加子布局 (.ascx) 或渲染 (.xslt)。这只是标准的 Sitecore 东西。如果它是不同的主/分支(即相同的模板),那么我建议将其作为继承的模板。 IE。制作一个“主”新闻模板,继承其他模板。
  • 是的,我可以为每个模板制作子布局 (.ascx) 或渲染 (.xslt)。但我不想显示 一个 项目,但最后一个 10 添加项目。我不知道如何在许多项目的列表中显示这些子布局。
【解决方案2】:

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

如果我真的必须使渲染行为因模板而异,我会将其设为带有代码隐藏的子布局。将业务逻辑放在 XSL 中是没有意义的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多