Получение значения справочника по его идентификатору в макросе на UMI CMS
Рубрика: Тонкости 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; ?>
Код изобилует проверками, однако в реальном проекте без них никак не обойтись.
Надеюсь, что сегодняшняя статья стала для вас полезной.
Сен03