Разделы

Одинаковые шаблоны и разные TV для страниц

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

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

Решил возложить почетные обязанности по сбережению мозга редактора на ManagerManager и PHx. Докладываю, с задачей он справился!

Что я сделал?

Взял один шаблон и присвоил ему все параметры сразу.

В шаблоне, что выводить решает PHx.

В админке достаточно «правильно» настроить правила для ManagerManager. У меня получилось примерно следующее:

function UP($id,$topLevel=0,$top=0) {
    global $modx;
    $top= isset ($top) && intval($top) ? $top : 0;
    $id= isset ($id) && intval($id) ? intval($id) : $modx->documentIdentifier;
    $topLevel= isset ($topLevel) && intval($topLevel) ? intval($topLevel) : 0;
    if ($id && $id != $top) {
        $pid= $id;
        if (!$topLevel || count($modx->getParentIds($id)) >= $topLevel) {
            while ($parentIds= $modx->getParentIds($id, 1)) {
                $pid= array_pop($parentIds);
                if ($pid == $top) {
                    break;
                }
                $id= $pid;
                if ($topLevel && count($modx->getParentIds($id)) < $topLevel) {
                    break;
                }
            }
        }
    }
    return $id;
}

function GetVal($id,$field) {
    global $modx;
    $result = $modx->getTemplateVar($field, 'name', $id, 1);
    return $result['value'];
}

$cID = $content['id'];
$pID = $content['parent'];

$reservdeIDs = array(2,3,5);


/**
 * Для топлевел и для страниц у которых верхний родитель не зарезервирован - скрываем лишнее
 */

if ($pID == 0 || !in_array(UP($cID),$reservdeIDs)) {
    mm_hideFields("tvflag_big");
    mm_hideFields("tvflag_small");
    mm_hideFields("tvnewprod_bigimg");
    mm_hideFields("tvbrand_logo");
    mm_hideFields("tvcollection_gid");
    mm_hideFields("tvcollection_img");
    mm_hideFields("introtext");
}

/**
 * Для всех
 */

mm_hideFields("link_attributes");
mm_hideFields("template");
mm_hideFields("menutitle");
mm_hideFields("longtitle");
mm_hideFields("description");


/**
 * Показываем флаги только для стран
 */

if (UP($cID,1) == $pID && UP($cID) == 2) {
    //mm_hideFields("tvflag_big");
    //mm_hideFields("tvflag_small");
    mm_hideFields("tvnewprod_bigimg");
    mm_hideFields("tvbrand_logo");
    mm_hideFields("tvcollection_gid");
    mm_hideFields("tvcollection_img");
    mm_hideFields("introtext");
}

и так далее...

Это не все, но суть я думаю — ясна.

Вначале две вспомогательных функции, первая это UltimateParent, только чуть-чуть измененный, а вторая просто возвращает требуемый параметр документа по его ID.

В итоге опираясь на структуру и глубину вложенности документа ManagerManager определяет какие поля скрывать, а какие — нет.

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

Итоги.

Лично я не вижу отрицательного эффекта от такого трюка. Кроме небольшого усложнения кода самого шаблона и, возможно, немного дольше придется работать PHx большого количества условий в коде шаблона.

А как думаете вы, есть ли какие-то неучтенные минусы?
  • +4
  • 3 февраля 2010, 22:08
  • pitbull

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

RSS свернуть / развернуть
0
WOW! А можно ли подобным способом задать для конкретного шаблона правило: Если папка — скрывай эти TV, если не папка — показывай эти TV?
avatar

banev

  • 3 февраля 2010, 23:50
+1
Да конечно можно:

if ($content['isfolder'] == 1) {
    mm_hideFields("tv1");
} else {
    mm_hideFields("tv2");
}


Только не закутайтесь, в том, что MM умеет только скрывать. Это немного меняет логику написания, но никак не суть =)
avatar

pitbull

  • 3 февраля 2010, 23:57
0
Забыл дописать еще в условие проверку шаблона.

В момент работы MM полностью доступен массив $content и в частности $content['template'] тоже =)
avatar

pitbull

  • 3 февраля 2010, 23:59
0
Блин, это шикарно! :)
avatar

banev

  • 4 февраля 2010, 00:56
0
Эм, ну не знаю, я думал, что это логично и все об этом знают, а я тут боян размещаю…
avatar

pitbull

  • 4 февраля 2010, 00:59
0
Программеры, может знают, но молчат… А нам неграмотным верстальщикам все разжевывать надо… :)
avatar

banev

  • 4 февраля 2010, 11:59
0
Класс!
Можно разжевать поподробнее с комментариями и примерами?
Например у меня в шаблоне есть:
[+phx:if=`[[UltimateParent? &topLevel=`3`]]`:is=`62` ....

Дайте подсказку на аналог в MM.
Т.Е. Каким образом мне в админке для данной вложенности скрыть требуемое?
avatar

kalina

  • 24 марта 2011, 16:45
0
И если не затруднит дайте расшифровку:

/**
 * Показываем флаги только для стран
 */

if (UP($cID,1) == $pID && UP($cID) == 2) {

Не совсем понимаю… :(
avatar

kalina

  • 24 марта 2011, 16:47
0
Это просто тупо код для одного из сайтов.
avatar

pitbull

  • 24 марта 2011, 23:21
0
Я понимаю, что это просто тупо… :)
Дать комментарии ведь несложно?
avatar

kalina

  • 25 марта 2011, 00:58
0
Это мой код для одного из моих сайтов.

Он просто для примера и все. Никакого отношения прямого к описываемому не имеет
avatar

pitbull

  • 25 марта 2011, 12:27
0
Продолжаем разговор :)
Специально для меня можно дать пояснения?
Именно по этому коду. Понимаю, что ухожу в занудство, но вижу, человек вы хороший; просто, то что для вас очевидно, для меня — нет.
На простом языке:
if — если
(UP($cID,1) — топлевел 1
и т.д.

avatar

kalina

  • 25 марта 2011, 16:28
0
Я к сожалению не программист. Это минус :(
Но не тупой. Это плюс :)


;)

Если родитель этого документа равен 2, а родитель второго уровня для этого документа равен его родителю, т.е. документ второго уровня вложенности НЕ прячем TV с флагами стран.

Структура:
Главная (1)
Каталог (2)
--Россия (Верно тут)
--Камбоджи (Верно тут)
Не каталог (3)
— Не РФ (тут не верно, т.к. родитель != 2)
avatar

pitbull

  • 25 марта 2011, 17:02
0
спасибо. добрались до сути :)
а по сути это равняется записи:
if (UP($сID,1,0) == 2) {

верно?
avatar

kalina

  • 25 марта 2011, 17:08
0
Хм, если исходить из моего описания, то да, а вообще я кажется наврал со структурой. Было, кажется так:

Главная (1)
Каталог (2)
--Что-то
----Россия (Верно тут)
----Камбоджи (Верно тут)
Не каталог (3)
--Где-то
----Не РФ (тут не верно, т.к. родитель != 2)

Поэтому и надо было проверять уровень родительского документа.

В общем, если хоть немного понятно — предлагаю углубится в эксперименты.

У меня нет под руками того сайта, так что боюсь ввести в заблуждение.
avatar

pitbull

  • 25 марта 2011, 17:13
0
all right! спасибо ещё раз! :)
avatar

kalina

  • 25 марта 2011, 17:16
0
Немного разобрался:
if (UP($pID,3,0) == 62) {
avatar

kalina

  • 24 марта 2011, 17:21
0
Да, именно так, в топике жа написано, что UP — это полная копия UltimateParent =)
avatar

pitbull

  • 24 марта 2011, 23:22
0
Я к сожалению не программист. Это минус :(
Но не тупой. Это плюс :)
Поэтому и прошу разжевать…
avatar

kalina

  • 25 марта 2011, 01:01
0
if (UP($pID,3,0) == 62) {


вы же правильно написали, только надо в UP подставлять не ID родителя, а ID ресурса, т.е. $cID, а не $pID.
avatar

pitbull

  • 25 марта 2011, 12:28
0
спасибо!
avatar

kalina

  • 25 марта 2011, 12:29
0
Выставил настройки. Всё работает. Есть, правда, одно НО.

При создании документа ему автоматически присваивается соседний шаблон (59), но поля, которых нет у остальных док-ов с этим шаблоном, не скрываются (например, longtitle). Если у ещё несохранённого ресурса сменить шаблон, то поля скрываются, как и должно быть сразу же.

С полями, которые указаны здесь, вопросов нет. Например:
mm_default('hide_menu', true, '', '59');
но с longtitle, description и т.д. это почему-то не катит.

Может кто знает, как это решить?
avatar

sergge

  • 12 октября 2011, 23:19
0
Может быть потому, что ManagerManager не знает, какой шаблон у документа? или все-таки половина правил отрабатывает?
avatar

pitbull

  • 12 октября 2011, 23:22
0
Обрабатывает все правила (т.е. всё работает хорошо).
Накладка происходит именно в момент создания ресурса.

Поэтому вместо:
$tID = $content['template'];

if ($tID == 59 || $tID == 49){
mm_hideFields("longtitle");
..........
}
приходится использовать
mm_hideFields('longtitle', '', '59');
mm_hideFields('longtitle', '', '49');
..........
avatar

sergge

  • 12 октября 2011, 23:38
0
В момент создания ресурса, ManagerManager понятия не имеет какой у документа родитель. Это значение хранится в JS до момента сохранения документа.

Единственный вариант — выбрать «Сохранить и продолжить» и после сохранения все будет путем
avatar

pitbull

  • 12 октября 2011, 23:43
0
Я понимаю, только для менеджера — эта операция не понятна вовсе.

При использовании mm_hideFields('longtitle', '', '59'); срабатывает :). Вот только использование ID родительского документа в качестве итендификатора в MM не предусмотренно.

Может всё-таки есть возможноть обойти?

avatar

sergge

  • 13 октября 2011, 00:00
0
Да, вовсе непонятна — это да.

Обратите внимание на jSam там можно такие плюшки делать, что закачаешься… только документации не всегда достаточно
avatar

pitbull

  • 13 октября 2011, 00:01
0
jSam — классная, вроде, штука, но если его использовать, нужно MM отключать, а я только приноровился.
В момент создания ресурса, ManagerManager понятия не имеет какой у документа родитель. Это значение хранится в JS до момента сохранения документа.
Не совсем так. Я ведь создаю дочерний документ. И шаблон берётся у соседних ресурсов. И что самое интересное: при смене шаблона (до сохранения документа) эта конструкция срабатывает:
$tID = $content['template'];

if ($tID == 59 || $tID == 49){
mm_hideFields("longtitle");
..........
}
Т.е. не работает она именно при создании ресурса.
avatar

sergge

  • 13 октября 2011, 01:58
0
А ларчик просто открывался. Не нужно доставать id родителя через отдельную переменную. MM всё делает сам:
if($content['parent'] == 59){
mm_hideFields('pagetitle');
}
avatar

sergge

  • 13 октября 2011, 02:41

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