Хранение элементов в файлах
Пару дней экспериментирую над реализацией идеи хранения всех элементов в файлах, т.е. чтобы чанки, сниппеты, плагины и шаблоны подгружались на страницу из файлов и для работы с ними не нужно было бы заходить в админку. Решение по чанкам и сниппетам можно почитать тут.
Из основных преимуществ такого решения выделю следующие:
- Элементы хранятся на диске, MODX не нужно обращаться за ними в базу данных. Что экономит время.
- При изменении элемента кэш сайта не сбрасывается — результат виден сразу, и на время загрузки страницы это никак не влияет.
- Разработку можно вести в любимом редакторе со всеми удобствами ввиде подсказок и контроля ошибок.
- Теперь удобно искать вызовы чанков и сниппетов простым поиском в редакторе.
- Вся разработка в админке скрыта от посторонних глаз.
Несколько примеров для шаблонов
Вариант 1.
Один пример шаблона я уже приводил в выше указанной статье про чанки. Он выглядит приблизительно так:
<!DOCTYPE html> <html lang="ru"> <head> {'head.html' | chunk} </head> <body> {'navbar.html' | chunk} <div class="main-wrapper"> {'crumbs.html' | chunk} <div class="container"> <div class="row"> <article class="col-sm-8"> <header class="page-header"> <h1 class="page-title">[[*longtitle]]</h1> </header> [[*content]] </article> <!-- Sidebar --> <aside class="col-sm-4 sidebar sidebar-right"> {'widgets/user.html' | chunk} {'widgets/search.html' | chunk} {'widgets/tags.html' | chunk} {'widgets/relatedArticles.html' | chunk} </aside> </div> </div> </div> {'footer.html' | chunk} </body> </html>
Тут принцип разработки остаётся прежним — для каждого ресурса указывается свой шаблон. Чанки и сниппеты грузятся из файла, но доступ извне к шаблону закрыт. Чтобы его изменить, придётся идти в админку.
Вариант 2.
В этом случе мы можем работать уже с файлом шаблона. Количество шаблонов остается таким же, но в самом шаблоне мы делаем только вызов чанка, в котором будет содержаться код шаблона. Т.е. в админке создаем нужные шаблоны и связываем их с файлами:
{'main.html' | chunk : ['tplPath'=>'core/elements/templates']}
Теперь мы спокойно можем работать с шаблонами через редактор. За определение шаблона для каждого ресурса по преждему отвечает MODX. Я использую именно этот вариант.
Вариант 3.
Ну и последний вариант — это вынесение всей логики в файл. В данном случае для всех ресурсов мы используем только один шаблон, в котором вызывается сниппет (контроллер), определяющий внешний вид. Назовём его gettemplate и передадим ему массив с данными текущего ресурса.
{'gettemplate' | snippet : ['resource'=>$_modx->resource]}
Сам файл сниппета создадим в core/elements/snippets/gettemplate.php и выглядет он может приблизительно так
<?php $output = ''; // Указываем для pdoTools свой путь до файла (решение костыльное, но по другому путь не передать) $pdoTools->config['tplPath'] = 'core/elements/templates'; // Прописываем логику, по которой будет определятся шаблон. // Можно по id ресурса, можно по parent, можно по классу или еще по каким условиям. switch (true) { // Сначала индивидуально для каждой страницы case in_array($resource['id'], array(1)): // Проверяем id документа $output = $pdoTools->parseChunk('@FILE main.html'); break; case in_array($resource['id'], array(7)): $output = $pdoTools->parseChunk('@FILE contacts.html'); break; // Потом по группам. Если документ переместить в другого родителя, то автоматически поменяется и шаблон. case in_array($resource['parent'], array(2,3)): // Проверяем parent документа $output = $pdoTools->parseChunk('@FILE services.html'); break; case in_array($resource['parent'], array(4,5)): $output = $pdoTools->parseChunk('@FILE news.html'); break; default: $output = '[[*content]]' // Пустой шаблон - выводится только контент ресурса. break; } // Стираем наш путь, чтобы он не мешал другим. $pdoTools->config['tplPath'] = null; return $output;
В файлах шаблонов прописываем обычное содержание, как в первом примере. И теперь вы можете определять шаблон для каждого ресурса.
Важно понимать, что такой шаблон кэшироваться не будет, как и все элементы, загружаемые из файлов. На своём сайте, я разницы в скорости загрузки страницы не заметил. На уровне погрешности оно на некоторых страницах даже уменьшилось. Но если у кого-то трудятся тяжёлые сниппеты, то кэширование надо взять в свои руки. Благо для этого есть много возможностей — в pdoTools есть методы setStore()/getStore()
и setCache()/getCache()
(документация). Можно использовать и методы встроенного CacheManager. Для программистов задача не сложная. А новичкам это пока рановато использовать.
В общем, пробуйте кому интересно.
Заключение
С чанками и сниппетами разобрались. С шаблонами тоже. Остались триггеры. О них поговорим с следующей статье.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()