Получение значения справочника по его идентификатору в макросе на UMI CMS

Вы наверняка сталкивались с таким типом данных в ЮМИ, как relation — значение из справочника. И, если вы работали с xslt-преобразованием — в большинстве случаев это не вызывало проблем: результаты уже были подготовлены в виде <property name="cvet"><title>Цвет</title><value><item id="12" value="черный"></value></property>. Немного другая ситуация складывается в случае, если вы получаете значение такого свойства в кастомном макросе.

Чуть-чуть вступительной теории для начала.

В макросах юми объекты можно получить одним из двух способов: через umiHierarchyElement и umiObject. Второй способ является более универсальным, так как подходит для всех сущностей системы, в то время как первый — только для тех сущностей, которые отражены в структуре.

И в том и в другом случае получение значения свойства осуществляется через метод getValue(). Однако, если для простых полей, таких как текст или число, результат представлен в явном виде, то для поля relation результатом является идентификатор объекта из справочника. А вот реального текстового значения там нет и в помине.

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

Для этого нам потребуется метод getPropByName() класса umiObject. Если вы работаете с umiHierarchyElement — тут тоже нет никакой проблемы. Связанный с элементом объект получаем с помощью метода getObject().

Итак, после применения getPropByName(), у нас на руках объект класса umiObjectProperty, представляющий собой свойство типа relation. Из этого объекта необходимо получить объект umiField и тут есть одна хитрость. В официальной документации на текущий момент указано, что метод getField() класса umiObjectProperty возвращает тип umiFieldType, однако, как показывает практика, это не так.

Итак, воспользовавшись методом getField() получаем объект класса umiField. Теперь наша задача — воспользоваться его методом getGuideId() и получить идентификатор справочника связанного свойства.

Затем, с помощью umiObjectsCollection и его метода getGuidedItems($идентификатор_справочника) мы получаем массив, заполненный ключами и значениями из справочника. Тут уже просто обращение по ключу дает нужный нам результат.

Вот пример кода, который реализует указанный функционал.

<?php
$hierarchy = umiHierarchy::getInstance();
$element = $hierarchy->getElement($id);
 
$obj = $element->getObject();
if($obj instanceof umiObject){
    $prop = $obj->getPropByName('cvet');
    if($prop instanceof umiObjectProperty){
        $field = $prop->getField();
        if($field instanceof umiField){
            $guide_id = $field->getGuideId();
            if($guide_id){
                $objectsCollection = umiObjectsCollection::getInstance();
                $guide = $objectsCollection->getGuidedItems($guide_id);
                if(!empty($guide[$val])){
                    return $guide[$val];
                }
            }
        }
    }
}
return false;
?>

Код изобилует проверками, однако в реальном проекте без них никак не обойтись.

Надеюсь, что сегодняшняя статья стала для вас полезной.

Простой и понятный online-курс для обучения XSLT-программиста с любого базового уровня

Сен03

Ваш отзыв