UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: danger от 06 Августа 2015, 10:28:08

Название: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: danger от 06 Августа 2015, 10:28:08
Есть три пункта меню "Проекты": эконом, комфорт, премиум:
<items>
<item id="7" link="/proekty/ekonom/" name="Эконом" alt-name="ekonom" xlink:href="upage://7">Эконом</item>
<item id="8" link="/proekty/komfort/" name="Комфорт" alt-name="komfort" xlink:href="upage://8">Комфорт</item>
<item id="9" link="/proekty/premium/" name="Премиум" alt-name="premium" xlink:href="upage://9">Премиум</item>
</items>
<?php foreach ($variables['items']['nodes:item'] as $item): ?>          
 <?=$item['node:text']?>
 <?php endforeach; ?>
Мне нужно по id страницы вставить в пункты меню картинки и некоторый текст, сначала пишу:
<?= $this->getPageById(7)->getValue('cena') ?>
Получаю под каждым пунктом цену эконома, тогда пробую следующее:
<?= $this->getPageById($item['attribute:id'])->getValue('cena') ?>
Понятно, что не правильно, непонятно, как правильно!!! Спасайте!! Метод тыка не помогает!!!
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: admin от 14 Августа 2015, 17:01:12
php шаблонизатор?
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: e.ioffe от 25 Августа 2015, 12:43:47
Для начала

<?php foreach ($variables['items']['nodes:item'] as $item): ?>          
 <?var_dump($item);?>
 <?php endforeach; ?>
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: vicliner от 13 Февраля 2016, 21:47:39
e.ioffe, в переменной кроме ID нетникакой полезной информации. Поэтому ваш совет можно считать бесполезным.

danger, я решил задачу так:

   <ul>
        <? $hierarchy = umiHierarchy::getInstance();?>
        <?php foreach ($variables['items']['nodes:item'] as $item): ?>
           <li class="item">
            <? $page = $hierarchy->getElement($item['@id']); ?>
               <a href="<?=$item['@link']?>" class="name_link"><?=$item['node:text']?></a>
               Дополнительное поле ---> <?=$page->getValue('sub_title');?>
            </li>
            <?php endforeach; ?>
        </ul>


Еще как вариант вместо <?=$page->getValue('sub_title');?> использовать <?=$page->sub_title;?>

Документация http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchyelement/
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: crazygeorgio от 13 Февраля 2016, 22:57:43
про extProps и extGroups не слышали???
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: e.ioffe от 02 Марта 2016, 23:17:38
   <ul>
        <? $hierarchy = umiHierarchy::getInstance();?>
        <?php foreach ($variables['items']['nodes:item'] as $item): ?>
           <li class="item">
            <? $page = $hierarchy->getElement($item['@id']); ?>
               <a href="<?=$item['@link']?>" class="name_link"><?=$item['node:text']?></a>
               Дополнительное поле ---> <?=$page->getValue('sub_title');?>
            </li>
            <?php endforeach; ?>
        </ul>

В php-шаблонизаторе есть helper getPageById();, который делает все то же, что и
$hierarchy = umiHierarchy::getInstance();
, но много изящнее.
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: vicliner от 03 Марта 2016, 11:39:02
Согласен!

Но недавно общался с тех.поддержкой по этому поводу.
Спросил что лучше использовать  extProps и extGroups  или  $hierarchy = umiHierarchy::getInstance();
Вот ответ:
Проще всего это сделать через extProps или extGroups.
Ваш вариант может повлиять на быстродействие сайта в большей степени чем вывод свойств через параметр extProps.

Так что лучше крутить extProps или extGroups, как и посоветовал  crazygeorgio.
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: e.ioffe от 03 Марта 2016, 11:50:11
Мой опыт подсказывает, что без включенного кеша extProps и extGroups для php медленнее, чем получение значений напрямую из объекта. Разница становится ощутимой при использовании extGroups с большим количеством полей (более 10).
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: crazygeorgio от 03 Марта 2016, 11:56:21
С кешем и количеством полей запутал немного, т.е. если полей много, то лучше обращаться напрямую к объекту, если немного, то не имеет особой разницы? Так твой опыт подсказывает? Или вообще в принципе быстрее использовать обращение напрямую без кеша?
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: e.ioffe от 03 Марта 2016, 12:06:03
По кешированию.

Если на сайте включено кеширование, то параметры, переданные в extProps и extGroups попадут в кеш. Поэтому первый запрос будет тяжелым (все данные сохраняются в кеш), а последующие - легкими (все данные забираются из кеша).

По скорости работы.

Измерял на нескольких магазинах на разных хостингах с выключенным кешем (при включении могут быть другие результаты). Запрос вида
 $this->macros('catalog', 'getObjectsList', array(), array('price'), array('object_item_properties'))


где extProps = price и extGroups = 'object_item_properties' и его обработка средствами php выполнялись дольше, чем

 
$entity = $this->getPageById($item['attribute:id']);
$price = $entity->getValue('price');
$objectProperty1 = $entity->getValue('property_1');
$objectProperty2 = $entity->getValue('property_2');
$objectProperty3 = $entity->getValue('property_3');

Для себя пришел к выводу, что для простых случаев можно использовать getPageById, а для сложных лучше писать свои кастомы, которые возвращают что-то вроде

array('items' => array('nodes:item' => array(
array(
'attribute:id' => $id,
'node:text' => $name,
'price' => $price,
'property_1' => $property1,
'property_2' => $property2
)
));

Кеш юми стараюсь включать как можно реже, так как иногда дает непредсказуемый результат (последний билд с кешем еще не тестировал).
Название: Re: Как в пункты меню добавить информацию с этих пунктов?
Отправлено: aghigay от 05 Марта 2016, 16:21:38
Согласен с e.ioffe, кеширование реально очень часто дает непредсказуемый результат.
И раз уж тут подняли эту тему - может стоит попросить юмивцев сделать нестройки кеша не методом исключения, а методом включения? Ну то есть сейчас можно сказать: не кешируй вот это и вот это. А логичнее было бы сказать: кешируй вот это и вот это. Тогда и управляемость остается и предсказуемость гораздо выше, ведь так?