Разделы

custom Template(plugin) - выставляем нужную зависимость Шаблонов при создании новых документов[EVO]

Иногда менеджеры сайта забывают ставить нужный шаблон для документа в MODx. Что вызывает их замешательство и лишнее письмо или звонок программисту. А так как отвлекаться от работы и объяснять кто виноват и почему все плохо, нет желания. Потому лучше избегать ситуаций когда у менеджера есть свобода выбора в совершении лишних действий.

Проблему наследования шаблонов в MODx решает пункт настойки

Шаблон, назначаемый новым ресурсам:
Системный: такой же шаблон, как в системных настройках.
Родитель: такой же шаблон, как у родителя (если ресурс в корне сайта, шаблон Системный).
Соседний: такой же шаблон, как у соседних ресурсов в этом контейнере (если соседних ресурсов нет, шаблон Родитель).

Но когда у нас древовидная структура сайта и нужно добавлять не только документы но и ветки документов (классический пример: каталог товаров)
то нужно делать лишние движения по выбору шаблона, при наполнении сайта.
Под катом плагин который позволяет решить данную проблему,
указав нужную наследственность шаблонов.

Выставляем событие для плагина: OnDocFormPrerender
В настройках пишем: &customTemplates=customTemplates;text;100,101|102,103

и далее заменяем значение по логике:
Номер шаблона Папки, Номер шаблона Документа|Номер шаблона Папки, Номер шаблона Документа|Номер шаблона Папки, Номер шаблона Документа

Код:

//<?php
/**
 * custom Template
 * 
 * Newly created Resources use the template configured in plugin 
 *
 * @category    plugin
 * @version     0.1
 * @author		Dmi3yy (dmi3yy@gmail.com)
 * @internal    @properties &customTemplates=customTemplates;text;100,101|102,103
 * @internal    @events OnDocFormPrerender 
 * @internal    @modx_category Manager and Admin
 */
 
/*
 * custom Template
 *
 * Written By Dmi3yy - 13 Sep 2011
 *
 *
 * Configuration:
 * check the OnDocFormPrerender event
 * add properties &customTemplates=customTemplates;text;100,101|102,103
 * Version 0.1
 *
 */

global $content;
$e = &$modx->Event;
$cusTemp=explode('|',$customTemplates);
switch($e->name) {
    case 'OnDocFormPrerender':        
      
        
        if ($parent = $modx->getPageInfo($_REQUEST['pid'],0,'template')) {

              foreach ($cusTemp as $value) {
                  $tpl=explode(',',$value);
                  if ($parent['template'] == $tpl[0]){ $content['template'] = $tpl[1];} 
              }   
                 
        }
     
        break;
    default:
        break;
}


Скачать:
customTemplate.zip

Плагин можно залить в install/assets/pluging
и он автоматом будет ставиться с системой)
  • +5
  • 13 сентября 2011, 23:54
  • Dmi3y

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

RSS свернуть / развернуть
-1
Ребята, пожалуйста, переходите потихоньку на Revo.

Тяжко смотреть на советы про «каталог товаров» в виде ресурсов. Используйте свои таблицы и компоненты к ним. Сколько можно изобретать велосипеды?

MODX очень хорош и позволяет все, но не нужно зацикливаться на `modx_site_content`.
avatar

bezumkin

  • 14 сентября 2011, 00:25
+1
Может не будем Холиварить?

Проекты бывают разные.
Потому для одних хорошо EVO и дерево документов а для других хорошо REVO и выделенный сервер.

А велосипеды это хорошо, так как все с них начиналось.
тут главное знать меру и делать качественно.

Я готов выразить всем кто постил свои велосипеды большую благодарность! так как они помогают повысить уровень знаний :)

avatar

Dmi3y

  • 14 сентября 2011, 00:38
+1
может знаний и повысят, но до того времяни куча тормозов и косяков в которых разбираться…
У меня в личку по 10 писем на день идёт.
Приведу два последних, не буду тыкать пальцем, кто узнает, не в обиду (никто не знает)
<?
$a = array(0,1,2);
foreach ($a as $trol){
print key($a);
print "
";
}
?>
вывод 1 1 1 Должен же выводить 0,1,2. Почему работает неправильно?

++++++++++++++++++
Ещё не удержусь,
Это человек не знал, просто доступ дал, Babel настроить, открыл я файл robots.txt — а там.
rrot@damon's password: napisalego:htdocs$ more$ robots.txt
User-agent: *
Disallow: /

avatar

valikras

  • 14 сентября 2011, 02:03
+2
Тут уж зависит куда вставлять велосипед :) и вставлять ли

avatar

Dmi3y

  • 14 сентября 2011, 02:13
+1
ну… зато настроение подымается всегда!!!
avatar

valikras

  • 14 сентября 2011, 02:36
0
Можете рассказать поподробнее о своем подходе к каталогам на рево?
avatar

Leadmonkey

  • 19 сентября 2011, 11:34
0
Ресурсы МОДХ — это как бы страница сайта, на которой можно вывести что угодно из БД, в любом виде. Делать каталог товаров ресурсами — расточительство. Мало того, что это неудобно обслуживать — так еще и тормозить будет.

Для хранения и вывода данных нужно создать таблицу в БД, и компонент в админке — для управления. А в ресурсе собственным сниппетов вывести свой каталог товаров.

community.modx-cms.ru/blog/addons/2222.html

Шаблоны и Tv параметры вообще не должны использоваться для этого.
avatar

bezumkin

  • 19 сентября 2011, 12:19
0
Благодарю, весь пригодился сниппет :)
avatar

jabber

  • 15 сентября 2011, 15:24
0
Есть еще один плагин на ту же тему — automaticTpl, отличие в том, что наследование прописывается не в настройках плагина, а в переменной. Т.е. можно задавать свою схему для каждой ветки сайта.

 /* automaticTpl - Documents are automatically created with the 
 * template specified in the parent document. You can specify 
 * the default template for children, grand children, grand grand 
 * children documents and more.
 *
 * Childrens will inherit the template specified in the automaticTpl 
 * TV of the parent. If no valid Template ID is found Inherit 
 * Template Plugin will kick in(if installed)
 *
 * Installation:
 *
 * 1) Create a new Template Variable with the following information:
 *   a) Variable Name: automaticTpl
 *   b) Caption: Eg: Comma separated list of template ids
 *   c) Description: Eg: Children will be created using the 
 *      specified template IDs. Each template Id represents a level
 *   d) Input Type: Text
 *   e) Input Option Values: Empty
 *   f) Default Value: Empty
 *   g) Widget: Don't change, leave blank.
 *   h) Sort Order: Don't change unless desired.
 *   i) Template Access: Select which templates should use 
 *      this TV. The children of the documents using this template 
 *      will be created with the template specified in step 1.b.
 *  j) Access Permissions: It's up to you what users will have 
 *     access to change this TV. You will need to set up documents 
 *     groups and permissions
 *
 * 3) Take note of the id of the automaticTpl Template Variable 
 *    from either the Template Variable Resource List or from 
 *    your database table modx_site_tmplvars.
 *
 * 4) Create a new plugin with the following information:
 *  a) Plugin Name: automaticTpl
 *  b) Description: Sets the default template when a children is created.
 *  c) Plugin Disabled: Leave Unchecked
 *  d) Plugin code (php): Copy & paste the code from the 
 *     automaticTpl.php file that you downloaded.
 *
 * 5) Go into the System Events tab and find OnDocFormPrerender 
 *    and check it on.
 * 6) Go into the Configuration tab and paste the following 
 *    code: &automaticTplTvID=automaticTpl TV ID;text;
 * 7) Click anywhere outside the textbox, this will dynamically 
 *    generate a new parameter field.
 * 8) Input the ID of the Template Variable you took note of before.
 * 9) Save the plugin
 * 10) Go back to the main Plugins Resource List page and click 
 *     on 'Edit Plugin Execution Order by Event'. Ensure that 
 *     'automaticTpl' is sorted  BELOW 'Inherit Parent Template'. 
 *     If not, change it to be so.
 *  
 * Testing:
 * 1) Edit a document that has a template with 
 *    the TV 'automaticTpl' asociated to it
 * 2) Inside automaticTpl TV insert the id of the template you 
 *    want you children to be created by default Eg: 4
 * 3) If you need to assign the default template for children 
 *    on more levels put a comma separated list Eg: 4,6,29
 * 4) Save the document
 * 5) Create a children for the above document. The "Uses template" 
 *    field should be populated by default with the name of the 
 *    template Id you entered. In our example: 4
 * 6) Save your document. If you entered a comma separated list 
 *    GO TO 7. Otherwise you're done
 * 7) Create a children in for the children document created at step 5.
 * 8) Create a children for the children document created at 5. 
 *    The "Uses template" field should be populated by default 
 *    with the name of the second template Id you entered. 
 *    In our example: 6
 * 9) And so on if you entered a longer list of IDs
 *
 *
 * Advanced Usage:
 * Refer to the example above.
 * If the template id 6 has an automaticTpl TV with the value of 
 * 30 the children of the document using this template will be 
 * created using the template id 30 not 29.
 * The plugin goes up the tree until it finds the first not 
 * empty automaticTpl. This way you can have more flexibility for 
 * multiple levels of documents
 *
 *
 * Version 0.5
 * 0.5 - updated install instruction(thx to brettdusek)
 * 0.4 - removed php tags and spell check
 * 0.3 - completely changed the logic. You can use the automaticTpl 
 *       TV for any container
 *       Previous version was limited to a certain container 
 *       structure. Now other containers with different structures 
 *       can be placed anywhere in the parent container
 *       The used template will be taken from the first parent that 
 *       has a value for the automaticTpl TV. If no automaticTpl TV 
 *       is found then the parent template is used
 * 0.1 - first version
 *
 */
global $content;
$e = &$modx->Event;

switch($e->name) {
  case 'OnDocFormPrerender':
    if(($_REQUEST['pid'] > 0) && ($id == 0)) {
			//init parent
			$parent = $_REQUEST['pid'];
			//init level
			$level = 0;
			//init the TV value
			$tplVal = ""; 
			
			//find the first parent that has an automaticTpl TV and on which level
			while($parent){
				//increase level
				$level++;
				
				//check if the parent has the automaticTpl TV
				$sql = "SELECT * FROM ".$modx->db->config['table_prefix']."site_tmplvar_contentvalues WHERE tmplvarid = " . $automaticTplTvID . " AND contentid = " . $parent;
				$rs= $modx->dbQuery($sql);
				$row = $modx->fetchRow($rs);
				
				if($row && $row['value'] != ''){
					//stop while loop
					$parent = 0;
					//save TV value
					$tplVal = $row['value'];
				}else{
					//get next parent
					$sql = "SELECT parent FROM ".$modx->db->config['table_prefix']."site_content WHERE id = " . $parent;
					$rs= $modx->dbQuery($sql);
					$row = $modx->fetchRow($rs);
					
					$parent = $row['parent'];
				}
			}//end While
			
			if($tplVal){
				//set template to the automaticTpl value
				$aTplVals = explode(",",$tplVal);
				if(isset($aTplVals[$level-1])){
					$content['template'] = intval($aTplVals[$level-1]);
				}else{
					//do nothing - Inherit Template Plugin will kick in
				}
			}else{
				//do nothing - Inherit Template Plugin will kick in
			}
		}
	break;

  default:
    return;
    break;
}
avatar

Leadmonkey

  • 19 сентября 2011, 11:31
0
Ага видел его :)
тоже довольно удобное решение, но работает немного по другому :)

так что как по мне и 1 и 2 варианты жизнеспособны
avatar

Dmi3y

  • 19 сентября 2011, 12:57
0
Подскажите пожалуйста как настроить вот такую последовательность:

У меня такая структура:
-Регулярные модели: (id необходимого шаблона 3)
--Сакура (id необходимого шаблона 4)

-Коллекции: (неопубликованный документ, любой шаблон)
--Сакура: (id необходимого шаблона 6)
---Модели номер 1 2 3: (id необходимого шаблона 5)
----Модель 1 (id необходимого шаблона 7)
----Модель 2 (id необходимого шаблона 7)
----Модель 3 (id необходимого шаблона 7)
avatar

Karandash

  • 12 октября 2011, 21:37
+1
3,4|6,5|5,7

ну и по умолчанию поставить шаблон 6(что б в любом документе сразу же ставился 6)

единственное ещё прописать к остальным шаблонам зависимости,
если учитывать что 6 по умолчанию
avatar

Dmi3y

  • 12 октября 2011, 21:43
0
Благодарю, буду пробовать =)
avatar

Karandash

  • 12 октября 2011, 21:53
0
Ну и я внесу свои 5 копеек. Стояла задача по каталогу. Причем в каталоге был 1 уровень и вывод 4 разных шаблонов для дочек одного шаблона. Т.е. в том виде, в котором данный плагин работает был для мне почти бесполезен. А поскольку хотелось максимально автоматизировать процесс забивки и обрезания админки для конечных пользователей по самое не балуйся, то пришлось ковырять в этом замечательном плагине. В результате оказалось все проще. Вот код поправленного плагина под задачу

/*
 * custom Template
 *
 * Written By Dmi3yy - 13 Sep 2011
 *
 *
 * Configuration:
 * check the OnDocFormPrerender event
 * add properties &customTemplates=customTemplates;text;100,101|102,103
 * Version 0.1
 *
 */

global $content;
$e = &$modx->Event;
$cusTemp=explode('|',$customTemplates);
switch($e->name) {
    case 'OnDocFormPrerender':        
      
        
        if ($parent = $modx->getPageInfo($_REQUEST['pid'],0,'id')) {

              foreach ($cusTemp as $value) {
                  $tpl=explode(',',$value);
                  if ($parent['id'] == $tpl[0]){ $content['template'] = $tpl[1];} 
              }   
                 
        }
     
        break;
    default:
        break;
}

Что я поменял — теперь привязка идет не к шаблоку родителя, а к его Id. ну и строчка теперь настройки имеет логику:
ID Папки родителя, Номер шаблона Документа дочки|ID Папки родителя, Номер шаблона Документа дочки

Может кому понадобится.
avatar

jean179

  • 11 февраля 2012, 01:09
0
не пойму в чем суть?
вместо
родитель — дочка
получилось
родитель(id) — дочка?
avatar

Dmi3y

  • 11 февраля 2012, 01:12
0
У вас была Шаблон родителя, Шаблон дочки
Я сделал ID Родителя, Шаблон дочки
Именно для каталога: вывод в ленту карточек каталога используется шаблон 1. Он одинаковый для всех разделов. А вот в карточках используется разные шаблоны. Разница в TV полях. У меня такая была задача, разбить в выводе карточки данные так, что бы редактор забивал поля. А все лишнее скрыть от глаз редактора.

И стояла именно задача для дочек настроить выбор шаблон для карточек в разделах.

Ваш шаблон по умолчанию выводил шаблон родителя (что было очень плохо!), но ставил соседний шаблон где было (что было просто отлично!). Я крутил настройки и так и этак, но ничего не получалось.Настройки связки шаблон-шаблон мне было бесполезно. Вот я и перешел на ID — шаблон.

Вот поэтому я разобрался (ну мне так кажется :) ) в вашем коде и поправил под задачу. А решение выложил. Возможно кому-нибудь потребуется такое решение. Или вас натолкнет на идею и вы допишете плагин и вставите возможность штатной настройки выбора того или иного вывода.

В любом случае спасибо за этот отилчный плагин!
avatar

jean179

  • 11 февраля 2012, 10:35

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