• Блог
  • Хранение элементов в файлах

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

Из основных преимуществ такого решения выделю следующие:

  • Элементы хранятся на диске, 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. Для программистов задача не сложная. А новичкам это пока рановато использовать.

В общем, пробуйте кому интересно.

Заключение

С чанками и сниппетами разобрались. С шаблонами тоже. Остались триггеры. О них поговорим с следующей статье.

0   6051

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.