Разделы

MODx Revolution Plugin: ChangeTemplate

ChangeTemplate это плагин для MODx Revolution (2.2.0-pl2). Этот плагин является особенно полезным, когда мы должны контролировать, какие Шаблон наследуется детьми в документах родителя.
С ChangeTemplate пользователю не нужно помнить, какой выбрать шаблон, потому что это делается автоматически с помощью плагина.
Нашел на форуме. может кому и пригодится.
1. Установка
Для установки плагина ChangeTemplate перейдите в раздел «Элементы> Plugins> Новый плагин» и создайте:
Имя плагина: ChangeTemplate
Системные события: OnDocFormRender
Код плагина
<?php
/**
* =========================
* ChangeTemplate
* =========================
*
* Plugin for MODX Revolution
* Set which template is inherited by children 
* documents of a certain parent document
*
* Author:
* Marc Loehe (boundaryfunctions)
* marcloehe.de
*
* Modified by:
* Lorenzo Stanco <lorenzo.stanco@gmail.com>
* Lorenzostanco.com
*
* Usage:
*
* 1. Paste this as new plugin and connect it to system event
* 'OnDocFormRender'.
*
* 2. Assign a new TV 'changeTemplate' to each template
* for which you want to define the default children template.
*
* 3. Set the newly created TV to input type "Text" 
*
* 4. Open a document and in the 'changeTemplate' TV type a 
* comma separated list of template IDs.
*
* 5. Have fun!
*
*/
 
// Check Event
if ($modx->event->name == OnDocFormRender && $mode == modSystemEvent::MODE_NEW) {
   
  // Get current document ID
  if ($id = $_REQUEST['id']) {
 
    // Document Chain
    $resources = array($id);
 
    // Get parent ID
    foreach ($modx->getParentIds($id, 10, array('context' => $_REQUEST['context_key'])) as $parentId) {
      if ($parentId) array_push($resources, $parentId);
    }
     
    // Search changeTemplate in the chain
    $level = 0;
    $childTemplates = array();
    foreach ($resources as $resourceId) {
      $resource = $modx->getObject('modResource', $resourceId);
      if ($childTemplatesTV = $resource->getTVValue('changeTemplate')) {
         
        // Create template array for each tree level
        $childTemplates = @explode(',', $childTemplatesTV);
        if (empty($childTemplates)) break;
        foreach ($childTemplates as $k => $v) $childTemplates[$k] = intval(trim($v));
         
        break;
 
      }
 
      $level++;
 
    }
 
    // Set template based on tree level
    if (!empty($childTemplates)) {
      $useTemplate = $childTemplates[$level];
      if (!empty($useTemplate)) {
        
        // Set default template
        if (isset($modx->controller)) {
          $modx->controller->setProperty('template', $useTemplate);
        } else { // modX < 2.2.0
          $_REQUEST['template'] = $useTemplate;
        }
 
      }
    }
 
  }
 
}

Теперь создайте TV
TV Name: changeTemplate
TV Input Options: Text
TV Template Access: Указать в каких шаблонах, мы используем этот плагин
2. Применение:
Этот плагин очень прост в использовании. Давайте предположим, что у нас есть шаблон 1 (1), Шаблон 2 (4), Шаблон 3 (5), Шаблон 4 (6), и шаблона 5 (7), как показано в следующем скриншоте

Первым делом переходим к ресурсам, откройте «Home» документ (или любого другой документ) и установите значение changeTemplate значения «4,5,6,7». Эти номера идентификаторов наших шаблонов. Вот скриншот моего «changeTemplate» ТВ:

Как только «Home» документ сохраняется, мы можем создавать вложенные документы из «Home», и плагин «ChangeTemplate» позаботится о выборе просил шаблона для каждого дерева уровне, так:
Дерево Уровень 2 => Шаблон 2 (ID 4)
Дерево Уровень 3 => Шаблон 3 (ID 5)
Дерево Уровень 4 => Шаблон 4 (ID 6)
Дерево Уровень 5 => Шаблон 5 (ID 7)

Вот и все! Вы можете найти более подробную информацию об этом плагине на этой ветке форума.
  • +10
  • 19 января 2012, 08:09
  • valikras

Комментарии (9)

RSS свернуть / развернуть
0
Вау!
Давно хотел что то такое! А то удержать в памяти, какой же шаблон сейчас нужен, да и вообще не забывать его устанавливать…
Valikras, вы пользовались? Интересует личный опыт… Глюки, баги, удобство?
avatar

createit

  • 19 января 2012, 11:40
0
Хотя, все равно не совсем то, что мне нужно бы…
Я представлял несколько иначе, мне важно, что бы в зависимости от текущего шаблоны документа, при создании дочерних ограничить круг допустимых шаблонов.

Пример: список шаблонов — Главная, Текстовая, Раздел каталога, Товар.

Главная страница сайта, шаблон Главная, допустимые шаблоны у подразделов: все, кроме Главная.
Страница с текстом, шаблон Текстовая, допустимые шаблоны у подразделов: Текстовая, Раздел каталога.
Страница в каталоге, шаблон Раздел каталога, допустимые шаблоны у подразделов: Товар
Товар в каталоге, шаблон Товар, допустимые шаблоны у подразделов: нет, нельзя создавать дочерние.


Как бы такое сделать, что бы «не очень понимающие» клиенты сайты не ломали)))
avatar

createit

  • 19 января 2012, 11:49
0
Ваша ситуация, более специфическая.
В данной ситуации, мы закрываем выборку шаблона, и выставляем её в настройках плагина, т. е чтобы менеджер не перепутал случайно шаблон.
К примеру, имеем каталог:
Каталог и назначаем ему шаблоны по уровням. Теперь, при зоздании в каталогу подразделов. будет автоматом присваиваться нужный шаблон.

Добавил ещё одну картинку (снизу) для ясности…
avatar

valikras

  • 19 января 2012, 14:36
+1
Ну а если менеджер создал (по вашему рисунку) «Level 4 новый» на уровне «Level 4». Менеджер у нового документа не прописал настройки шаблонов, и таким образом «Level 5 новый» сможет создать с любым шаблоном… Или я что то не понимаю?
avatar

createit

  • 19 января 2012, 15:33
+1
если не прописано — то только с дочерным шаблоном.
avatar

valikras

  • 19 января 2012, 15:47
+1
В EVO это делается с помощью ММ
хотя надо чуть позаморачиваться
avatar

Dmi3y

  • 19 января 2012, 16:58
0
в Ево делается с помощью Inherit Selected Template
avatar

valikras

  • 19 января 2012, 17:01
+1
ещё есть мой плагин customTemplates

но я ответ писал про отображение только тех шаблонов которые можно выбрать пользователю :)
avatar

Dmi3y

  • 19 января 2012, 17:05
0
наверное… я не в курсе.
avatar

valikras

  • 19 января 2012, 17:10

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.