Как задать шаблон ресурсу, исходя из родительского шаблона
Готовое решение для установки шаблона создаваемого ресурса, исходя из шаблона родительского ресурса.
Оглавление
Представим ситуацию, когда вам нужно всем ресурсам при их создании или сохранении, устанавливать определённый шаблон, основываясь на шаблоне родительского ресурса. Например, у родительского ресурса указан шаблон с идентификатором — 1, значит дочернему ресурсу нужно установить шаблон с идентификатором 2.
Этого можно добиться написав плагин на событие OnDocFormRender
.
Пишем плагин
Создайте плагин с любым именем и во вкладке «Системные события», поставьте галочку напротив события OnDocFormRender
. После этого пишем сам плагин:
<?php
if ($modx->event->name == 'OnDocFormRender') {
// Значение нового шаблона
$newTpl = 2;
// Получаем объект родительского ресурса
$parent = $resource->Parent;
// Если у ресурса есть родитель
if ($parent) {
// Получаем идентификатор его шаблона
$parentTpl = $parent->get('template');
// Сравниваем
if ($parentTpl == 1) {
// Если условие сработало, для ресурса устанавливаем новый шаблон
$resource->set('template', $newTpl);
}
}
}
В этом случае, при открытии дочернего ресурса значение в поле шаблон поменяется автоматически (конечно если совпадут условия), но сам ресурс не сохранится, пока вы не сохраните его самостоятельно.
Автоматическое сохранение ресурса
Вы можете дописать в плагин одну строчку и сохранять ресурс автоматически:
<?php
if ($modx->event->name == 'OnDocFormRender') {
$newTpl = 2;
$parent = $resource->Parent;
if ($parent) {
$parentTpl = $parent->get('template');
if ($parentTpl == 1) {
$resource->set('template', $newTpl);
// Сохраняем ресурс автоматически, если сработало условие
$resource->save();
}
}
}
Но я не советую это делать, т. к. автоматическое сохранение не всегда хорошо. Да и в варианте с плагином выше, автоматическое сохранение будет срабатывать всегда, даже если правильный шаблон уже задан.
Продвинутая версия плагина
У события OnDocFormRender
есть параметр mode
, который может нам помочь определить новый ресурс мы создали, или редактируем уже существующий. Исходя из значения этого параметра, мы можем написать любую удобную нам логику плагина:
<?php
if ($modx->event->name == 'OnDocFormRender') {
$newTpl = 2;
$parent = $resource->Parent;
if ($parent) {
$parentTpl = $parent->get('template');
if ($parentTpl == 1) {
// Если ресурс новый
if ($mode === 'new') {
// Устанавливаем шаблон но не сохраняем
$resource->set('template', $newTpl);
// Если редактируем ресурс
} elseif ($mode === 'upd') {
// Проверяем его текущий шаблон и если он не равен нужному
if ($resource->get('template') != $newTpl) {
// Устанавливаем шаблон и сохраняем ресурс
$resource->set('template', $newTpl);
$resource->save();
}
}
}
}
}
В версии плагина выше, мы сначала проверяем что ресурс новый и если это так, устанавливаем ему нужный шаблон, но сам ресурс не сохраняем автоматически. Иначе, если ресурс не новый (т.е. мы редактируем уже сохраненный ресурс), сверяем значение идентификатора его шаблона с нужным нам и если оно не соответствует, устанавливаем его и сохраняем ресурс автоматически.
Эпилог
Еще раз — будьте очень осторожны с автоматически сохранением чего-либо. Бывает так, что в данный момент это удобное и идеальное решение. Но в дальнейшем, оно может создать массу проблем. Особенно когда с сайтом работаю менеджеры, для которых такое поведение сайта может быть воспринято как ошибочное.
Время запросов: 0,1044 s
Количество запросов: 28
Источник: cache