Fi1osof 18 ноября 2014 3 7
Сегодня к вашему вниманию небольшой ливхак. Он правда на уровне хардкодинга, но для индивидуальных проектов вполне годится. В общем, статья — просто на заметку.

К примеру, такая задача: надо в дереве ресурсов видеть сразу в названии какие-нибудь флаги (например, что товар является новинкой). Да, я знаю, что все это можно сделать в групповом табличном редакторе, но все же. Итак, у документа-товара есть TV-параметр, определяющий новинка или нет. Все, что нам надо при построении дерева документов, это получить значение TV-поля, и если товар — новинка, то меняем заголовок. Для этого в класс документа (в нашем случае это ShopmodxResourceProduct) прописываем:
public function prepareTreeNode(array $node = array()) {
    $node = parent::prepareTreeNode($node);
    if(
        $this->getTVValue(11)  // Здесь само собой id вашего ТВ-поля
    )
    {
        $node['text'] = "<span style='color:green;'>New!</span> {$node['text']}";
    }
    return $node;
}

Все. Этот метод будет вызван в процессоре, обрабатывающем запросы на получение документов для дерева. Результат:
7 комментариев
s
sasha-freez 18 ноября 2014г в 16:01 #
Спасибо, отличная вещь!)
Fi1osof1
Fi1osof 18 ноября 2014г в 16:02 #
Всегда пожалуйста :)
Fi1osof1
Fi1osof 18 ноября 2014г в 16:08 #
А, еще момент: была задача, надо было выводить артикулы туда же. У нас артикулы, как известно, хранятся в связанном объекте ShopmodxProduct. Вот такой код в итоге был:
public function prepareTreeNode(array $node = array()) {
$node = parent::prepareTreeNode($node);
if($article = $this->Product->sm_article){
$node['text'] = "[ {$article} ] {$node['text']}";
}
return $node;
}
AlexBaks1
AlexBaks 18 ноября 2014г в 17:19 #
Почему хардкор то сразу, вполне понятно, было бы оптимально сделать класс ShopmodxResourceProduct переопределяемым через option залепил свой класс с фиксами унаследовался от ShopmodxResourceProduct и переназначал в option.
Fi1osof1
Fi1osof 18 ноября 2014г в 18:23 #
Не все так просто. Тут слишком много тонкостей.
1. Не будет просто так инициироваться новый класс, для этого надо будет обновить все class_key в базе данных.
2. У ShopmodxResourceProduct свои create- update- и т.п. процессоры. Они не будут просто так инициализироваться. Надо будет к этим процессорам создавать новые расширяющие.
И еще куча всего. А хардкод, потому что при обновлении пакета shopModx эти изменения затрутся. Но если для себя задокументировать, то не долго потом восстановить. А на фрондэнде это никак не скажется, так что ошибок каких-то серьезных не будет.
AlexBaks1
AlexBaks 18 ноября 2014г в 18:54 #
А хардкод, потому что при обновлении пакета shopModx эти изменения затрутся.

Да с этим не поспоришь..
Tramp13571
Tramp1357 25 октября 2015г в 20:44 #
Спасибо, очень полезная опция!
Я сейчас на всех новых сайтах сразу добавляю возможность отключать использование алиаса в uri дочерних документов, и это очень жизнь облегчает.

Добавлю свои 5 копеек :)
Сделал на 2.3.6 — необходимо !important в стиле добавить, иначе цвет не меняется.
Fi1osof1
Fi1osof 26 октября 2015г в 14:12 #
Не за что! :)
N
NicolaPr 16 декабря 2016г в 15:33 #
проверил на MODx 2.2.16-pl (traditional)
core/model/modx/modresource.class.php

Код такой:
public function prepareTreeNode(array $node = array()) {
$article = '';
if(
$this->getTVValue(5) // Здесь само собой id вашего ТВ-поля
)
{
$article = $this->getTVValue(5);
$node['text'] = "".$article." {$node['text']}";
}
return $node;
}
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.