Различное отображение на разных типах элементов 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>

Каждый тип новостей имеет свой собственный шаблон с различными полями

  • новый: заголовок, сокращенный текст, полный текст
  • внешние новости: заголовок, сокращенный текст, внешний URL, окно выбора сайта
  • выпуск продукта: название, сокращенный текст, полный текст, поле выбора продукта

Я могу сделать подслои (.ascx) или визуализации (.xslt) для каждого типа, но теперь я хочу знать, как отображать их в моем цикле.

Могу ли я поместить заполнитель в свой цикл, и Sitecore будет знать, что заполнитель должен использоваться текущим элементом?

2 ответа

Может быть, я что-то упустил, но разве вы не могли просто создать подслой рендеринга (xslt) og (элемент управления asp.net) для шаблона, привязанного к презентации этого шаблона?

Вместо создания "сложного" if или переключателя для обработки разных шаблонов, сделать один простой для каждого шаблона?

Например. у вас есть эти элементы управления 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' - правильный синтаксис.

Надеюсь, это поможет.

Я думаю, что ответ на этот вопрос полностью зависит от того, какой контент вы собираетесь показывать. Вы можете поместить все, что хотите, в поле Rich text и сделать его уникальным для Item. Это, безусловно, самое простое решение, и оно имеет для меня наибольшее значение... но, возможно, я неправильно понимаю, что вы пытаетесь сделать. Но я вполне уверен, что вы не хотите делать это в XSLT. (конечно, я предвзятый... я ничего не делаю в XSLT)

Если бы мне действительно нужно было сделать рендеринг по-разному в зависимости от шаблона, я бы сделал его подслойным с кодом. Просто не имеет смысла помещать бизнес-логику в XSL.

Также возможно динамически добавить подслой к заполнителю. В конце концов, это то, что Sitecore делает в бэкэнде... Таким образом, вы можете указать конкретный подслой в зависимости от того, какой (случайный?) Элемент вы отображаете, и установить источник данных для вашего элемента.

Другие вопросы по тегам