Настройка 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(...). Дополнительная информация по фильтрации:

umiSelection

Выборки с помощью umiSelection