Настройка rss ленты
Материал из Umicms
На данный момент (2.8.1.3) каких-либо настроек для rss ленты нет, поэтому чтобы изменить поведение формирования rss ленты воспользуемся кастомным макросом, созданным на основе макроса data getRssMeta(). В файле classes/modules/data/__custom.php, пропишем три метода:
public function getRssMetaNew($element_id = false, $title_prefix = "") { $element_id = def_module::analyzeRequiredPath($element_id); if(!umiHierarchy::getInstance()->isExists($element_id)) { return ""; } $ini = cmsController::getInstance()->getModule('data'); if(!$ini->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/rss2/{$element_id}/\" title=\"{$element_title}\" />"; } public function rss2() { $rss_per_page = 10; $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%"; } $xslPath = "xsl/rss2.xsl"; $hierarchy = umiHierarchy::getInstance(); $sel = new umiSelection(); $sel->addLimit($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 custompars($object_id) { $object = umiObjectsCollection::getInstance()->getObject($object_id); if(!$object) return ""; $cotent = $object->getValue('anons'); return templater::getInstance()->parseInput($cotent); }
В этой же папке classes/modules/data/ создадим файл permissions.custom.php следующего содержания:
<?php
$permissions = Array('main' => Array('getRssMetaNew', 'rss2', 'custompars'));
?>
Также необходимо в папке /xsl/ создать копию файла rss.xsl и переименовать в rss2.xsl. В методе rss2 (файл __custom.php) можно указать количество отбираемых элементов, переменная $rss_per_page. Закомментировав метод addLimit() можно снять ограничение по лимиту:
// $sel->addLimit($rss_per_page);
В переменную $src записываются XML-данные в формате UmiDump1.0, потом с помощью шаблона $xslPath = "xsl/rss2.xsl" происходит трансформация данных в rss формат, другой вариант XML-данных.
По умолчанию, если в анонсе новости присутствуют подобные макросы: %data getProperty(45, h1)%, то они не отработаются, т.е. останутся в тексте как обычный текст. Для исправления этой неточности, в файл __custom.php был добавлен метод custompars($object_id), в него можно передать object_id новости и на выходе метода получим значения поля 'anons' с выполненными макросами. Чтобы воспользоваться данный макросом, необходимо в файле /xsl/rss2.xsl заменить строку:
<description><xsl:value-of select="key('property', concat(@id, 'anons'))/values/value"/></description>
на:
<description><xsl:value-of select="document(concat('udata://data/custompars/', @id))"/></description>
В шаблоне страницы необходимо переписать вызов макроса data getRssMeta(), новый вызов (для tpl шаблона):
%data getRssMetaNew(%pid%)%
В методе rss2 можно соединить в один поток несколько новостных лент, добавив с помощью addHierarchyFilter() дополнительные разделы:
$sel->addHierarchyFilter(array($element_id, 45, 78));
где 45, 78 - дополнительные Ленты новостей.
Дополнительные разделы необходимо включить также в $result = array_merge(...). Дополнительная информация по фильтрации:
