Есть три пункта меню "Проекты": эконом, комфорт, премиум:
<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') ?>
Понятно, что не правильно, непонятно, как правильно!!! Спасайте!! Метод тыка не помогает!!!
Для начала
<?php foreach ($variables['items']['nodes:item'] as $item): ?>
<?var_dump($item);?>
<?php endforeach; ?>
<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();
, но много изящнее.
По кешированию.
Если на сайте включено кеширование, то параметры, переданные в 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
)
));
Кеш юми стараюсь включать как можно реже, так как иногда дает непредсказуемый результат (последний билд с кешем еще не тестировал).