UMIhelp

Разработка сайта на UMI.CMS => Шаблоны PHP => Тема начата: upmix от 06 Июля 2017, 17:22:16

Название: Вывод поля выпадающий список (relation) в php шаблонизаторе
Отправлено: upmix от 06 Июля 2017, 17:22:16
Пытаюсь разбираться с 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, например на странице товара?
Или есть способ проще? Поделитесь!
Название: Re: Помогите разобраться с PHP шаблонами
Отправлено: e.ioffe от 06 Июля 2017, 18:40:20
Цитировать
Как вытащить объект $property, например на странице товара?
"В лоб" что-то вроде:
<?php
$objectId = $page->getValue('field');

$object = $this->getObjectById($objectId);

if($object instanceof umiObject) {
 $objectName = $object->getName();
}

Но лучше выносить такой код либо в extension, либо в custom
Название: Re: Помогите разобраться с PHP шаблонами
Отправлено: upmix от 07 Июля 2017, 11:46:50
Пробую так:
$page = $variables['full:page'];
$objectId = $page->getValue('cvet');
В итоге в $objectId получаю массив ID значений этого поля:
array(2) {
  [0]=>
  string(4) "2668"
  [1]=>
  string(3) "696"
}
А мне нужен, как я понимаю, объект этого поля. Или я что-то не так делаю?
Название: Re: Помогите разобраться с PHP шаблонами
Отправлено: upmix от 07 Июля 2017, 11:51:41
В общем, интеллектуальный пинок Жени оказался кстати.
Первоначальный код работает для конкретного поля:
        $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());
Название: Re: Помогите разобраться с PHP шаблонами
Отправлено: upmix от 08 Июля 2017, 13:43:03
В общем разобрался, с помощью одного из партнеров в скайп чате (рекомендую подключаться):
$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.
Название: Re: Вывод поля выпадающий список (relation) в php шаблонизаторе
Отправлено: upmix от 14 Июля 2017, 13:00:54
С помощью Евгения 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