
Мне никогда не нравилось создавать несколько шаблонов для того, чтобы настроить такое отображение. Хотя, конечно, это логичное решение. Но в MODX выбор шаблона остаётся на откуп контент-менеджера. Поэтому возникает путаница. Кроме того клиенты начинают спрашивать «Я создал новый ресурс, а вместо текста отображается что-то другое». Чтобы такого избежать приходится настраивать, например, автоматический выбор шаблона (при создании статей или проектов в портфолио).
Одним из решений этой проблемы может быть вот такой чанк контентной части шаблона:
{var $default_content = true}
<!-- Проверяем ID ресурса -->
{switch $_modx->resource.id}
{case 1}
{include 'content_main'}
{var $default_content = false}
{case 10}
{include 'content_about'}
{var $default_content = false}
{case 28}
{include 'content_portfolio'}
{var $default_content = false}
{case 30}
{include 'content_blog'}
{var $default_content = false}
{/switch}
<!-- Проверяем родителя ресурса -->
{switch $_modx->resource.parent}
{case 30}
{include 'content_blog_item'}
{var $default_content = false}
{/switch}
<!-- Если ни одно из условий не сработало,
выводим обычную текстовую страницу -->
{if $default_content}
{include 'content_default'}
{/if}Здесь используется синтаксис Fenom, так что у вас должен быть установлен pdoTools, и включена соответствующая настройка.
В этом чанке мы сами определяем, какой раздел и каким образом показывать. Клиент или контент-менеджер ничего не сломают — ведь если ни одно условие не выполняется (когда, например, создаётся новый раздел), будет выведен стандартный чанк, например, текстовой страницы.
Таким образом шаблонов у нас, всё-таки, несколько. Только шаблонами тут являются чанки, отвечающие за контент определённых страниц, а объект «Шаблон» у нас один для всех страниц.
Объектная
{if $docid == 4} {$_modx->getChunk('delivery')} {/if} {if $docid == 9} {$_modx->getChunk('contacts')} {/if}Как раз думал на switch поменять, т.к. такое представление удобнее, но оставил т.к. есть запуски сниппетов и т.п., с If читается лучше. В моём случае + имхо, конечно.Теперь снова задумался )
Спасибо!
{$_modx->getChunk('content.'~$_modx->resource.id)}И если есть чанк у данной страницы типа content.5, то он автоматом подставляется.Из проекта в проект схема незначительно меняется в зависимости от особенностей проекта, но суть остаётся прежней — минимум шаблонов и стандартизированные чанки контента.
то читабельность ужасная
По сути если хорошо всё организовать, то ею тоже можно пользоваться:
1. Чётко структурировать по папкам эти чанки
2. В описании чанка вписывать название страницы, чтобы при наведении на чанк оно показывалось.
3. На фронте написать маленький сниппет, который проверяет, есть ли у текущей страницы чанк с таким именем и выводить кнопку редактирования именно этого чанка.
Уже давно пользуюсь таким образом на нескольких больших сайтов, где другая конструкция увела бы в никуда, и пока всё работает… =)
А можно например, если имеется 3 уровня меню, сделать такую конструкцию?
{set $a = [$id]} {if $_modx->resource.parent in list $a} {'!pdoMenu' | snippet : [ 'parents' => $_modx->resource.id, 'level' => '1', 'tplOuter' => '@INLINE <div style="padding: 15px; text-align: center!Important;">{$wrapper}</div>', 'tpl' => '@INLINE <h2 style="padding: 15px; margin:0; display: inline-block; font-size:20px;" class="text_bold"> <a href="{$link}">{$menutitle}</a> </h2>{$wrapper}' ]} {elseif $_modx->resource.parent in list $a} {'!pdoMenu' | snippet : [ 'parents' => $_modx->resource.parent, 'level' => '1', 'tplOuter' => '@INLINE <div style="padding: 15px; text-align: center!Important;">{$wrapper}</div>', 'tpl' => '@INLINE <h2 style="padding: 15px; margin:0; display: inline-block; font-size:20px;" class="text_bold"> <a href="{$link}">{$menutitle}</a> </h2>{$wrapper}' ]} {else} {'!pdoMenu' | snippet : [ 'parents' => 'продедушка', 'level' => '1', 'tplOuter' => '@INLINE <div style="padding: 15px; text-align: center!Important;">{$wrapper}</div>', 'tpl' => '@INLINE <h2 style="padding: 15px; margin:0; display: inline-block; font-size:20px;" class="text_bold"> <a href="{$link}">{$menutitle}</a> </h2>{$wrapper}' ]} {/if}Как можно получить про дедушку ресурса на котором находишься?... {elseif ($_modx->resource.parent | resource : "parent") in list $a} ...{set $a = [$id]} {if $_modx->resource.parent in list $a} {'!pdoMenu' | snippet : [ 'parents' => $_modx->resource.id, 'level' => '1', 'tplOuter' => '@INLINE <div style="padding: 15px; text-align: center!Important;">{$wrapper}</div>', 'tpl' => '@INLINE <h2 style="padding: 15px; margin:0; display: inline-block; font-size:20px;" class="text_bold"> <a href="{$link}">{$menutitle}</a> </h2>{$wrapper}' ]} {elseif $_modx->resource.parent in list $a} {'!pdoMenu' | snippet : [ 'parents' => $_modx->resource.parent, 'level' => '1', 'tplOuter' => '@INLINE <div style="padding: 15px; text-align: center!Important;">{$wrapper}</div>', 'tpl' => '@INLINE <h2 style="padding: 15px; margin:0; display: inline-block; font-size:20px;" class="text_bold"> <a href="{$link}">{$menutitle}</a> </h2>{$wrapper}' ]} {elseif ($_modx->resource.parent | resource : "parent") in list $a} {'!pdoMenu' | snippet : [ 'parents' => $_modx->resource.parent, 'level' => '1', 'tplOuter' => '@INLINE <div style="padding: 15px; text-align: center!Important;">{$wrapper}</div>', 'tpl' => '@INLINE <h2 style="padding: 15px; margin:0; display: inline-block; font-size:20px;" class="text_bold"> <a href="{$link}">{$menutitle}</a> </h2>{$wrapper}' ]} {else} {'!pdoMenu' | snippet : [ 'parents' => ($_modx->resource.parent | resource : "parent"), 'level' => '1', 'tplOuter' => '@INLINE <div style="padding: 15px; text-align: center!Important;">{$wrapper}</div>', 'tpl' => '@INLINE <h2 style="padding: 15px; margin:0; display: inline-block; font-size:20px;" class="text_bold"> <a href="{$link}">{$menutitle}</a> </h2>{$wrapper}' ]} {/if}3 уровня меню в одном шаблоне.