Дата публикации
21 Апреля 2020
Дата изменения
21 Апреля 2020
Уникальных просмотров
873

Оглавление

Представим ситуацию, когда вам нужно всем ресурсам при их создании или сохранении, устанавливать определённый шаблон, основываясь на шаблоне родительского ресурса. Например, у родительского ресурса указан шаблон с идентификатором — 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,1106 s
Время запросов: 0,1106 s
Количество запросов: 28
Источник: cache