Вывод последней новости из инфосистемы и списка остальных элементов
mrmixsun
25 марта 2013 г.
Всем добра!
Камрады, беда. задача простая и тривиальная, но я сижу уже половину дня в поисках ответа.
Дано - инфосистема, в ней список новостей. У каждого элемента есть малая картинка и описание, внутри полный текст.
Надо вывести эти элементы в таком примерно порядке: сначала выводится последний элемент (с картинкой, датой и описанием), потом выводятся все остальные элементы списком (картинка + дата + описание. При это стили для отображения последнего элемента и остальных разные, и последний элемент не должен выводиться на страницах с полным текстом прочих элементов.
Реализовал через ТДС, XSL шаблон использую следующий (для вывода списка элементов)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- СписокЭлементовИнфосистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/informationsystem"/>
</xsl:template>
<xsl:template match="/informationsystem">
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="group"/>
<xsl:variable name="value1" select="informationsystem_item/id"/>
<!-- Если в находимся корне - выводим название информационной системы -->
<xsl:choose>
<xsl:when test="$group = 0">
<div class="topblock" style="margin-top: -20px !important; left: 0px; position: relative !important; width: 100% !important; height: auto;">
<div class="topblockbgtop" style="margin-top: 10px !important; margin-bottom: 20px !important; position: relative !important;"></div>
<div class="topblockbgbottom"></div>
<div class="mainNewsBlock">
<!-- !!!вот тут должен выводиться последний элемент!!! -->
</div>
</div>
</xsl:when>
</xsl:choose>
<!-- Отображение записи информационной системы -->
<div class="content">
<xsl:apply-templates select="informationsystem_item[active=1]"/>
</div>
</xsl:template>
<!-- Шаблон вывода информационного элемента -->
<xsl:template match="informationsystem_item">
<div class="col33"><!-- выводит элементы в 3 колонки -->
<a href="{url}" class="onenews" >
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="image_small!=''">
<span class="imgwrap">
<span class="img" style="background-image:url({dir}{image_small})"></span>
<span class="imganim"></span>
</span>
</xsl:if>
<xsl:if test="description != ''">
<span class="desc">
<xsl:value-of disable-output-escaping="yes" select="description"/>
</span>
</xsl:if>
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="date"/>
</span>
</a>
</div>
</xsl:template>
</xsl:stylesheet>
вижу, что не хватает лишь вывода самого элемента, но как сделать - ума не приложу.
Спасибо!
Камрады, беда. задача простая и тривиальная, но я сижу уже половину дня в поисках ответа.
Дано - инфосистема, в ней список новостей. У каждого элемента есть малая картинка и описание, внутри полный текст.
Надо вывести эти элементы в таком примерно порядке: сначала выводится последний элемент (с картинкой, датой и описанием), потом выводятся все остальные элементы списком (картинка + дата + описание. При это стили для отображения последнего элемента и остальных разные, и последний элемент не должен выводиться на страницах с полным текстом прочих элементов.
Реализовал через ТДС, XSL шаблон использую следующий (для вывода списка элементов)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- СписокЭлементовИнфосистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/informationsystem"/>
</xsl:template>
<xsl:template match="/informationsystem">
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="group"/>
<xsl:variable name="value1" select="informationsystem_item/id"/>
<!-- Если в находимся корне - выводим название информационной системы -->
<xsl:choose>
<xsl:when test="$group = 0">
<div class="topblock" style="margin-top: -20px !important; left: 0px; position: relative !important; width: 100% !important; height: auto;">
<div class="topblockbgtop" style="margin-top: 10px !important; margin-bottom: 20px !important; position: relative !important;"></div>
<div class="topblockbgbottom"></div>
<div class="mainNewsBlock">
<!-- !!!вот тут должен выводиться последний элемент!!! -->
</div>
</div>
</xsl:when>
</xsl:choose>
<!-- Отображение записи информационной системы -->
<div class="content">
<xsl:apply-templates select="informationsystem_item[active=1]"/>
</div>
</xsl:template>
<!-- Шаблон вывода информационного элемента -->
<xsl:template match="informationsystem_item">
<div class="col33"><!-- выводит элементы в 3 колонки -->
<a href="{url}" class="onenews" >
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="image_small!=''">
<span class="imgwrap">
<span class="img" style="background-image:url({dir}{image_small})"></span>
<span class="imganim"></span>
</span>
</xsl:if>
<xsl:if test="description != ''">
<span class="desc">
<xsl:value-of disable-output-escaping="yes" select="description"/>
</span>
</xsl:if>
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="date"/>
</span>
</a>
</div>
</xsl:template>
</xsl:stylesheet>
вижу, что не хватает лишь вывода самого элемента, но как сделать - ума не приложу.
Спасибо!
hostcms
Модератор
25 марта 2013 г.
mrmixsun писал(а):
Обычный вывод с сортировкой, вагон примеров в темеhttp://www.hostcms.ru/forums/2/7122/
mrmixsun писал(а):
Где Вы это видите? в XSl-шаблоне вывод элемента у Вас есть!
Надо вывести эти элементы в таком примерно порядке: сначала выводится последний элемент (с картинкой, датой и описанием), потом выводятся все остальные элементы списком (картинка + дата + описание.
Обычный вывод с сортировкой, вагон примеров в теме
mrmixsun писал(а):
вижу, что не хватает лишь вывода самого элемента
Где Вы это видите? в XSl-шаблоне вывод элемента у Вас есть!
hostcms
Модератор
25 марта 2013 г.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- СписокЭлементовИнфосистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/informationsystem"/>
</xsl:template>
<xsl:template match="/informationsystem">
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="group"/>
<xsl:variable name="value1" select="informationsystem_item/id"/>
<!-- Если в находимся корне - выводим название информационной системы -->
<xsl:choose>
<xsl:when test="$group = 0">
<div class="topblock" style="margin-top: -20px !important; left: 0px; position: relative !important; width: 100% !important; height: auto;">
<div class="topblockbgtop" style="margin-top: 10px !important; margin-bottom: 20px !important; position: relative !important;"></div>
<div class="topblockbgbottom"></div>
<div class="mainNewsBlock">
<!-- !!!вот тут должен выводиться последний элемент!!! -->
<xsl:apply-templates select="informationsystem_item[active=1][position() = 1]"/>
</div>
</div>
</xsl:when>
</xsl:choose>
<!-- Отображение записи информационной системы -->
<div class="content">
<xsl:apply-templates select="informationsystem_item[active=1][position() > 1]"/>
</div>
</xsl:template>
<!-- Шаблон вывода информационного элемента -->
<xsl:template match="informationsystem_item">
<div class="col33"><!-- выводит элементы в 3 колонки -->
<a href="{url}" class="onenews" >
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="image_small!=''">
<span class="imgwrap">
<span class="img" style="background-image:url({dir}{image_small})"></span>
<span class="imganim"></span>
</span>
</xsl:if>
<xsl:if test="description != ''">
<span class="desc">
<xsl:value-of disable-output-escaping="yes" select="description"/>
</span>
</xsl:if>
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="date"/>
</span>
</a>
</div>
</xsl:template>
</xsl:stylesheet>
mrmixsun
15 апреля 2013 г.
Сорри за задержку. Спасибо большое, действительно все вывелось.
<xsl:apply-templates select="informationsystem_item[active=1][position() = 1]"/> - эта строчка решила
Только проблему не решило, я коряво описал видимо. Сейчас XSL шаблон выводит, грубо говоря, в два разных блока элементы ИС - последний в отдельный блок, все элементы - в отдельный блок. Проблема в том, что
вот сюда при таком раскладе выводится последняя новость, но шаблон для вывода такой же, как у остальных, хотя надо немного иной. Т.е., грубо говоря, нужен аналог вот такого вывода
Буду признателен за помощь. P.S. это все-таки не сортировка
<xsl:apply-templates select="informationsystem_item[active=1][position() = 1]"/> - эта строчка решила
Только проблему не решило, я коряво описал видимо. Сейчас XSL шаблон выводит, грубо говоря, в два разных блока элементы ИС - последний в отдельный блок, все элементы - в отдельный блок. Проблема в том, что
<div class="mainNewsBlock">
<!-- !!!вот тут должен выводиться последний элемент!!! -->
<xsl:apply-templates select="informationsystem_item[active=1][position() = 1]"/>
</div>
<!-- !!!вот тут должен выводиться последний элемент!!! -->
<xsl:apply-templates select="informationsystem_item[active=1][position() = 1]"/>
</div>
вот сюда при таком раскладе выводится последняя новость, но шаблон для вывода такой же, как у остальных, хотя надо немного иной. Т.е., грубо говоря, нужен аналог вот такого вывода
Буду признателен за помощь. P.S. это все-таки не сортировка
mrmixsun
15 апреля 2013 г.
Спасибо за участие, решил проблему сам, но благодаря вашей подсказке. Если кому-то пригодится - то вот решение:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- СписокЭлементовИнфосистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/informationsystem"/>
</xsl:template>
<xsl:template match="/informationsystem">
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="group"/>
<xsl:variable name="value1" select="informationsystem_item/id"/>
<!-- Если в находимся корне - выводим название информационной системы -->
<xsl:choose>
<xsl:when test="$group = 0">
<div class="topblock" style="margin-top: -20px !important; left: 0px; position: relative !important; width: 100% !important; height: auto;">
<div class="topblockbgtop" style="margin-top: 10px !important; margin-bottom: 20px !important; position: relative !important;"></div>
<div class="topblockbgbottom"></div>
<div class="mainNewsBlock">
<!-- !!!вот тут должен выводиться последний элемент!!! -->
<xsl:apply-templates select="informationsystem_item[active=1][position() = 1]"/>
</div>
</div>
</xsl:when>
</xsl:choose>
<!-- Отображение записи информационной системы -->
<div class="content">
<xsl:apply-templates select="informationsystem_item[active=1][position() > 1]"/>
</div>
</xsl:template>
<!-- Шаблон вывода информационного элемента -->
<xsl:template match="informationsystem_item">
<div class="col33"><!-- выводит элементы в 3 колонки -->
<a href="{url}" class="onenews" >
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="image_small!=''">
<span class="imgwrap">
<span class="img" style="background-image:url({dir}{image_small})"></span>
<span class="imganim"></span>
</span>
</xsl:if>
<xsl:if test="description != ''">
<span class="desc">
<xsl:value-of disable-output-escaping="yes" select="description"/>
</span>
</xsl:if>
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="date"/>
</span>
</a>
</div>
</xsl:template>
<!-- Шаблон вывода последнего информационного элемента -->
<xsl:template match="informationsystem_item[active=1][position() = 1]">
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="image_small!=''">
<a class="teaser" href="{url}">
<img src="{dir}{image_large}"/>
</a>
</xsl:if>
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="date"/>
</span>
<!-- Название -->
<a href="{url}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="informationsystem_item" class="header">
<span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
</a>
<xsl:if test="description != ''">
<div hostcms:id="{@id}" hostcms:field="description" hostcms:entity="informationsystem_item" hostcms:type="wysiwyg"><xsl:value-of disable-output-escaping="yes" select="description"/></div>
</xsl:if>
<div style="clear: both"></div>
</xsl:template>
</xsl:stylesheet>
Таким образом, у последнего активного элемента ИС - свой шаблон и свой контейнер для вывода.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- СписокЭлементовИнфосистемы -->
<xsl:template match="/">
<xsl:apply-templates select="/informationsystem"/>
</xsl:template>
<xsl:template match="/informationsystem">
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="group"/>
<xsl:variable name="value1" select="informationsystem_item/id"/>
<!-- Если в находимся корне - выводим название информационной системы -->
<xsl:choose>
<xsl:when test="$group = 0">
<div class="topblock" style="margin-top: -20px !important; left: 0px; position: relative !important; width: 100% !important; height: auto;">
<div class="topblockbgtop" style="margin-top: 10px !important; margin-bottom: 20px !important; position: relative !important;"></div>
<div class="topblockbgbottom"></div>
<div class="mainNewsBlock">
<!-- !!!вот тут должен выводиться последний элемент!!! -->
<xsl:apply-templates select="informationsystem_item[active=1][position() = 1]"/>
</div>
</div>
</xsl:when>
</xsl:choose>
<!-- Отображение записи информационной системы -->
<div class="content">
<xsl:apply-templates select="informationsystem_item[active=1][position() > 1]"/>
</div>
</xsl:template>
<!-- Шаблон вывода информационного элемента -->
<xsl:template match="informationsystem_item">
<div class="col33"><!-- выводит элементы в 3 колонки -->
<a href="{url}" class="onenews" >
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="image_small!=''">
<span class="imgwrap">
<span class="img" style="background-image:url({dir}{image_small})"></span>
<span class="imganim"></span>
</span>
</xsl:if>
<xsl:if test="description != ''">
<span class="desc">
<xsl:value-of disable-output-escaping="yes" select="description"/>
</span>
</xsl:if>
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="date"/>
</span>
</a>
</div>
</xsl:template>
<!-- Шаблон вывода последнего информационного элемента -->
<xsl:template match="informationsystem_item[active=1][position() = 1]">
<!-- Изображение для информационного элемента (если есть) -->
<xsl:if test="image_small!=''">
<a class="teaser" href="{url}">
<img src="{dir}{image_large}"/>
</a>
</xsl:if>
<span class="date">
<xsl:value-of disable-output-escaping="yes" select="date"/>
</span>
<!-- Название -->
<a href="{url}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="informationsystem_item" class="header">
<span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
</a>
<xsl:if test="description != ''">
<div hostcms:id="{@id}" hostcms:field="description" hostcms:entity="informationsystem_item" hostcms:type="wysiwyg"><xsl:value-of disable-output-escaping="yes" select="description"/></div>
</xsl:if>
<div style="clear: both"></div>
</xsl:template>
</xsl:stylesheet>
Таким образом, у последнего активного элемента ИС - свой шаблон и свой контейнер для вывода.
Авторизация