Magento. Вмъкване на блок в друг без промяна на кода на шаблона

Опитах се да намеря решение, но без резултат. Моята задача е да напиша модул. Трябва да вмъкне малко html в съществуващ блок.

Забелязах, че когато използвах оформление .xml файлове, мога просто да вмъкна моя блок в някаква препратка като

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

и моят блок също показва.

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

И така, има ли начин да вмъкна моя phtml блок във всеки друг phtml блок, без да извиквам getChildHtml()?


person Yaroslav Rogoza    schedule 18.05.2011    source източник


Отговори (7)


Има начин да направите това, въпреки че не е съвсем елегантно решение. Въпреки това ще работи в повечето случаи и понякога се оказва полезен.

По принцип идеята е да замените блока, който искате да изобразите преди/след своя блок, във вашия 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'); ?>

Както казах, това няма да пасне на всяка ситуация и не е невероятно елегантно, но върши работа.

Джон

person Jon    schedule 26.05.2011
comment
това е чудесно решение, харесва ми - person Jonathan Day; 27.05.2011
comment
Страхотен! Това е, което търсих! - person Yaroslav Rogoza; 18.06.2012

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

Ако искате да добавите своя блок под блок, който не отговаря на нито един от тези критерии, ще трябва да промените шаблона, за да повторите този блок.

person Joseph Mastey    schedule 18.05.2011
comment
Също. Можем ли да открием по някакъв начин кой блок може да се използва като справка в конфигурацията на оформлението за изход без getChildHtml() и кой не? Благодаря - person Yaroslav Rogoza; 18.05.2011
comment
Проверката за типа блок на core/text_list ще бъде първата стъпка. В противен случай, grep директорията на шаблона за $this->getChild() извикванията. - person Joseph Mastey; 18.05.2011

Можете да опитате да добавите към xml - следният метод output="toHtml" - ще постави блок към родителски блок, но...

<reference name="product.info">
    <block type='googlethis/link' name="googlethis" output="to Html" template="catalog/product/googlethis.phtml"/>
</reference>
person Alex    schedule 26.05.2012

Това ограничение е възможно чрез добавяне към xml - следвайки метода output="toHtml" - ще постави блок в родителски блок

<reference name="product.info">
    <block type='googlethis/link' name="googlethis" as="googlethis" output="toHtml" template="catalog/product/googlethis.phtml"/>
</reference>
person naveenos    schedule 31.01.2014

С метода 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

person Will    schedule 11.07.2012

Вярвам, че не можете да изведете блок, без да го имате в шаблон, който е показан. Така че, ако направите разширението си върху създаването на вашия блок, трябва да го извикате в шаблона, където искате. За съжаление това означава, че някой може да добави вашето разширение на уебсайта си и ако е създал свое собствено копие на шаблонния файл, където е добавен блокът ви, защото иска да го промени в своята тема, вашият блок няма да се покаже там. Те ще трябва сами да разберат, че вашият модул се нуждае от модификация на шаблон и сами да поставят модификацията в своя собствен шаблон.

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

person PVL    schedule 01.11.2016

Намерих елегантно решение с помощта на 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

person Ayrton Weiss    schedule 02.04.2013
comment
моля, напишете за отговора си тук, вместо да публикувате връзката, благодаря! - person Stanley; 02.04.2013