Каталог вставок, доп. поля и информеры на тегах
Как вставить любой блок, список, число или форму модуля одним тегом, где работают дополнительные поля новостей и как показать чужую ленту на странице.
Каталог вставок: любой элемент модуля — одним тегом
Каждый модуль объявляет всё, что можно вынести на любую страницу и вставить в любое место файла тегов темы: готовые блоки, списки для своей вёрстки, числа, формы и кнопки. Это единый каталог: из него строятся вкладка «Вывод на сайте» в панели модуля (таблица элементов, параметры, пример и кнопка «Копировать», файлы видов), подсказки редактора шаблонов и страницы «Справки» о каждом модуле. Полный список элементов с готовым кодом смотрите на странице модуля в «Справке» (/help/modules/имя-модуля): он всегда совпадает с тем, что есть на вашем сайте.
Как вставляется:
- блок, форма, кнопка, число —
{block:модуль.имя параметр=значение}:{block:news.count what=news period=week}; параметров до четырёх; - список для своей вёрстки —
[each:list:модуль_имя:параметр:значение:…] … {item.поле} … [/each]:[each:list:news_latest:cat:3:sort:views:limit:5]; несколько значений — через «_», в имени списка «модуль_имя» (точка в имени тега не годится).
{block:news.count what=news period=week}
{block:subscribe.compact}
[each:list:shop_products:limit:4]<p>{item.title}</p>[/each]Элемент вида блок, кнопка и форма сам отвечает за экранирование своего вывода (через e() и виды движка, как любой вид); число и текст — только экранированный текст без разметки; список отдаёт строки, они экранируются тегами. Параметры проверяются по описанию элемента: число — в границах, выбор — только из списка, номера — только цифры; лишнее отбрасывается. Сбой, право, которого нет, превышение времени или размера — пустая вставка, страница цела. Старые теги (news_list…, {banner:5}, [each:comments]) продолжают работать.
Модуль объявляет элемент через фильтр theme.blocks: запись «модуль.имя» с полями kind (block, list, value, form, button), title, description, params, items, example, works_in, permission, render. Готовые блоки раскладки модулей (то, что модуль кладёт в места темы) попадают в каталог сами.
Безопасность тегов
- формы рисует только движок: в файле тегов тег form вычищается, поэтому ключ защиты и поля всегда на месте; форму выводит
{form}; - разметка шаблона очищается по белому списку: без скриптов, стилей, фреймов, обработчиков событий и атрибутов
data-*; адреса толькоhttp(s)://,/путь,#; - значения экранируются по месту (в тексте, в атрибуте, в адресе — по-разному);
- пределы те же, что у языка тегов: размер шаблона 20000 знаков, 400 тегов, вложенность 6, повторов 200;
- письма в файлах тегов не нужны: их тексты правятся в «Почта → тексты писем».
Дополнительные поля новостей: где работают
Поля заводятся в разделе «Доп. поля» (хозяин «Новости», можно ограничить рубриками). Пустое поле нигде не показывается: ни значение, ни подпись.
| Где | Что писать | Условие |
|---|---|---|
| Полная запись | {field:имя}, {fieldlabel:имя}, [if:field:имя], {fieldurl:имя} | поле видно этому читателю |
Карточка ленты (index.tpl.html, [each:cards]) | {item.field:имя}, {item.fieldlabel:имя}, {item.fieldurl:имя}, [if:item.field:имя] | галочка «в списке»; у закрытой записи (под паролем) полей нет |
Списки и блоки ([each:news_list …], [each:list:news_latest], {block:news.latest_box}) | те же теги с item. | то же |
| Отбор записей | [each:news_list field:год>2000 field:жанр=драма], custom=имя (заполнено), custom=имя is=значение | поле с галочкой «фильтр» (иначе список пуст, а не вся лента) |
| Значение ссылкой («Режиссёр: Нолан» → все записи с этим значением) | автоматически на странице записи; в списках — {item.fieldurl:имя} в адресе ссылки; адрес вида /news/рубрика?field=имя&value=значение | галочки «фильтр» и «значение ссылкой»; виды: строка, список-выбор, число, дробь |
| Поиск в панели | строка поиска по списку записей находит значения полей | галочка «поиск» |
| RSS | к описанию записи добавляется «Подпись: значение» | галочка «отдавать в RSS»; только публичные поля |
| Замена по сайту | «Поиск и замена» видит значения полей новостей | право на замену |
Адрес с field=…&value=… показывает над лентой плашку «Подпись: значение» и кнопку «Сбросить отбор». Закрытые поля (только для персонала, по ролям) тегами и в RSS не отдаются.
Информеры: чужие ленты на странице
В разделе «Контент → Информеры» владелец подключает ленту другого сайта (RSS, Atom или JSON) под коротким именем. Сайт показывает последнюю сохранённую копию и не ждёт чужой сервер; копию обновляют по расписанию. Вставляется блоком или списком в любое место любого вида:
| Что писать | Что выйдет |
|---|---|
{block:site.informer name=ИМЯ limit=5} | готовый список ссылок на записи ленты (text=1 — с кратким текстом) |
[each:list:site_informer_list:name:ИМЯ:limit:5] … [/each] | свой вид каждой записи |
В записи списка: {item.title} {item.url} {item.date} (по формату сайта) {item.date_iso} {item.text} (краткий текст, без разметки) {item.by} {item.category} {item.image} (адрес первой картинки; пусто, если её нет) {item.image2} {item.image3} (вторая и третья, если есть в ленте) {item.images_count} (сколько картинок, до трёх). Для источников JSON — ещё поля, названные владельцем ({item.поле}).
Что чужого приходит: только заголовок, ссылка, дата, краткий текст, автор, рубрика и адрес картинки — простым текстом и только по http(s). Сама картинка на сайт не копируется: браузер посетителя берёт её с чужого сервера, если тема выводит {item.image}. Ссылки идут с rel="nofollow noopener noreferrer ugc".
[each:list:site_informer_list:name:novosti:limit:3]
<article>[if:item.image]<img src="{item.image}" alt="" loading="lazy">[/if]
<a href="{item.url}" rel="nofollow noopener">{item.title}</a>
<small>{item.by} · {item.category} · <time datetime="{item.date_iso}">{item.date}</time></small></article>
[/each]