Instanciando blocos em qualquer lugar do Magento

Os blocos são uma maneira pela qual Magento distingue a matriz de funcionalidades no sistema e cria uma forma modular para controlá-lo a partir de ponto de vista visual e funcional. Contudo não são em todas as páginas, ou em todos os blocos que podem ser inseridos novos blocos somente pelo arquivo de layout.xml .

Existem blocos do tipo “core/text_list” (ou que extendem essa classe) como o “content”, “left” e o “right”, quando estes blocos são renderizados, todos os seus blocos filhos são renderizados ​​automaticamente, sem a necessidade de chamar o método getChildHtml() nos arquivos de template.phtml. Estes blocos permitem facilmente que sejam instanciados novos blocos através de um arquivo de atualização de layout do seu módulo, sem ter que modificar nenhum arquivo de template.phtml do Magento.

Porém existem blocos de outros tipos que só permitem outros blocos dentro, com a chamada do método getChildHtml() nos seus arquivos .phtml. Este post tem por objetivo mostrar uma maneira modular para instanciar blocos dentro de blocos que não sejam “core/text_list” sem precisar alterar nenhum arquivo .phtml do Magento.

Então vamos aos códigos:

Neste exemplo irei instanciar um bloco na pagina do carrinho, segue o arquivo de layout .xml:

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<checkout_cart_index>
<reference name="checkout.cart.coupon">
<block type="fxplabs_teste/checkout_cart" name="checkout.cart.fxplabs-teste-block" as="fxplabs_teste_block" template="fxplabs_teste/template-teste.phtml" />
</reference>
</checkout_cart_index>
</layout>

No seu config.xml declare um observer como a seguir:

<config>
<modules>
<Fxplabs_Teste>
<version>0.0.1</version>
</Fxplabs_Teste>
</modules>
<global>
<models>
<fxplabs_teste>
<class>Fxplabs_Teste_Model</class>
</fxplabs_teste>
</models
<events>
<core_block_abstract_to_html_after>
<observers>
<fxplabs_teste_model_observer_block_output>
<type>singleton</type>
<class>fxplabs_teste/observer_block_output</class>
<method>afterOutput</method>
</fxplabs_teste_model_observer_block_output>
</observers>
</core_block_abstract_to_html_after>
</events>
</global>
</config>

Dentro do observer:

<config>
class Fxplabs_Teste_Model_Observer_Block_Output extends Varien_Object {
public function afterOutput($obj) {
$block = $obj->getEvent()->getBlock();
$transport = $obj->getEvent()->getTransport();
// importante fazer essa verificação porque não funciona nas versões do Magento <= 1.3
if(empty($transport)) {
return $this;
}
$this->appendBlock($block, $transport);
return $this;
}
public function appendBlock($block, $transport) {
if ($block->getBlockAlias() == 'coupon' && $block->getChild('fxplabs_teste_block')) {
$orignal_html = $transport->getHtml();
$st_html = $block->getChildHtml('fxplabs_teste_block');
$new_html = $st_html.$orignal_html;
$transport->setHtml($new_html);
}
return $this;
}
}

Segue o resultado:

imagem-magento-03

[toggle title=”Fonte”]
http://www.fxplabs.com.br/blog/
[/toggle]

2014-07-01T19:28:49+00:00

RECEBA DICAS VALIOSAS NO SEU EMAIL

x