Начал активно строить сайт на 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 действие, которых и так хватает.