Не совсем то. Анонс мне как раз нужен. Я имею в виду, что хотел бы такой вид:
- Название
<title><xsl:value-of select="key('property', concat(@id, 'h1'))/values/value"/></title>
- Дата
<xsl:if test="key('property', concat(@id, 'publish_time'))/values/value/RFC">
<pubDate><xsl:value-of select="key('property', concat(@id, 'publish_time'))/values/value/RFC"/></pubDate>
</xsl:if>
(Почему-то не работает, как писал в теме http://umihelp.ru/forum/index.php/topic,46.0.html)
- "Keywords"
Что тут прописать?
- Описание (Анонс новости)
<xsl:choose>
<xsl:when test="key('property', concat(@id, 'anons'))/values/value != ''">
<description><xsl:value-of select="key('property', concat(@id, 'anons'))/values/value"/></description>
</xsl:when>
</xsl:choose>
В данный момент выводится только Название и Анонс. И вопрос: что прописать, чтобы выводился еще и Keywords. Что-то я не нашел ничего по этой теме.
смогу посмотреть только завтра, так как надо поставить тестовый вариант
Хорошо, буду ждать ответа. Еще раз спасибо.
Ну что я могу сказать) разобраться в механизме формирования rss оказалось не такой быстрой задачей. Сегодня пообщаюсь с тех. поддержкой может они чего толкового расскажут о механизме работы rss.
Знаю только что почему то внутри rss.xsl я не могу обратиться ко всем полям объекта (новости), при попытке вывести объект мне выводяться только поля
<object id="355" name="Смена состава в Отряде в бикини" type-id="41" ownerId="9">
<properties>
<group id="52" name="common">
<title>Основные параметры</title>
<property id="50" name="title" type="string">
<title>Поле TITLE</title>
<value>Смена состава в Отряде в бикини</value>
</property>
<property id="51" name="h1" type="string">
<title>Поле H1</title>
<value>Смена состава в Отряде в бикини</value>
</property>
<property id="109" name="anons" type="wysiwyg">
<title>Анонс</title>
<value><p>Внимание: в составе Отряда в бикини произошли небольшие перестановки. В связи с испорченным маникюром и плохим настроением место Лолиты Андреевой займет Маша Шикова.</p></value>
</property>
<property id="52" name="content" type="wysiwyg">
<title>Контент</title>
<value>Внимание: в составе Отряда в бикини произошли небольшие перестановки. В связи с испорченным маникюром и плохим настроением место Лолиты Андреевой займет Маша Шикова.
Маша Шикова имеет большой опыт в борьбе с домашними призраками и два столкновения с вампирами. Новая Охотница прекрасно вписалась в наш дружный женский коллектив и в ожидании интересных заданий уже пополнила свой гардероб пятью новыми комплектами бикини.
Лолита Андреева на редкость вяло комментирует свой выход из отряда. По нашим данным, это связано с тем, что маникюрный мастер девушки, с которым у нее был длительный роман, без предупреждения уехал в отпуск на Бали и оставил ее "подыхать в одиночестве". </value>
</property>
</group>
<group id="53" name="item_props">
<title>Свойства публикации</title>
<property id="110" name="source" type="string">
<title>Источник</title>
<value>Пресс-секретарь Отряда бикини</value>
</property>
<property id="112" name="publish_time" type="date">
<title>Дата публикации</title>
<value unix-timestamp="1280842560">Tue, 03 Aug 2010 17:36:00 +0400</value>
</property>
</group>
</properties>
</object>
хотя если к томуже объекту обратиться через /uobject/355, то видны все поля, как только разберусь в этом можно будеть и keyword подставлять, насчет publish_date, сложно сказать в чем проблема, так как эту проблему надо увидить, а у меня все ок выводит.
На всякий пожарный мой rss.xsl файл
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:key name="object" match="object" use="@id"/>
<xsl:key name="property" match="property" use="concat(../../@id, name)"/>
<xsl:variable name="root" select="//element[position() = 1]"/>
<xsl:template match="umicmsDump">
<rss version="2.0" xmlns:yandex="http://news.yandex.ru">
<channel>
<title><xsl:value-of select="siteName"/></title>
<link><xsl:value-of select="element/link"/></link>
<description><xsl:value-of select="concat(siteName, ' - ', element/name)"/></description>
<language><xsl:value-of select="$root/lang/@prefix"/></language>
<xsl:choose>
<xsl:when test="$root/behaviour/module = 'catalog'">
<xsl:apply-templates select="element[behaviour/method = 'object']"/>
</xsl:when>
<xsl:when test="$root/behaviour/module = 'content'">
<xsl:apply-templates select="element[behaviour/method = 'comment']"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="element[@parentId = $root/@id]"/>
</xsl:otherwise>
</xsl:choose>
</channel>
</rss>
</xsl:template>
<xsl:template match="element">
<item>
<xsl:apply-templates select="key('object', @objectId)"/>
<link><xsl:value-of select="link"/></link>
<guid><xsl:value-of select="link"/></guid>
</item>
</xsl:template>
<xsl:template match="object">
<xsl:variable name="pageHeader" select="properties/property" />
<xsl:variable name="author" select="//object[@id = key('property', concat(current()/@id, 'author_id'))/values/value/@id]"/>
<title><xsl:value-of select="key('property', concat(@id, 'h1'))/values/value"/></title>
<xsl:if test="$author">
<author>
<xsl:choose>
<xsl:when test="$author//property[name = 'is_registrated']//value = 1">
<xsl:variable name="user" select="//object[@id = $author//property[name = 'user_id']//value/@id]"/>
<xsl:value-of select="$user//property[name = 'login']//value"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$author//property[name = 'nickname']//value"/>
</xsl:otherwise>
</xsl:choose>
</author>
</xsl:if>
<xsl:choose>
<xsl:when test="key('property', concat(@id, 'anons'))/values/value != ''">
<description><xsl:value-of select="key('property', concat(@id, 'anons'))/values/value"/></description>
</xsl:when>
<xsl:when test="key('property', concat(@id, 'content'))/values/value != ''">
<description><xsl:value-of select="key('property', concat(@id, 'content'))/values/value"/></description>
</xsl:when>
<xsl:when test="key('property', concat(@id, 'message'))/values/value != ''">
<description><xsl:value-of select="key('property', concat(@id, 'message'))/values/value"/></description>
</xsl:when>
<xsl:when test="key('property', concat(@id, 'opisanie'))/values/value != ''">
<description><xsl:value-of select="key('property', concat(@id, 'opisanie'))/values/value"/></description>
</xsl:when>
<!--xsl:otherwise>
<xsl:value-of select="name"/>
</xsl:otherwise-->
</xsl:choose>
<xsl:if test="key('property', concat(@id, 'publish_time'))/values/value/RFC">
<pubDate><xsl:value-of select="key('property', concat(@id, 'publish_time'))/values/value/RFC"/></pubDate>
</xsl:if>
<xsl:choose>
<xsl:when test="key('property', concat(@id, 'content'))/values/value != ''">
<xsl:element name="yandex:full-text" namespace="http://news.yandex.ru">
<xsl:value-of select="key('property', concat(@id, 'content'))/values/value"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="yandex:full-text" namespace="http://news.yandex.ru">
<xsl:value-of select="key('property', concat(@id, 'anons'))/values/value"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
ну тогда давайте сверим их, хотя проблемы могут быть и в вызываемых внутри него функций
версия umi 2.8.3
<?php
abstract class __rss_data {
public $rss_per_page = 10;
public function rss() {
$element_id = (int) getRequest('param0');
if(defined("VIA_HTTP_SCHEME")) {
throw new publicException("Not avalibable via scheme");
}
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "%data_feed_nofeed%";
}
if(!$this->checkIfFeedable($element_id)) {
return "%data_feed_wrong%";
}
$xslPath = "xsl/rss.xsl";
$this->generateFeed($element_id, $xslPath);
}
public function atom() {
$element_id = (int) getRequest('param0');
if(defined("VIA_HTTP_SCHEME")) {
throw new publicException("Not avalibable via scheme");
}
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "%data_feed_nofeed%";
}
if(!$this->checkIfFeedable($element_id)) {
return "%data_feed_wrong%";
}
$xslPath = "xsl/atom.xsl";
$this->generateFeed($element_id, $xslPath);
}
public function rssByCustomIds($iRootId = NULL, $vFeedIds = NULL, $sXslTpl = NULL) {
if (is_null($iRootId)) { // RETURN
return $this->rss();
} else {
if (is_null($sXslTpl)) $sXslTpl = "xsl/rss.xsl";
return $this->feedByCustomIds($iRootId, $vFeedIds, $sXslTpl);
}
}
public function atomByCustomIds($iRootId = NULL, $vFeedIds = NULL, $sXslTpl = NULL) {
if (is_null($iRootId)) { // RETURN
return $this->rss();
} else {
if (is_null($sXslTpl)) $sXslTpl = "xsl/atom.xsl";
return $this->feedByCustomIds($iRootId, $vFeedIds, $sXslTpl);
}
}
public function feedByCustomIds($iRootId, $vFeedIds, $sXslPath) {
if (!umiHierarchy::getInstance()->isExists($iRootId)) { // RETURN
return "%data_feed_nofeed%";
//} elseif (!$this->checkIfFeedable($iRootId)) { // RETURN
// return "%data_feed_wrong%";
} else {
$arrFeedIds = array();
if (is_string($vFeedIds)) {
$arrFeedIds = preg_split("/[^\d]/is", $vFeedIds);
} elseif (is_numeric($vValue)) {
$arrFeedIds = array(intval($vFeedIds));
} elseif (!is_array($vFeedIds)) {
$arrFeedIds = array();
}
$arrFeedIds = array_map('intval', $arrFeedIds);
//
$result = array();
$result[] = $iRootId;
foreach ($arrFeedIds as $iNextId) {
if ($iNextId && $oNextElement = umiHierarchy::getInstance()->getElement($iNextId)) {
$iNextParent = intval($oNextElement->getRel());
if ($this->checkIfFeedable($iNextParent)) {
$result[] = $iNextId;
}
}
}
//
$t = new umiXmlExporter();
$t->setElements($result);
$t->run();
$src = $t->getResultFile();
$xmldata = DomDocument::loadXML($src);
//echo "[".($xmldata->asXML())."]";
$xslt = new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load($sXslPath));
$resultXml = $xslt->transformToXML($xmldata);
//echo "[".$resultXml."]";
header("Content-type: text/xml; charset=utf-8");
$this->flush($resultXml);
}
}
public function generateFeed($element_id, $xslPath) {
$hierarchy = umiHierarchy::getInstance();
$sel = new umiSelection();
$sel->addLimit($this->rss_per_page);
$sel->addHierarchyFilter($element_id);
if($type_id = $hierarchy->getDominantTypeId($element_id)) {
$type = umiObjectTypesCollection::getInstance()->getType($type_id);
if($type instanceof umiObjectType) {
$field_id = $type->getFieldId("publish_time");
$sel->setOrderByProperty($field_id, false);
}
}
$result = Array($element_id);
$result = array_merge($result, umiSelectionsParser::runSelection($sel));
$t = new umiXmlExporter();
$t->setElements($result);
$t->run();
$src = $t->getResultFile();
$xmldata = DomDocument::loadXML($src);
$xslt = new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load($xslPath));
$resultXml = $xslt->transformToXML($xmldata);
$buffer = outputBuffer::current();
$buffer->contentType('text/xml');
$buffer->clear();
$buffer->push($resultXml);
$buffer->end();
}
public function getRssMeta($element_id = false, $title_prefix = "") {
$element_id = $this->analyzeRequiredPath($element_id);
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "";
}
if(!$this->checkIfFeedable($element_id)) {
return "";
}
$element = umiHierarchy::getInstance()->getElement($element_id);
$element_title = $title_prefix . $element->getName();
return "<link rel=\"alternate\" type=\"application/rss+xml\" href=\"/data/rss/{$element_id}/\" title=\"{$element_title}\" />";
}
public function getRssMetaByPath($path, $title_prefix = "") {
if($element_id = umiHierarchy::getInstance()->getIdByPath($path)) {
return $this->getRssMeta($element_id, $title_prefix);
} else {
return "";
}
}
public function getAtomMeta($element_id = false, $title_prefix = "") {
$element_id = $this->analyzeRequiredPath($element_id);
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "";
}
if(!$this->checkIfFeedable($element_id)) {
return "";
}
$element = umiHierarchy::getInstance()->getElement($element_id);
$element_title = $title_prefix . $element->getName();
return "<link rel=\"alternate\" type=\"application/rss+xml\" href=\"/data/atom/{$element_id}/\" title=\"{$element_title}\" />";
}
public function getAtomMetaByPath($path, $title_prefix = "") {
if($element_id = umiHierarchy::getInstance()->getIdByPath($path)) {
return $this->getAtomMeta($element_id, $title_prefix);
} else {
return "";
}
}
public function checkIfFeedable($element_id) {
$element = umiHierarchy::getInstance()->getElement($element_id);
if(!$element) return false;
$hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($element->getTypeId());
$module = $hierarchy_type->getName();
$method = $hierarchy_type->getExt();
foreach($this->alowed_source as $allowed) {
if($module == $allowed[0] && $method == $allowed[1]) {
return true;
}
}
return false;
}
};
?>
У меня, к сожалению, версия 2.3.3.9 и обновить нет возможности. На всякий случай вот код _rss.php
<?php
abstract class __rss_data {
public $rss_per_page = 10;
public function rss() {
$element_id = getRequest('param0');
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "%data_feed_nofeed%";
}
if(!$this->checkIfFeedable($element_id)) {
return "%data_feed_wrong%";
}
$xslPath = "xsl/rss.xsl";
$this->generateFeed($element_id, $xslPath);
}
public function atom() {
$element_id = getRequest('param0');
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "%data_feed_nofeed%";
}
if(!$this->checkIfFeedable($element_id)) {
return "%data_feed_wrong%";
}
$xslPath = "xsl/atom.xsl";
$this->generateFeed($element_id, $xslPath);
}
public function rssByCustomIds($iRootId = NULL, $vFeedIds = NULL, $sXslTpl = NULL) {
if (is_null($iRootId)) { // RETURN
return $this->rss();
} else {
if (is_null($sXslTpl)) $sXslTpl = "xsl/rss.xsl";
return $this->feedByCustomIds($iRootId, $vFeedIds, $sXslTpl);
}
}
public function atomByCustomIds($iRootId = NULL, $vFeedIds = NULL, $sXslTpl = NULL) {
if (is_null($iRootId)) { // RETURN
return $this->rss();
} else {
if (is_null($sXslTpl)) $sXslTpl = "xsl/atom.xsl";
return $this->feedByCustomIds($iRootId, $vFeedIds, $sXslTpl);
}
}
public function feedByCustomIds($iRootId, $vFeedIds, $sXslPath) {
if (!umiHierarchy::getInstance()->isExists($iRootId)) { // RETURN
return "%data_feed_nofeed%";
//} elseif (!$this->checkIfFeedable($iRootId)) { // RETURN
// return "%data_feed_wrong%";
} else {
$arrFeedIds = array();
if (is_string($vFeedIds)) {
$arrFeedIds = preg_split("/[^\d]/is", $vFeedIds);
} elseif (is_numeric($vValue)) {
$arrFeedIds = array(intval($vFeedIds));
} elseif (!is_array($vFeedIds)) {
$arrFeedIds = array();
}
$arrFeedIds = array_map('intval', $arrFeedIds);
//
$result = array();
$result[] = $iRootId;
foreach ($arrFeedIds as $iNextId) {
if ($iNextId && $oNextElement = umiHierarchy::getInstance()->getElement($iNextId)) {
$iNextParent = intval($oNextElement->getRel());
if ($this->checkIfFeedable($iNextParent)) {
$result[] = $iNextId;
}
}
}
//
$t = new umiXmlExporter();
$t->setElements($result);
$t->run();
$src = $t->getResultFile();
$xmldata = DomDocument::loadXML($src);
//echo "[".($xmldata->asXML())."]";
$xslt = new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load($sXslPath));
$resultXml = $xslt->transformToXML($xmldata);
//echo "[".$resultXml."]";
header("Content-type: text/xml; charset=utf-8");
$this->flush($resultXml);
}
}
public function generateFeed($element_id, $xslPath) {
$sel = new umiSelection();
$sel->setLimitFilter();
$sel->addLimit($this->rss_per_page);
$sel->setHierarchyFilter();
$sel->addHierarchyFilter($element_id);
$result = Array($element_id);
$result = array_merge($result, umiSelectionsParser::runSelection($sel));
$t = new umiXmlExporter();
$t->setElements($result);
$t->run();
$src = $t->getResultFile();
$xmldata = DomDocument::loadXML($src);
$xslt = new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load($xslPath));
$resultXml = $xslt->transformToXML($xmldata);
header("Content-type: text/xml; charset=utf-8");
$this->flush($resultXml);
}
public function getRssMeta($element_id = false, $title_prefix = "") {
$element_id = $this->analyzeRequiredPath($element_id);
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "";
}
if(!$this->checkIfFeedable($element_id)) {
return "";
}
$element = umiHierarchy::getInstance()->getElement($element_id);
$element_title = $title_prefix . $element->getName();
return "<link rel=\"alternate\" type=\"application/rss+xml\" href=\"/data/rss/{$element_id}/\" title=\"{$element_title}\" />";
}
public function getRssMetaByPath($path, $title_prefix = "") {
if($element_id = umiHierarchy::getInstance()->getIdByPath($path)) {
return $this->getRssMeta($element_id, $title_prefix);
} else {
return "";
}
}
public function getAtomMeta($element_id = false, $title_prefix = "") {
$element_id = $this->analyzeRequiredPath($element_id);
if(!umiHierarchy::getInstance()->isExists($element_id)) {
return "";
}
if(!$this->checkIfFeedable($element_id)) {
return "";
}
$element = umiHierarchy::getInstance()->getElement($element_id);
$element_title = $title_prefix . $element->getName();
return "<link rel=\"alternate\" type=\"application/rss+xml\" href=\"/data/atom/{$element_id}/\" title=\"{$element_title}\" />";
}
public function getAtomMetaByPath($path, $title_prefix = "") {
if($element_id = umiHierarchy::getInstance()->getIdByPath($path)) {
return $this->getAtomMeta($element_id, $title_prefix);
} else {
return "";
}
}
public function checkIfFeedable($element_id) {
$element = umiHierarchy::getInstance()->getElement($element_id);
if(!$element) return false;
$hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($element->getTypeId());
$module = $hierarchy_type->getName();
$method = $hierarchy_type->getExt();
foreach($this->alowed_source as $allowed) {
if($module == $allowed[0] && $method == $allowed[1]) {
return true;
}
}
return false;
}
};
?>