Начал активно строить сайт на modx revolution. Хранение элементов в базе данных — это конечно замечательно, но на начальном этапе мешает. Причём хранение элемента в статическом файле конечно помогает, но на начальном этапе элементы приходится ещё и создавать. Было бы удобнее «объединить» эти процессы, ИМХО.



Чем я и занялся, начав писать плагин (template variable-ы и категории оно не подхватывает, но, ИМХО — это нужно куда меньше — с шаблонами/чанками/сниппетами я этим занялся в первую очередь из-за редактора)


Вообще — первый плагин для modx, так что буду благодарен, если кто-то подскажет какие моменты стоит исправить/улучшить. И, разумеется его стоит использовать только для собственных элементов, так как иначе после обновления элемент будет затёрт старым вариантом.


Страница плагина на github — здесь. Для работы плагина понадобится добавить настройку elements_path, например — assets/elements. В указанной директории могут находится директории templates, plugins, snippets, chunks, в каждой из которых — по файлу elements.php со списком элементов и их параметров.


Пример для шаблона:
templates/elements.php

<?php
/*
 * В качестве параметров можно указать и другие элементы массива. Они будут сохранены в таблице site_templates
 * В таком варианте будет считан blogMainPage.html из одной директории с elements.php, а его содержимое размещено в поле content
 */
$elements['Blog main page'] = array(
  'file' => 'blogMainPage.html'
);
?>

templates/blogMainPage.html
код шаблона
<!DOCTYPE html>
<html>
[[!htmlHead ?
  &style_files=`blog-main.less`
  &title=`[[*pagetitle]] - [[++site_name]]`
]]
<body>
  <div id="wrapper">
  [[$page header]]
    <div class="main">
    <main role="main" class="blog-main">
      <article>
      <header>
      </header>
        [[*content]]
      </article>
        <section id="posts">
        [[!getResourcesTag?
        &element=`getResources`
        &elementClass=`modSnippet`
          &tpl=`blog post preview`
        &hideContainers=`1`
        &pageVarKey=`page`
        &parents=`[[*id]]`
        &includeTVs=`1`
        &includeContent=`1`
        ]]
        [[!+page.nav:notempty=`
       <div class="paging">  
          <ul class="pageList">  
          [[!+page.nav]]  
          </ul>  
        </div>
      `]]
      </section>
    </main>
    [[$page footer]]
  </div>
  [[$page sidebar]]
  </div>
  [[!scripts ? files=`assets/theme/scripts/jquery.js;assets/theme/scripts/main.js` ]]
</body>
</html>



Для сниппетов/чанков аналогично, для плагина кроме файла и полей в site_plugins указать события при которых он выполнится.
plugins/elements.php

<?php

$elements['Files2Elements'] = array(
  'file' => 'Files2Elements.php',
  'events' => array(
      array(
        'event' => 'OnCacheUpdate'
      )
    )
);


Касательно событий при которых плагин выполнится (в смысле этот плагин) — я считаю, что также есть смысл указать кроме OnCacheUpdate ещё и OnWebPageInit — тогда, при входе, например не на domain/uri, а на domain/uir?update=templates обновятся шаблоны, а на domain/uri?update=all — всё. Иначе, ИМХО — бессмысленно — надо чистить кеш, а это ещё 1 действие, которых и так хватает.