Принципы шаблонизации MODX
Установка сайта
-
Скачать дистрибутив с официального сайта
-
Распаковать и залить на хостинг
-
Открыть свой сайт, добавив /setup/, типа mysite.com/setup/
-
Дальше следовать вопросам установщика: логин и пароль для БД, админа и т.п.
-
В принципе, всё.
-
Логин: test
-
Пароль: test**
Теория шаблонизации
<?php
$output = '';
while ($row = mysql_fetch_assoc($res)) {
$output .= "<td>{$res[id]}</td><td>$row[name]</td>";
}
echo $output;
<?php
$tpl = file_get_contents('my.tpl');
$output = '';
while ($row = mysql_fetch_assoc($res)) {
$placeholders = array('[[+id]]', '[[+name]]');
$values = array($res['id'], $row['name']);
$output .= str_replace($placeholders, $values, $tpl);
}
echo $output;
<td>[[+id]]</td><td>[[+name]]</td>
$output = '';
while ($row = $res->stmt->fetch(PDO::FETCH_ASSOC)) {
$output .= $modx->getChunk($tpl, $row);
}
return $output
Шаблонизация MODX
-
Ресурс - страница сайта, которая создаётся в админке и выводится пользователям.
-
Элемент - группа служебных сущностей, необходимых для гибкой работы сайта: шаблоны, чанки, сниппеты и ТВ параметры.
-
Шаблон - html оформление страница сайта, то есть ресурсов. Может включать в себя теги MODX.
-
Чанк - кусок чистого html кода, который может включать в себя теги MODX.
-
Сниппет - кусок чистого php кода, не включает в себя теги MODX.
-
Плагин - кусок чистого php кода, можно сказать сниппет, который вызывается при разных системных событиях. Его нельзя вызвать вручную в шаблоне или чанке, он вызывается системой при определенном событии.
-
ТВ параметр - дополнительное поле ресурса, расположенное в отдельной таблице базы данных.
-
Категория - это группа
-
Теги MODX - любые слова, заключенные в квадратные скобочки [[ и ]].
-
[[*tag]] - тег поля ресурса, например заголовка или содержимого страницы. Это всегда значение текущей страницы.
-
[[+tag]] - плейсхолдер, предназначенный для заполнения какими-то данными при работе сниппета, например вывод дочерних ресурсов. Это всегда значение не текущей страницы, а чего-то другого.
-
[[%tag]] - запись из системного словаря, меняет свое значение в зависимости от языка сайта.
-
[[~id]] - ссылка на страницу, принимает id этой самой страницы.
-
[[~[[*id]]]] - комбинированный плейсхолдер, то есть поле страницы вложено в ссылку и мы получаем ссылку на текущую страницу.
-
[[++tag]] - системные настройки, например имя сайта, или язык.
-
[[!*tag]] - некэшированный тег, он откладывается парсером в сторонку обрабатывается в последнюю очередь. К любому теги нужно приставить восклицательный знак.
-
[[-*tag]] - отключенный тег, не обрабатывается движком. К любому тегу нужно приставить тире.
-
[[#tag]] - хитрые теги FastField, которых нет в MODX по умолчанию, для них нужно установить pdoTools или FastField.
-
Приходит запрос на открытие страницы сайта.
-
MODX ищет эту страницу и если находит - загружает требуемый ресурс, а если нет - берет в работу страницу 404 not found.
-
Если у страницы есть шаблон (99.9% случаев), MODX загружает его и ищет в нем свои теги.
-
Кэшированные теги разбираются сразу, некэшированные оставляются на потом.
-
Исходя их синтаксиса тега, MODX загружает нужные чанки и сниппеты, а также подставляет данные текущего ресурса в шаблон.
-
Нужно всегда помнить, что парсер MODX рекурсивный, поэтому после каждой операции выставления новых данных в теги, MODX смотрит, не осталось ли еще на странице двойных скобочек. Если да, то крутим процесс по кругу, пока не будут обработаны все кэшированные плейсхолдеры, или не достигнем системного лимита (по умолчанию - 10 кругов).
-
MODX обработал всё, что смог. Информация из ресурса вставлена в шаблон - вывод оформлен и сохранён в кэш. В следующий раз кэшированные теги мы обрабатывать не будем - загрузим из кэша.
-
Теперь еще 10 раз разбираем оставшиеся некэшированные теги, которые с восклицательным знаком. Если уложимся за меньше число раз - ура! Эту операцию мы проводим при каждой загрузке страницы, в кэш она не попадает.
-
Дальше выставляем служебные плейсхолдеры со временем генерации страницы, количеством запросов к БД и т.д.
-
Отдаём страницу пользователю. Ту, что он запросил, или 404, если мы не нашли подходящую.
<html>
<head>
<title>[[++site_name]] - [[*pagetitle]]</title>
<base href="[[++site_url]]" />
</head>
<body>
[[*content]]
</body>
</html>