Вывод новостей по сюжету

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 2.9.1

Задача

Стандартно в UMI.CMS у типа данных "Новость" есть поле "Сюжеты", также есть одноименный тип данных. У любой новости можно выбрать некоторое количество сюжетов:

Subject1.png

Есть макрос %news related_links()%, который выводит список последних новостей, связанных по сюжету с указанной новостью. А если мы просто захотим вывести все новости, у которых указан определенный сюжеты или сюжеты, то такого макрос в системе нет. Можно конечно указать у новости тег и вывести все страницы с указанным тегом, но это не самое красивое и удобное решение, особенно, если используете теги для других нужд.

Решение

В этой статье будет приведен макрос, решающий нашу задачу, но сначала нужно будет внести некоторые изменения в тип данных "Сюжет публикации", добавим в этот тип данных следующую группу полей и поле, обязательно с теми же идентификаторами:

Subject2.png

Для использования, приведённого ниже, макроса, нам нужно будет заполнить созданное поле у элементов справочника "Сюжет публикации", обязательно латинскими буквами, например так:

Subject3.png

А потом можно будет выбрать эти значения у новостей:

Subject4.png

Описание макроса

%news subjectsList()% — выводит новости, относящиеся к выбранн(ому)ым сюже(ту)там.

Параметры: news subjectsList($id, [$template = 'default', $mode = 'and', $per_page = 0, $ignore_paging = false])

$id

  Принимает идентификатор сюжета, поле, которое мы создали ранее. Можно указать несколько идентификатором через знак ";".

$template

  Принимает имя шаблона, по которому выводится результат макроса, если его не указать, то он принимает значение 'default' В XSLT-шаблонизаторе игнорируется.

$mode

  Принимаем два значения 'and' и 'or', когда выбрано 'and', макрос возвращает новости, среди сюжетов которых присутствуют указанные в параметре $id сюжеты,
  когда выбрано 'or', макрос возвращаем новости, у которых сюжеты полностью совпадают с указанными в параметре $id сюжетами. Если параметр не указать, то
  будет по-умолчанию равен 'and'.

$per_page

  Принимает число, которое обозначает максимальное количество новостей. Если этот параметр не указывать, будет взято значение, указанное в настройках модуля «Новости».

$ignore_paging

  Принимаем булево значение («1» или «0»), указывающее макросу игнорировать значение текущей страницы списка вывода (параметр http-запроса p). То есть, если указать «1», 
  макрос будет всегда выводить только первую страницу списка новостей.

Для применения этого макроса скопируйте содержимое листинга макроса в файл /classes/modules/news/__custom.php, и не забудьте указать имя метода в permissions.custom.php, то есть создать такой файл в директории /classes/modules/news/ со следующим содержимым:

<?php
   $permissions = array(
	'view' => array(
			'subjectsList'
		)
	);
?>

Листинг макроса

Применение в xslt

Применение в tpl