Различное отображение на разных типах элементов 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 делает в бэкэнде... Таким образом, вы можете указать конкретный подслой в зависимости от того, какой (случайный?) Элемент вы отображаете, и установить источник данных для вашего элемента.