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

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

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

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

    Заключение

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

    12 мая 2016, 21:16   2358     0

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

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

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