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

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

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Не могу в целом понять устройство API UMI, из-за этого проблема с получением группы полей.
Техподдержка пояснила что группу полей можно получить через класс umiObject
http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobject/
Но при использовании методов класса мне пишет что метод не существует.

В справочнике для объекта каталога по умолчанию идет группа полей cenovye_svojstva, в ней содержатся основная цена, объем - составное поле(литры, и наценка), так же возможно будет год, вес и все что захочет контент менеджер. Чтобы постоянно не лазить в код необходимо при помощи АПИ вывести все поля группы cenovye_svojstva в массив, а массив уже обработать шаблоном, в котором будет выводится цена с наценкой и кнопка купить.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #1 : 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 и его кастомизации.
« Последнее редактирование: 14 Февраля 2013, 19:57:18 от Rodogor »

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #2 : 15 Февраля 2013, 14:07:10 »
А $objectid - Это ID страницы?

А то мне выдает Call to a member function getFields() on a non-object

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #3 : 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, какие у них методы и какие результаты возврвщают эти методы.
« Последнее редактирование: 15 Февраля 2013, 15:01:44 от Rodogor »

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #4 : 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) {
  • => int(248) [1]=> int(372) [2]=> int(383) }



Код:
$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

Я уже туплю...
Что не так то?

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #5 : 15 Февраля 2013, 17:10:40 »
Странно, у меня работает.
id страницы откуда берётся ? Реально такая страница существует ?

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

Сейчас получается, что $group не является объектом. Надо смотреть как оно получается, где затык и т.п..

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #6 : 18 Февраля 2013, 11:26:54 »
ID страницы берется из %custom all_price(%id%)%
Страница существует /admin/catalog/edit/73/ работаю только с ней пока.

$group содержит array(3) {
  • => int(248) [1]=> int(372) [2]=> int(383) }


$objectid = int(476)

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #7 : 18 Февраля 2013, 12:26:31 »
Через uobject/476 надо посмотреть есть ли там реально такие поля. Что бы не выводилась ошибка в случае, если такой группы нет -
строчку $fields = $group->getFields(); заменить на
if ($group) $fields = $group->getFields();

Выложите результат uobject/476 или upage для той страницы, инфу которой пытаетесь вывести

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #8 : 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. Если только юмисофты что-то не поменяли у себя. У вас какая версия?

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #9 : 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>

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #10 : 18 Февраля 2013, 13:17:07 »
Группа есть %)
Версия системы:
Редакция системы   UMI.CMS Shop
Дата последнего обновления   2012-12-10 16:08:59
Версия системы   2.8.6
Ревизия   20874
Драйвер БД   mysql

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #11 : 18 Февраля 2013, 15:57:52 »
Получается такой нишщтяк, что это уже ид полей. getPropGroupByName() возвращает массив ид полей.
Хотелось бы взглянуть на исходный кодэ это функции.

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

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

Сдаётся мне где-то путаница.

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #12 : 18 Февраля 2013, 16:39:46 »
Хех)
Я щас попробую обновления накатить

*

goodprofy

  • *
  • 29
  • +1/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #13 : 18 Февраля 2013, 17:51:49 »
Все осталось по прежнему.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Как получить группу полей cenovye_svojstva через API?
« Ответ #14 : 18 Февраля 2013, 19:49:56 »
goodprofy категорически прав.

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

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

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