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

Я пытался найти решение, но безрезультатно. Моя задача - написать модуль. Он должен вставить немного HTML в существующий блок.

Я заметил, что когда я использовал макет .xml файлов, я могу просто вставить свой блок в какую-то ссылку, например

<reference name="product.info">
    <block type='googlethis/link' name="googlethis" 
           template="catalog/product/googlethis.phtml"/>
</reference>

и мой блок тоже показывает.

В других случаях я должен вызывать метод getChildHtml(), и это не очень хорошо, потому что он позволяет изменять файлы .phtml шаблона.

Так есть ли способ вставить мой блок phtml в любой другой блок phtml без вызова getChildHtml()?

Ответы [ 7 ]

21 голосов
/ 26 мая 2011

Есть способ сделать это, хотя это не совсем элегантное решение. Это будет работать в большинстве случаев, хотя и оказалось полезным в некоторых случаях.

По сути, идея заключается в том, что вы заменяете блок, который хотите визуализировать, до / после в 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'); ?>

Как я уже сказал, это не подходит для любой ситуации, и это не невероятно элегантно, но работает.

Jon

3 голосов
/ 18 мая 2011

Нет, нет общего способа добавить свой блок в любой другой блок. Причина, по которой это иногда работает для вас, состоит в том, что есть некоторые типы блоков, которые просто перечисляют своих потомков (core/text_list является одним из них), и некоторые шаблоны вручную делают то же самое (используя $this->getChild()).

Если вы хотите добавить свой блок под блоком, который не соответствует ни одному из этих критериев, вам нужно будет изменить шаблон, чтобы повторить этот блок.

2 голосов
/ 31 января 2014

Ограничение возможно при добавлении в xml - следующий метод output = "toHtml" - поместит блок в родительский блок

<reference name="product.info">
    <block type='googlethis/link' name="googlethis" as="googlethis" output="toHtml" template="catalog/product/googlethis.phtml"/>
</reference>
2 голосов
/ 26 мая 2012

Вы можете попробовать добавить в xml - следующий метод output = "toHtml" - поместит блок в родительский блок Но ...

<reference name="product.info">
    <block type='googlethis/link' name="googlethis" output="to Html" template="catalog/product/googlethis.phtml"/>
</reference>
1 голос
/ 11 июля 2012

При методе output = "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 end

0 голосов
/ 01 ноября 2016

Я считаю, что вы не можете вывести блок, не имея его в показанном шаблоне.Так что если вы делаете свое расширение поверх создания своего блока, вам нужно вызвать его в шаблоне, где вы хотите.К сожалению, это означает, что кто-то может добавить ваше расширение на свой веб-сайт, и если он создал свою собственную копию файла шаблона, куда добавляется ваш блок, потому что он хотел изменить его в своей теме, то ваш блок там не будет отображаться.Им придется самим выяснить, что вашему модулю нужна модификация шаблона, и самим поместить модификацию в свой собственный шаблон.

Блок может сам выводиться без вызова в шаблоне, если вы добавите output="toHtml"атрибут, но, как указали некоторые другие, это приведет к визуализации блока после тега </html>.Это нормально, потому что output="toHtml" - это то, что заставляет работать корневой блок.Корневой блок не может быть включен в шаблон, потому что у него нет родителя, поэтому он использует атрибут output="toHtml" и заставляет его выходить.Это работает, потому что, когда Magento отображает свой макет (создает HTML страницы), он вызывает метод getOutput () класса Mage_Core_Model_Layout, и этот метод действительно просто получает все блоки, которые имеют выходной параметр, и вытаскивает их на странице 1 на 1Обычно у вас должно быть только 2 таких блока, root и «core_profiler».(да, это означает, что профилировщик будет отображаться после закрывающего тега HTML).

0 голосов
/ 02 апреля 2013

Я нашел элегантное решение с помощью 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-em-qualquer-lugar-magento%2F

...