UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: goodprofy от 14 Февраля 2013, 18:53:53

Название: Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 14 Февраля 2013, 18:53:53
Не могу в целом понять устройство API UMI, из-за этого проблема с получением группы полей.
Техподдержка пояснила что группу полей можно получить через класс umiObject
http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobject/
Но при использовании методов класса мне пишет что метод не существует.

В справочнике для объекта каталога по умолчанию идет группа полей cenovye_svojstva, в ней содержатся основная цена, объем - составное поле(литры, и наценка), так же возможно будет год, вес и все что захочет контент менеджер. Чтобы постоянно не лазить в код необходимо при помощи АПИ вывести все поля группы cenovye_svojstva в массив, а массив уже обработать шаблоном, в котором будет выводится цена с наценкой и кнопка купить.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Rodogor от 14 Февраля 2013, 19:50:03
В идеале так:

$objectId = 666;
$object = umiObjectsCollection::getInstance()->getObject($objectId);
$group = $object->getPropGroupByName('cenovye_svojstva');

В $group у нас будет объект класса umiFieldsGroup

Что бы получить все значения -
$fields = $group->getFields();

Потом можем пройти по $object, получая значения полей
$block_arr = array ();
forearch ($fields as $field) {
               $block_arr[$field->getName()]=$object->getValue($field->getName());
}

Я в таких случаях смотрю в сторону data getEditForm и его кастомизации.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 15 Февраля 2013, 14:07:10
А $objectid - Это ID страницы?

А то мне выдает Call to a member function getFields() on a non-object
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Rodogor от 15 Февраля 2013, 14:59:44
В UMI есть СТРАНИЦЫ и ОБЪЕКТЫ. Страницы - элементы иерархии, т.е. то, что отображается в админке. Источниками данных для страниц служат объекты. Странцы без объекта быть не может (кроме случаев прямого обращения к макросам. Объекты - просто данные.
В системном коде umi какбэ принято для лучшего понимания переменные с объектами называть object или первую букву o - к примеру, $oBlog, $oPost, а страницы - $element (а в случае блога - $blog, в случае поста - $post)

В моём случае видно, что для получания объекта используется строчка
$object = umiObjectsCollection::getInstance()->getObject($objectId);
umiObjectsCollection - класс-одиночка, реализующий механизм доступа к объектам системы
getObject - метод класса umiObjectsCollection. Его описание можно найти на http://api.docs.umi-cms.ru/
Это кстати был ответ на вопрос - $objectId это id объекта

Я так понимаю, что нужно передавать id страницы и дальше выполнить все данные. У нас есть код, который делает что нам нужно, но для объекта. Поэтому нам нужно получить id объекта имея id страницы.

$elementId = 666;
$element = umiHierarchy::getInstance()->getElement($elementId);
$objectId = $element->getObjectId();
и дальше описанный выше код...

Для понимания этих вещей нужно разобраться с тем, что такое класс-одиночка в umi, какие есть классы в umi, какие у них методы и какие результаты возврвщают эти методы.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 15 Февраля 2013, 15:59:56
Разобрался с объектом и страницей, но опять ошибка.
Код:
$elementId = $id;
         $element = umiHierarchy::getInstance()->getElement($elementId);
         $objectId = $element->getObjectId();
         $object = umiObjectsCollection::getInstance()->getObject($objectId);
         $group = $object->getPropGroupByName("cenovye_svojstva");
         $fields = $group;
         var_dump($fields); // => array(3) {


Код:
$elementId = $id;
         $element = umiHierarchy::getInstance()->getElement($elementId);
         $objectId = $element->getObjectId();
         $object = umiObjectsCollection::getInstance()->getObject($objectId);
         $group = $object->getPropGroupByName("cenovye_svojstva");
         $fields = $group->getFields();
         var_dump($fields); // => Fatal error: Call to a member function getFields() on a non-object in

Я уже туплю...
Что не так то?
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Rodogor от 15 Февраля 2013, 17:10:40
Странно, у меня работает.
id страницы откуда берётся ? Реально такая страница существует ?

Когда я с таким сталкиваюсь - я ползу вверх var_dump'ом и смотрю чокак там, ну это собственно отладка, там вроде всё просто, но и нюансов масса...

Сейчас получается, что $group не является объектом. Надо смотреть как оно получается, где затык и т.п..
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 18 Февраля 2013, 11:26:54
ID страницы берется из %custom all_price(%id%)%
Страница существует /admin/catalog/edit/73/ работаю только с ней пока.

$group содержит array(3) {

$objectid = int(476)
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Rodogor от 18 Февраля 2013, 12:26:31
Через uobject/476 надо посмотреть есть ли там реально такие поля. Что бы не выводилась ошибка в случае, если такой группы нет -
строчку $fields = $group->getFields(); заменить на
if ($group) $fields = $group->getFields();

Выложите результат uobject/476 или upage для той страницы, инфу которой пытаетесь вывести
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Vladimir от 18 Февраля 2013, 13:11:03
Если посмотреть на распечатку array(3) {
=> int(248) [1]=> int(372) [2]=> int(383) }, то вы получили массив, а не объект. О чем и  сказано в виде  "Call to a member function getFields() on a non-object in".   И это странно, должен быть объект umiFieldsGroup. Если только юмисофты что-то не поменяли у себя. У вас какая версия?
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 18 Февраля 2013, 13:15:31
<udata xmlns:xlink="http://www.w3.org/TR/xlink" generation-time="0.058873">
<object id="476" name=" Absinth / Абсент" type-id="78" type-guid="catalog-object" ownerId="42">
<properties>
<group id="192" name="common">
<title>Основные параметры</title>
<property id="117" name="h1" type="string">
<title>Поле H1</title>
<value>Absinth / Абсент</value>
</property>
</group>
<group id="195" name="cenovye_svojstva">
<title>Ценовые свойства</title>
<property id="248" name="price" type="price">
<title>Цена</title>
<value xlink:href="udata://emarket/price/476">556</value>
</property>
<property id="372" name="obem" type="optioned">
<title>Объем</title>
<value>
<option int="1">
<object id="558" name="0.35л" type-id="9" type-guid="96e388c0b3b7fd874b48621e850335a8f06ca58d" ownerId="42" xlink:href="uobject://558"/>
</option>
<option int="1" float="156">
<object id="484" name="0,5л" type-id="9" type-guid="96e388c0b3b7fd874b48621e850335a8f06ca58d" ownerId="42" xlink:href="uobject://484"/>
</option>
<option int="1" float="372">
<object id="497" name="0,7л" type-id="9" type-guid="96e388c0b3b7fd874b48621e850335a8f06ca58d" ownerId="42" xlink:href="uobject://497"/>
</option>
</value>
</property>
</group>
<group id="274" name="izobrazheniya">
<title>Изображения</title>
<property id="367" name="osnovnoe" type="img_file">
<title>Основное</title>
<value path="./images/cms/catalog/absent/absinth.jpg" folder="/images/cms/catalog/absent" name="absinth" ext="jpg" width="107" height="400">/images/cms/catalog/absent/absinth.jpg</value>
</property>
<property id="368" name="dopolnitelnoe_1" type="img_file">
<title>Дополнительное 1</title>
<value path="./images/cms/catalog/absent/absinth.jpg" folder="/images/cms/catalog/absent" name="absinth" ext="jpg" width="107" height="400">/images/cms/catalog/absent/absinth.jpg</value>
</property>
<property id="369" name="dopolnitelnoe_2" type="img_file">
<title>Дополнительное 2</title>
<value path="./images/cms/catalog/absent/absinth.jpg" folder="/images/cms/catalog/absent" name="absinth" ext="jpg" width="107" height="400">/images/cms/catalog/absent/absinth.jpg</value>
</property>
</group>
<group id="275" name="opisaniya">
<title>Описания</title>
<property id="371" name="polnoe" type="wysiwyg">
<title>Полное</title>
<value>
<p><span>Абсент &ndash; это уникальный крепкий алкогольный напиток, приготовленный по старинному рецепту с соблюдением всех тонкостей таинства приготовления.</span></p>
</value>
</property>
</group>
<group id="196" name="catalog_option_props">
<title>Опционные свойства</title>
<property id="359" name="strana_proizvoditel" type="relation">
<title>Страна производитель</title>
<value>
<item id="477" name="Чехия" type-id="4" type-guid="d69b923df6140a16aefc89546a384e0493641fbe" ownerId="42" xlink:href="uobject://477"/>
</value>
</property>
<property id="360" name="proizvoditel" type="relation">
<title>Производитель</title>
<value>
<item id="478" name="Palirna u Zeleneho stromu - Starorezna Prostejovстрому" type-id="110" ownerId="42" xlink:href="uobject://478"/>
</value>
</property>
<property id="361" name="soderzhanie_alkogolya" type="relation">
<title>Содержание алкоголя</title>
<value>
<item id="479" name="70%" type-id="112" ownerId="42" xlink:href="uobject://479"/>
</value>
</property>
</group>
<group id="277" name="opcii">
<title>Опции</title>
<property id="374" name="recomend" type="boolean">
<title>Рекомендуемый</title>
<value>1</value>
</property>
</group>
<group id="197" name="catalog_stores_props">
<title>Склады</title>
<property id="249" name="stores_state" type="optioned">
<title>Состояние на складе</title>
<value>
<option int="150" float="1">
<object id="103" guid="emarket-store-27147" name="Основной склад" type-id="47" type-guid="emarket-store" ownerId="42" xlink:href="uobject://103"/>
</option>
</value>
</property>
<property id="251" name="common_quantity" type="int">
<title>Общее количество на складах</title>
<value>100</value>
</property>
</group>
<group id="278" name="rekomenduem">
<title>Рекомендуем</title>
<property id="382" name="rekomenduem" type="symlink">
<title>Рекомендуем</title>
<value>
<page id="77" parentId="48" link="/catalog/absent/absinth_xenta_absent_ksenta/" is-active="1" object-id="487" type-id="78" type-guid="catalog-object" update-time="1360221140" alt-name="absinth_xenta_absent_ksenta" xlink:href="upage://77">
<basetype id="55" module="catalog" method="object">Объекты каталога</basetype>
<name>Absinth Xenta / Абсент Ксента</name>
</page>
<page id="76" parentId="48" link="/catalog/absent/absinth_old_tradition_absent_old_tradishn/" is-active="1" object-id="485" type-id="78" type-guid="catalog-object" update-time="1355825125" alt-name="absinth_old_tradition_absent_old_tradishn" xlink:href="upage://76">
<basetype id="55" module="catalog" method="object">Объекты каталога</basetype>
<name>Absinth Old Tradition / Абсент Олд Традишн</name>
</page>
<page id="75" parentId="48" link="/catalog/absent/absinth_dabel_absent_dabel/" is-active="1" object-id="483" type-id="78" type-guid="catalog-object" update-time="1356369426" alt-name="absinth_dabel_absent_dabel" xlink:href="upage://75">
<basetype id="55" module="catalog" method="object">Объекты каталога</basetype>
<name>Absinth Dabel / Абсент Дабел</name>
</page>
<page id="74" parentId="48" link="/catalog/absent/absinth_absent_svetlozelenyj/" is-active="1" object-id="481" type-id="78" type-guid="catalog-object" update-time="1360221230" alt-name="absinth_absent_svetlozelenyj" xlink:href="upage://74">
<basetype id="55" module="catalog" method="object">Объекты каталога</basetype>
<name>Absinth / Абсент (светло-зеленый)</name>
</page>
</value>
</property>
</group>
</properties>
</object>
</udata>
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 18 Февраля 2013, 13:17:07
Группа есть %)
Версия системы:
Редакция системы   UMI.CMS Shop
Дата последнего обновления   2012-12-10 16:08:59
Версия системы   2.8.6
Ревизия   20874
Драйвер БД   mysql
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Rodogor от 18 Февраля 2013, 15:57:52
Получается такой нишщтяк, что это уже ид полей. getPropGroupByName() возвращает массив ид полей.
Хотелось бы взглянуть на исходный кодэ это функции.

Я проверял вроде на этой же  версии

Редакция системы   UMI.CMS Shop
Дата последнего обновления   2012-12-19 22:46:22
Версия системы   2.8.6
Ревизия   20874
Драйвер БД   mysql

Сдаётся мне где-то путаница.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 18 Февраля 2013, 16:39:46
Хех)
Я щас попробую обновления накатить
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 18 Февраля 2013, 17:51:49
Все осталось по прежнему.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Rodogor от 18 Февраля 2013, 19:49:56
goodprofy категорически прав.

Посмотрел реализацию класса umiObject - действительно эта функция возвращает массив, в котором хранятся поля, id полей.

Странно, что свою шарманку про выбор CMS и про г*внокод я начал в конце темы, а в начале.

Итак, в очередной раз говорю - видно, что только начал разбираться, пока не поздно - выбери другую систему.

Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 19 Февраля 2013, 10:55:22
Саппорт юми подтвердил несоответствие.
Здравствуйте, Юрий.

Проблему вооспроизвели, передали информацию о несоответствии страницы http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobject/getpropgroupbyname/
и результату получаемому в действительности. Номер созданного обращения *******. Мы напишем Вам как только появиться новая информация по данноve обращению.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 19 Февраля 2013, 10:57:01
Rodogor, не люблю я ее за эти лаги, поэтому беру в разработку только стандартный функционал, но клиенту приспичело сделать это уже на работающем, готовом сайте.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: Rodogor от 19 Февраля 2013, 11:04:31
И чо, стандартный функционал работает ? Наверное, что-то не так делаете. :)
У меня чаще бывает так - взяли, клиент проверяет стандартный функционал, он не работает, почти всё уходит на то, что бы побороть эти проблемы.
Техподдержка отвечает ровно до того момента, пока я не формулирую вопрос таким образом, что ответом на вопрос будет явное признание несоответствие заявленной информации/нереализованность функционала и т.п.
Название: Re:Как получить группу полей cenovye_svojstva через API?
Отправлено: goodprofy от 18 Марта 2013, 08:54:53
Ответ юми просто поставил в ступор:
Публикую ответ разработчиков:
Действительно, метод getPropGroupByName класса umiObject возвращает массив из id свойств группы, а не umiFieldsGroup. Баг документации.

Истина в комментариях к методу getPropGroupByName:

/**
 * Получить группу полей по ее строковому идентификатору
 * @param String $prop_group_name Строковой идентификатор группы полей
 * @return array|boolean список идентификаторов полей в группе,
 * либо false если такой группы не существует
 */

Документация исправлена:
http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobject/getpropgroupbyid/ [^]

http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobject/getpropgroupbyname/ [^]

--

Помогите вывести поля :)