Я пытался найти решение, но без каких-либо результатов. Моя задача – написать модуль. Он должен вставить некоторый html в существующий блок.
Я заметил, что когда я использовал макеты .xml-файлов, я могу просто вставить свой блок в некоторую ссылку, например
<reference name="product.info"> <block type='googlethis/link' name="googlethis" template="catalog/product/googlethis.phtml"/> </reference>
и мой блок также показывает.
В других случаях я должен вызвать метод getChildHtml()
и это не хорошо, потому что он позволяет изменять файлы .phtml.
Так есть способ вставить мой phtml-блок в любой другой phtml-блок без вызова getChildHtml()
?
Есть способ сделать это, хотя это не совсем изящное решение. Он будет работать в большинстве случаев, хотя и оказался полезным иногда.
В основном идея заключается в том, что вы заменяете блок, который хотите отобразить в блоке до / после, в своем макете XML, поместите этот блок как дочерний элемент в свой блок, а затем визуализируйте его до / после вашего.
Итак, допустим, вы хотите вывести блок перед блоком итогов на странице данных корзины, вы можете сделать следующее в layout.xml вашего расширения
<checkout_cart_index> <reference name="checkout.cart"> <block type="myextension/block" name="myextension.block" as="myextension_block" template="myextension/template.phtml"> <action method="setChild"><name>totals</name><block>totals</block></action> </block> <action method="setChild"><name>totals</name><block>myextension.block</block></action> </reference> </checkout_cart_index>
Затем в файле template.phtml вы должны:
<div id="myextension"> // Your template code </div> // Render the totals block that you placed inside your block <?php echo $this->getChildHtml('totals'); ?>
Как я уже сказал, это не будет соответствовать каждой ситуации, и это не невероятно элегантно, но это действительно работает.
Джон
Нет, нет общего способа добавить ваш блок в любой другой блок. Причина, по которой он иногда работает для вас, заключается в том, что существуют некоторые типы блоков, которые просто перечисляют их дочерние core/text_list
( core/text_list
является одним из них), а некоторые шаблоны вручную делают то же самое (используя $this->getChild()
).
Если вы хотите добавить свой блок под блоком, который не соответствует ни одному из этих критериев, вам нужно будет изменить шаблон для эха этого блока.
Вы можете попробовать добавить в xml – следующий метод output = "toHtml" – поместит блок в родительский блок But …
<reference name="product.info"> <block type='googlethis/link' name="googlethis" output="to Html" template="catalog/product/googlethis.phtml"/> </reference>
Это ограничение возможно путем добавления в xml – следующий метод output = "toHtml" – поместит блок в родительский блок
<reference name="product.info"> <block type='googlethis/link' name="googlethis" as="googlethis" output="toHtml" template="catalog/product/googlethis.phtml"/> </reference>
С выходом метода = «toHtml» в макете блок отбрасывается в конце документа. Я тестировал
<catalog_product_view> <reference name="media"> <block type="pricetag/catalog_product_view" name="catalog.product.price.tag" template="pricetag/price.phtml" output="toHtml" /> </reference> </catalog_product_view>
И magento предоставил мой блок после завершения тега html
Я считаю, что вы не можете выводить блок, не имея его в показанном шаблоне. Поэтому, если вы создаете расширение для создания своего блока, вам нужно вызвать его в шаблоне, где вы хотите. К сожалению, это означает, что кто-то может добавить ваше расширение на свой веб-сайт, и если они создали свою собственную копию файла шаблона, где добавлен ваш блок, потому что они хотели изменить его в своей теме, ну ваш блок там не покажется. Им придется выяснить, что ваш модуль нуждается в модификации шаблона и внесении изменений в собственный шаблон.
Блок может выводить себя без output="toHtml"
в шаблоне, если вы добавляете к output="toHtml"
атрибут output="toHtml"
но, как указывали некоторые другие, это приведет к тому, что блок будет отображаться после </html>
. Это нормально, потому что output="toHtml"
– это то, что делает работу корневого блока. Корневой блок не может быть включен в шаблон, поскольку он не имеет родителя, поэтому он использует атрибут output="toHtml"
и он выдает его. Это работает, потому что, когда Magento отображает свой макет (строит HTML-страницу), он вызывает метод getOutput () класса Mage_Core_Model_Layout, и этот метод действительно просто получает все блоки, которые имеют выходной параметр и выталкивают их на странице 1 на 1 Обычно вы должны иметь только 2 таких блока, root и «core_profiler». (да, это означает, что профайлер будет отображаться после закрытия HTML-тега).
Я нашел элегантное решение с помощью Observer и написал сообщение в блоге компании: http://www.fxplabs.com.br/blog/instanciando-blocos-em-qualquer-lugar-magento/
перевод на английский:
http://translate.google.com/translate?sl=pt&tl=en&js=n&prev=_t&hl=pt-BR&ie=UTF-8&eotf=1&u=http%3A%2F%2Fwww.fxplabs.com.br%2Fblog%2Finstanciando- blocos-эм-qualquer-Лугара-Magento% 2F