Помогите состряпать условие для вывода в шапке

Добрый день всем!
Продолжаю делать интернет магазин на чудесном движке MODX
На сей раз запутался в условиях, что делать знаю, но как вычислить не в курсе

У меня есть две категории товаров
К примеру первая категория с ID 1
Вторая категория с ID 2
В них по 3-4 категории в каждой
Мне нужно выводить в шапке, в теге title в первой на всех подкатегориях и товарах слова «Купить [[longtitle]] в Москве»
Во всех подкатегориях и товарах второй «Заказать [[longtitle]] в Москве»

Нужно как-то определить главного родителя первой и составить *Главный:is=`1`:then=`Купить`
И определить главного родителя второй и составить *Главный:is=`2`:then=`Заказать`

Всю голову сломал.
Прошу вашей помощи друзья!

PS
Изначально сделал так
[[*class_key:is=`msProduct`:or:is=`msCategory`:then=`Купить [[*longtitle]] по низкой цене [[++city]]`:else=`[[*longtitle]]`]]
Но оно разумеется идет для двух категорий. А первая категория у меня товары на минишопе, вторая услуги
Андрей
14 июня 2019, 17:45
modx.pro
578
0

Комментарии: 2

Павел Романов
14 июня 2019, 19:57
1
+1
Используйте сниппет pdoField.
Там есть параметр topLevel, который указывает уровень от корня сайта.

То есть при такой структуре:
Каталог (2)
    Категория 1 (3)
        Подкатегория 1 (15)
            Товар 1 (4)
    Категория 2 (5)
        Товар 2 (6)

Такой вызов в Товаре 1 (да и в любом ресурсе ниже Категории 1):
[[pdoField? &topLevel=`2` &field=`id`]]
Выведет 3 (ID второго от корня ресурса).

Соответственно, можно сделать условие:
[[pdoField:is=`3`:then=`Купить`:else=`Заказать`? &topLevel=`2` &field=`id`]] [[*longtitle]] по низкой цене
    Андрей
    14 июня 2019, 21:20
    0
    Сделал немного иначе
    Вывел другим сниппетом
    [[!getparents:is=`2`:then=`Купить [[*longtitle]] по низкой цене`]]
    Ниже код самого сниппета
    <?php
    if (!isset($modx)) return '';
    
    $top = isset($top) && intval($top) ? $top : 0;
    $id= isset($id) && intval($id) ? intval($id) : $modx->resource->get('id');
    $topLevel= isset($topLevel) && intval($topLevel) ? intval($topLevel) : 0;
    if ($id && $id != $top) {
        $pid = $id;
        $pids = $modx->getParentIds($id);
        if (!$topLevel || count($pids) >= $topLevel) {
            while ($parentIds= $modx->getParentIds($id, 1)) {
                $pid = array_pop($parentIds);
                if ($pid == $top) {
                    break;
                }
                $id = $pid;
                $parentIds = $modx->getParentIds($id);
                if ($topLevel && count($parentIds) < $topLevel) {
                    break;
                }
            }
        }
    }
    return $id;
    Хотя через PdoTools тоже можно, в принципе он аналогичен этому
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2