среда, 16 января 2008 г.

задание шаблона по умолчанию для дочерних документов определенного родителя

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

В последних версиях MODx появился плагин Inherit Parent Template, с помощью которого можно было создать неопубликованный контейнер и задать ему нужный шаблон, тогда все дочерние документы наследовали этот шаблон. Однако этот способ вынуждал делать лишние контейнеры для каждой категории и создавать иерархию меню отдельно от документов контента.

Итак, хочу представить более менее приемлемое решение. Мы немного изменим вышеупомянутый плагин, чтобы задать родительские документы, новые(!) дочерние документы которых будут автоматически принимать заданный шаблон. Сразу оговорюсь, в моем случае пришлось задавать суперродителей (родителей родителей), однако закомментировав одну строку плагина вы можете иметь возможность задавать просто родителей.

Код нового плагина "Inherit Parent Template" (его можно просто заменить поверх старого):
/*
* Inherit Template from Parent
* Written By Raymond Irving - 12 Oct 2006
*
* Simply results in new documents inherriting the template
* of their parent folder upon creating a new document
*
* Configuration:
* check the OnDocFormPrerender event
*
* Version 1.0
*
*/



global $content;
$e = &$modx->Event;

$parents_and_templates = array (
'4818' => '5', // id родителя => id шаблона (можно посмотреть в БД)
'4817' => '6'
);

switch($e->name) {
case 'OnDocFormPrerender':
if(($_REQUEST['pid'] > 0) && ($id == 0)) {
$parent = $modx->getPageInfo($_REQUEST['pid'],0,'id, parent, template');
$parent = $modx->getPageInfo($parent['parent'],0,'id, parent, template'); //закомментируйте эту строку, если вам нужен родитель первого уровня
$pid = $parent['id'];
if (array_key_exists($pid,$parents_and_templates)) {
$content['template'] = $parents_and_templates[$pid];
}
else {
$content['template'] = $parent['template'];
}
}
break;

default:
return;
break;
}

задать родительский документ и соответствующий шаблон можно в массиве
$parents_and_templates = array (
'4818' => '5',
'4817' => '6'
);

4 комментария:

Анонимный комментирует...

Примерно тоже самое додумался сделать сам на базе существующего плагина наследования шаблона документа...

Логичным продолжением было бы сделать доп поле (раскрывающийся список) "Дефолтный шаблон" или хотя бы через TV...

(как это сделано в DJEM meta-CMS)

А то, не очень удобно всё-таки...

Анонимный комментирует...

Добрый день.
Работает ли данный плагин на 0962rc2? К сожаленю не получил результата.

Анонимный комментирует...

Сорри, не заметил в коде, что нужно закомментить строку, если парент 1го уровня

Андрей комментирует...

@Lord Daedra
Это уже реализованно в плагине Inherit Selected Template.
Очень рекомендую к использованию!