Настройка rss ленты
На данный момент (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() дополнительные разделы, включив их также в $result = array_merge(...). Дополнительная информация по фильтрации: