Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 1 Гость просматривают эту тему.

*

upmix

  • *
  • 6
  • +0/-0
    • Просмотр профиля
    • UpMix
Пытаюсь разбираться с 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, например на странице товара?
Или есть способ проще? Поделитесь!
« Последнее редактирование: 14 Июля 2017, 11:54:27 от upmix »

*

e.ioffe

  • ****
  • 369
  • +81/-2
  • Профессиональная разработка на UMI.CMS.
    • Просмотр профиля
    • Fullspace - Лучший хостинг для UMI.CMS
Re: Помогите разобраться с PHP шаблонами
« Ответ #1 : 06 Июля 2017, 18:40:20 »
Цитировать
Как вытащить объект $property, например на странице товара?
"В лоб" что-то вроде:
<?php
$objectId = $page->getValue('field');

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

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

Но лучше выносить такой код либо в extension, либо в custom
Ускорение сайта на UMI.CMS - http://speed.umispec.ru/

*

upmix

  • *
  • 6
  • +0/-0
    • Просмотр профиля
    • UpMix
Re: Помогите разобраться с PHP шаблонами
« Ответ #2 : 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"
}
А мне нужен, как я понимаю, объект этого поля. Или я что-то не так делаю?

*

upmix

  • *
  • 6
  • +0/-0
    • Просмотр профиля
    • UpMix
Re: Помогите разобраться с PHP шаблонами
« Ответ #3 : 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());

*

upmix

  • *
  • 6
  • +0/-0
    • Просмотр профиля
    • UpMix
Re: Помогите разобраться с PHP шаблонами
« Ответ #4 : 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.

*

upmix

  • *
  • 6
  • +0/-0
    • Просмотр профиля
    • UpMix
С помощью Евгения 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