Задать вопрос
@jowee
Backend Developer

MODx: автоматическое применение шаблона к определенным страницам?

Только начинаю изучать MODX, столкнулся с такой задачей: надо для определенных страниц при создании автоматически применять один из шаблонов. Например, для всех страниц, являющихся дочерними для ресурса «новости», использовать шаблон «news».

Возможно ли это вообще?
  • Вопрос задан
  • 8212 просмотров
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
@d-udovichenko
Это можно сделать через Manager Customization (Настройки Админки)

- Верхнее меню -> Настройки Админки
- Создать новый профиль (поставить галку активный)
- Создать новый набор правил на "Создание ресурса"
- Ограничивающее поле: 'parent'
- Ограничивающее значение: id родительского шаблона
- Находим поле template и назначем нужный шаблон.

Видеоинструкция
www.youtube.com/watch?v=PS4TmQcohsA
Ответ написан
Комментировать
d4rkr00t
@d4rkr00t
Да в рево вроде это и так происходит, если у самого ресурса новости (родителя) шаблон news
Ответ написан
Desiderata
@Desiderata
В Evo 1.0.5 есть опция: Инструменты -> Конфигурация: Автоматическое назначение шаблона (Соседний: такой же шаблон, как у соседних ресурсов в этом контейнере (если соседних ресурсов нет, шаблон Родитель).)

Насчет Revo не знаю, но вполне возможно, что там также.
Ответ написан
@alvisX
Была у меня ссылка на мануал на русском, но источник более недоступен...
Плагином сделать очень просто, в комментариях вся инструкция:
<?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;
        }
  
      }
    }
  
  }
  
}
Ответ написан
Комментировать
@dmitryosipov
Используйте контроллеры - зависимости не будете мучаться с шаблонами
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы