Magento. Вставить блок в другой без кода шаблона изменения

Я пытался найти решение, но без каких-либо результатов. Моя задача – написать модуль. Он должен вставить некоторый 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