Оглавление

Что такое шаблон в MODx?

Шаблоны в MODx обычно содержат теги HTML-разметки, которые определяют макет и внешний вид либо вашего сайта полностью, либо страниц сайта отдельно, в зависимости от выбранного шаблона. Когда запрашивается документ MODx загружает его шаблон. Затем парсер MODx находит все плейсхолдеры в шаблоне и заменяет их соответствующими значениями из документа перед отправкой готовой страницы в браузер пользователя.

Ресурсы могут использовать только один шаблон за раз, однако можно переключать шаблоны в любое время. Делать это можно как вручную, так и автоматически, написав, например плагин. Простой пример скрипта, который найдет все ресурсы с шаблоном id=1 и заменит на шаблон id=2.

<?php
/**
 * @author iWatchYouFromAfar https://webinmind.ru
 * Изменение всех ресурсов с шаблоном $oldTemplate на шаблон $newTemplate
 *
 */

$start = microtime(true);

$oldTemplate = 1; // идентификатор старого шаблона
$newTemplate = 2; // идентификатор нового шаблона

$resources = $modx->getCollection('modResource',array('template' => $oldTemplate));

foreach ($resources as $res) {
    if ($res->get('template') == $oldTemplate) {
        $res->set('template', $newTemplate);
        $res->save();
    }
}

// Clear cache
$modx->cacheManager->clearCache(array(
    '/resource/'
));

echo 'Всего ресурсов изменено: ' . count($resources). '<br>';
echo 'Время выполнения скрипта: ' . round(microtime(true) - $start, 4).' сек.';

Создание шаблона

Чтобы создать шаблон, разверните вкладку дерева «Элементы» и щелкните правой кнопкой мыши на раздел «Шаблоны». Выберите «Быстро создать шаблон» или «Новый шаблон», затем вставьте свой HTML-код в текстовое поле «Код шаблона».

Простой пример шаблона MODx:

<!doctype html>
<html lang="ru">
<head>
    <title>[[*pagetitle]]</title>
    <meta name="description" content="[[*description]]"/>
</head>
<body>
<h1>[[*longtitle]]</h1>

Идентификатор страницы: [[*id]]<br/>
Анонс: [[*introtext]]<br/>
Menu Title: [[*menutitle]]

<hr/>

[[*content]]

</body>
</html>

Обратите внимание на важный тег [[*content]]. Этот тег сообщает MODx, куда поместить содержимое ресурса.

MODx по умолчанию хранит шаблоны в своей базе данных, если вы используете версию до 2.2.x, это ваш единственный вариант. В MODX 2.2.x и новее, у вас есть возможность сохранять шаблоны в виде статических файлов с использованием Media Sources.

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

Шаблоны могут содержать любые теги, в том числе Дополнительные поля (TV), Чанки, Сниппеты и другие.

Использование полей ресурса в шаблоне

Как вы заметили из примера кода шаблона выше, на поля ресурса можно ссылаться, используя синтаксис [[*fieldName]]. Список доступных полей ресурсов можно найти здесь. Например, если мы хотим вывести заголовок текущего ресурса в теге <title>, мы просто сделаем так:

<title>[[*pagetitle]]</title>

Вы также можете вывести содержимое текущего ресурса, используя тег [[*content]]:

<body>
[[*content]]
</body>

Это обычные теги MODx и к ним могут быть применены фильтры модификаторы. Например, допустим, мы хотим отобразить поле «introtext» на правой панели, но убрать из него любые HTML-теги и отобразить только первые 400 символов — и, если это поле длиннее, добавить многоточие «…»:

<div class="rightbar">
[[*introtext:stripTags:ellipsis=`400`]]
</div>

Дополнительные поля (TV) в шаблонах

Вы можете иметь бесконечное количество дополнительных полей в шаблоне. Скажем, вам нужно поле для фотографий в ваших ресурсах в шаблоне «BiographyPages». Просто — просто создайте TV, назовите его «bioPhoto», присвойте ему тип ввода и вывода «image» и назначьте его шаблону «BiographyPages». Затем вы увидите этот TV в любом ресурсе, который использует этот шаблон.

Затем вы можете ссылаться на ваш TV «bioPhoto» в вашем контенте с тем же синтаксисом тега, что и в поле ресурса:

<div class="photo">
[[*bioPhoto]]
</div>

Опять же, важно отметить, что TV поля должны быть явно назначены шаблону, который будет использоваться. Если вы не видите созданный вами TV в своих ресурсах, убедитесь, что вы назначили для этого TV нужный шаблон.