Различное отображение на разных типах элементов Sitecore - PullRequest
0 голосов
/ 04 мая 2011

Давайте объясним на моем конкретном примере:

У меня есть 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 ]

3 голосов
/ 06 мая 2011

Может быть, я что-то упустил, но разве вы не могли просто иметь подслой рендеринга (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' - правильный синтаксис.

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

0 голосов
/ 05 мая 2011

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

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

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

...