Я хочу иметь возможность передавать данные в вызов getChildHtml (). Причина в том, что выход блока зависит от типа продукта. Поэтому я хочу передать продукт в getChildHtml, чтобы он мог принять решение о выводе.
Я делаю это внутри template/checkout/cart/item/default.phtml
.
В идеале звонок должен выглядеть так:
echo $this->getChildHtml('child_block_name', $_item);
Тогда мой блок может получить тип продукта из элемента и отобразить правильный вывод.
Поскольку это определенно невозможно передать эти данные getChildHtml
- как еще можно добиться такого поведения без необходимости переписывать основной блок
В настоящее время у меня есть два решения (ни одно из них не очень привлекательное):
1 - Создайте помощник и получите доступ к выводу html через помощника вместо того, чтобы позволить блоку и шаблону визуализировать его $this->helper('my_module')->getItemHtml($_item);
2 - Доступ к дочернему блоку и setData для него внутри шаблона:
$this->getChild('child_name')->setData('item', $_item);
echo $this->getChildHtml('child_name')
Я думаю, что с точки зрения архитектуры Magento, число 2 - меньшее из двух зол, но чертовски уродливо смотрит в шаблон.
Ответы:
Вы можете добавить метод в родительский блок для извлечения дочернего элемента в зависимости от типа продукта (я видел такую логику пару раз в ядре или что-то подобное):
Тем не менее, видя, как вы изменяете макет XML для добавления дочерних блоков, вас может заинтересовать то, как Magento решила работать с разметкой рендеринга в зависимости от типов продуктов в
Mage_Sales_Block_Items_Abstract::getItemHtml()
иMage_Checkout_Block_Cart_Abstract::getItemHtml()
.источник
Приведенное выше решение не будет работать, если вы отображаете дочерний блок в
foreach
цикле.Для этого вам нужно использовать следующий код:
В child.block вы можете использовать
$this->getMyData()
для получения данных. Используя эту стратегию, дочерний блок всегда будет получать последние данные от родителя.Вторым параметром
getChildHtml()
является$useCache
. Установка его в false предотвращает кэширование первого вывода и вынуждает рендеринг снова.источник
Блок, который может принимать данные, называется виджетом ; хотя это можно сделать с помощью нескольких определений блоков (в зависимости от свойств
$_item
).Magento делает нечто очень похожее в ядре, загружая блок метода оплаты на основе краткого кода метода:
Вы можете сделать то же самое с этим псевдокодом:
Все , что потребуется бы иметь другой тип блока для каждого типа продукта -
bundle
,simple
,configurable
,virtual
,grouped
. Не так уж и плохо.Если вы действительно хотите использовать виджет - это будет эффектом вашей второй идеи в отредактированном вопросе:
Создание виджета, вероятно, выходит за рамки этого ответа - но это не очень сложно, и имеет преимущество, заключающееся в возможности переназначения для блоков CMS, хотя для вашего случая использования я не думаю, что это применимо.
Для получения дополнительной информации о создании виджета:
http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1
источник
Для
Magento 2
, вы можете использоватьЧтобы получить данные,
$block->getMyData();
источник