Добавление блоков на этапе проверки Magento Checkout - PullRequest
2 голосов
/ 03 марта 2012

Я строю расширение для добавления определенного блока прямо перед кнопкой «Разместить заказ» в оформлении заказа на одной странице Magento. У меня возникли проблемы с поиском правильных заклинаний, чтобы просто добавить блок в этот раздел, а тем более получить его до / после другого дескриптора. Цель состоит в том, чтобы задействовать это переопределение без каких-либо изменений шаблона.

В XML моего расширения у меня есть:

<checkout_onepage_review>
    <reference name="root">
        <block type="myextension/blockname" name="myextension.block" template="myextension/block.phtml" before="checkout.onepage.review.button" />
    </reference>
</checkout_onepage_review>

myextension / block.phtml на данный момент является простым блоком текста. Я знаю, что общий синтаксис правильный, так как я могу добавить свой в checkout_cart_index и увидеть его очень хорошо. Я что-то упускаю из виду?

Спасибо!

1 Ответ

7 голосов
/ 04 марта 2012

Фон

Не все блоки выводят свои дочерние блоки автоматически.Только блоки типа core/text_list и шаблоны, в которых вызывается echo $this->getChildHtml() (без аргументов).
Дочерние блоки шаблонов отображаются при вызове echo $this->getChildHtml('child_alias').
Это имеет смысл, если вы подумаете об этом -дочерние элементы блоков шаблона должны быть расположены где-то в контексте шаблона HTML.
Что касается вашего вопроса, функциональных различий между дескрипторами макета checkout_onepage_review и checkout_cart_index нет, кроме того, что они ссылаются на разные страницы.

Добавление содержимого к обзору оформления заказа

Блок проверки извлечения содержит двух core/text_list детей, к которым можно добавить детей с помощью макета XML, который будет автоматически отображаться.

<checkout_onepage_review>
    <reference name="checkout.onepage.review.info.items.before">
        <block type="core/text" name="review.test.1">
            <action method="setText">
                <text>Test Block Before</text>
            </action>
        </block>
    </reference>
    <reference name="checkout.onepage.review.info.items.after">
        <block type="core/text" name="review.test.2">
            <action method="setText">
                <text>Test Block After</text>
            </action>
        </block>
    </reference>
</checkout_onepage_review>

Единственная проблема заключается в том, что блок checkout.onepage.review.info.items.after отображается перед блоком соглашений, поэтому в вашем случае он может быть недостаточно хорошим.
Соглашения отображаются с этим кодом:

<?php foreach ($this->getAgreements() as $_a): ?>
    <li>
        <div class="agreement-content"<?php echo ($_a->getContentHeight() ? ' style="height:' . $_a->getContentHeight() . '"' : '')?>>
            <?php if ($_a->getIsHtml()):?>
                <?php echo $_a->getContent() ?>
            <?php else:?>
                <?php echo nl2br($this->htmlEscape($_a->getContent())) ?>
            <?php endif; ?>
        </div>
        <p class="agree">
            <input type="checkbox" id="agreement-<?php echo $_a->getId()?>" name="agreement[<?php echo $_a->getId()?>]" value="1" title="<?php echo $this->htmlEscape($_a->getCheckboxText()) ?>" class="checkbox" /><label for="agreement-<?php echo $_a->getId()?>"><?php echo $_a->getIsHtml() ? $_a->getCheckboxText() : $this->htmlEscape($_a->getCheckboxText()) ?></label>
        </p>
    </li>
<?php endforeach ?>

Если вы хотите добавить блок после соглашений, прямо перед кнопкой «Разместить заказ», без изменения шаблона,и, не переписывая блок соглашений, вы можете попытаться добавить дополнительный элемент в конец коллекции checkout/agreements, установив для is_html значение true, и вы получите вывод content.
.проблематично, потому что модель соглашений, ресурс и коллекция не предлагают пользовательский префикс события.

К чему это сводится, если предоставленный блок checkout.onepage.review.info.items.after не работает, это следующие опции.Каждый из них по-своему безобразен, поэтому вы выбираете самое маленькое зло:

  • Соблюдайте core_block_abstract_to_html_before, упомянутое в сообщении, на которое ссылаются в комментариях
  • СоблюдайтеСобытие core_collection_abstract_load_before и добавление HTML-соглашения на лету
  • Перепишите блок checkout/agreements и перегрузите метод _toHtml()

Моя рекомендация состоит в том, чтобы каким-то образом использоватьcheckout.onepage.review.info.items.after блок - это решение было бы намного приятнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...