Пытаюсь разбираться с php шаблонизатором. Возник ступор вроде бы на пустом месте.
Хочу вывести на сайт значения поля типа "выпадающий список с множественным выбором".
В XSLT это делается парой простых шаблонов, но в php просто сделать совсем не получается.
Нашел в демодиззи такой код:
$relations = $page->getValue($property->getName());
if (is_array($relations)) {
$relationText = array();
foreach ($relations as $relation) {
$relationText[] = $this->getObjectById($relation)->getName();
}
$relationText = implode(', ', $relationText);
} elseif (is_numeric($relations) && $this->getObjectById($relations) instanceof umiObject) {
$relationText = $this->getObjectById($relations)->getName();
} else {
$relationText = '';
}
Как вытащить объект $property, например на странице товара?
Или есть способ проще? Поделитесь!
Как вытащить объект $property, например на странице товара?
"В лоб" что-то вроде:
<?php
$objectId = $page->getValue('field');
$object = $this->getObjectById($objectId);
if($object instanceof umiObject) {
$objectName = $object->getName();
}
Но лучше выносить такой код либо в extension, либо в custom
Пробую так:
$page = $variables['full:page'];
$objectId = $page->getValue('cvet');
В итоге в $objectId получаю массив ID значений этого поля:
array(2) {
[0]=>
string(4) "2668"
[1]=>
string(3) "696"
}
А мне нужен, как я понимаю, объект этого поля. Или я что-то не так делаю?
В общем, интеллектуальный пинок Жени оказался кстати.
Первоначальный код работает для конкретного поля:
$page = $variables['full:page'];
$relations = $page->getValue('cvet');
if (is_array($relations)) {
$relationText = array();
foreach ($relations as $relation) {
$relationText[] = $this->getObjectById($relation)->getName();
}
$relationText = implode(', ', $relationText);
} elseif (is_numeric($relations) && $this->getObjectById($relations) instanceof umiObject) {
$relationText = $this->getObjectById($relations)->getName();
} else {
$relationText = '';
}
Остался вопрос, как из $variables вытащить объект поля ($property), чтобы можно было использовать универсальный код:
$relations = $page->getValue($property->getName());
В общем разобрался, с помощью одного из партнеров в скайп чате (рекомендую подключаться):
$page = $variables['full:page'];
$property = $page->getObject()->getPropByName('cvet'); //сюда можно передавать параметр с именем поля
$relations = $page->getValue($property->getName());
if (is_array($relations)) {
$relationText = array();
foreach ($relations as $relation) {
$relationText[] = $this->getObjectById($relation)->getName();
}
$relationText = implode(', ', $relationText);
} elseif (is_numeric($relations) && $this->getObjectById($relations) instanceof umiObject) {
$relationText = $this->getObjectById($relations)->getName();
} else {
$relationText = '';
}
В итоге в $relationText получаем значения поля через запятую, что требовалось. Возможно, нужно добавить проверки данных приходящих из UMI.
С помощью Евгения aka e.ioffe придумал helper для вывода содержимого поля "выпадающий список". Для поля с множественным выбором тоже подходит:
protected function getRelativeValue() {
return function ($variables, $name) {
/** @var umiHierarchyElement $page */
$relationText = null;
if(isset($variables['full:page'])) {
$page = $variables['full:page'];
$property = $page->getObject()->getPropByName($name);
/** @var umiField $property */
$relations = $page->getValue($property->getName());
if (is_array($relations)) {
$relationText = array();
foreach ($relations as $relation) {
$relationText[] = umiObjectsCollection::getInstance()->getObject($relation)->getName();
}
$relationText = implode(', ', $relationText);
} elseif (is_numeric($relations) && umiObjectsCollection::getInstance()->getObject($relations) instanceof umiObject) {
$relationText = umiObjectsCollection::getInstance()->getObject($relations)->getName();
} else {
$relationText = '';
}
}
return $relationText;
};
}
Вызов из шаблона:
$color = $this->getRelativeValue($variables, 'cvet');
cvet - Идентификатор поля
Прошу не судить строго, тк я не программист ;D