É possível alterar o tipo de bloco no XML do layout?

13

É possível alterar um tipo de bloco no XML do layout?

Eu sei como alterar o modelo usando o setTemplatemétodo, mas estou tentando alterar o tipo de um bloco. Isso é possível?

Marty Wallace
fonte
por favor explicar em detalhes o que você tem que mudar
Keyul Shah

Respostas:

7

Alterar o tipo de bloco significa alterar a classe de bloco, então não, mas ...

... você pode simplesmente substituir o bloco:

  1. Encontre um identificador de layout que seja chamado posteriormente OU certifique-se de que o seu layout.xmlseja processado após a criação do bloco, por exemplo, com <depends>inCompany_Module.xml
  2. Basta criar um novo bloco de outro tipo com o mesmo nome

O problema é que isso substitui o bloco e não altera o tipo. Isso significa que tudo o que é feito nesse bloco entre a criação e sua alteração é perdido.

Por exemplo, para alterar o catalog.navigation:

<layout version="0.1.0">
    <catalog_category_default translate="label">
        <reference name="left">
            <block type="myModule/navigation" name="catalog.leftnav" after="currency" template="myModule/catalog/navigation/left.phtml"/>
        </reference>
    </catalog_category_default>
</layout>
Fabian Blechschmidt
fonte
1
Você também pode criar uma nova classe de bloco que "herda" a classe de bloco que deseja substituir. Você precisará adicionar uma entrada no config.xml da sua extensão personalizada para trocar a classe de bloco pela sua. Isso faria sentido se você planeja estender ou modificar a funcionalidade do bloco.
Biagio Arobba 02/03
3

Você não pode alterá-lo nos arquivos de layout disponíveis. Você pode, no entanto, estendê-los e substituí-los em seus arquivos de configuração.

Exemplo:

<config>
    <global>
        <blocks>
            <catalog>
                <rewrite><product_view>My_Custom_Block_Product_View</product_view></rewrite>
            </catalog>
        </blocks>
    </global>
</config>

Lembre-se de estender o bloco original.

smdev
fonte
1

Eu estava enfrentando um problema semelhante que preciso atualizar um bloco específico para um layout específico.

O que acabo fazendo e parece funcionar é (no arquivo de layout)

<controller_x_y>
    <reference name="block_name_reference">
        <block type="mymodule/customblock" name="block_name_reference" />
    </reference>
</controller_x_y>

Espero que isto ajude.

Alvin Nguyen
fonte