Для модуля, над которым я работаю, я хочу добавить блок на экране корзины покупок, хочу сделать это ненавязчиво, и я бы хотел разместить его под содержимым корзины и перед другими блоками (купон, оценка доставки, итоги, ...).
Мне удалось сделать ненавязчивую часть: наблюдатель слушает controller_action_layout_load_before
, и если FullNameAction равно checkout_cart_index
, он добавляет дескриптор моего файла обновления макета xml :
наблюдатель:
public function showUpperGifts($observer)
{
$fullNameAction = $observer->getEvent()->getAction()->getFullActionName();
if ($this->_isEnabled &&
($fullNameAction == 'checkout_cart_index')) {
$layoutUpdate = $observer->getEvent()->getLayout()->getUpdate()
->addHandle('my_special_handle');
}
}
и файл макета:
<my_special_handle>
<reference name="content">
<block type="module/block" name="module_block" template="module/block.phtml"/>
</reference>
</my_special_handle>
При этом отображается содержимое моего phtml-файла, но я не могу разместить его там, где хочу.
Моей первой попыткой было использование атрибута before="name.of.block"
, но он не работает. Если я использую before="whatever"
, он идет перед всем внутри блока checkout.cart
, а если я использую after="whatever"
, он идет после всего. Короче говоря, это не учитывает содержание before
или after
.
Просматривая файлы макетов XML основных модулей Magento, я понял, что эти аргументы для before
и after
появляются только тогда, когда блоки, которые они размещают после или до, находятся внутри правого / левого столбцов. Так что я думаю, что это что-то особенное для этих столбцов.
Итак, мой вопрос, могу ли я указать местоположение моего блока внутри контента? И да, как?
Другим решением было бы загрузить блок асинхронно, так как я мог бы затем добавить к div по своему выбору результат вызова AJAX, но я бы предпочел сделать это «обычным» способом, если смогу.
Спасибо за чтение:)