¿Es posible cambiar el tipo de bloque en el diseño XML?

13

¿Es posible cambiar un tipo de bloque en el diseño XML?

Sé cómo cambiar la plantilla usando el setTemplatemétodo, pero estoy tratando de cambiar el tipo de un bloque. es posible?

Marty Wallace
fuente
favor de explicar en detalle lo que usted tiene que cambiar
Keyul Shah

Respuestas:

7

Cambiar el tipo de bloque significa cambiar la clase de bloque, así que no, pero ...

... simplemente puedes sobrescribir el bloque:

  1. Encuentre un controlador de diseño que se invoque más tarde O asegúrese de que layout.xmlse procesa después de crear el bloque, por ejemplo, con <depends>inCompany_Module.xml
  2. Simplemente cree un nuevo bloque de otro tipo con el mismo nombre

El problema es que esto sobrescribe el bloque y no cambia el tipo. Esto significa que todo lo que se hace en este bloque entre la creación y su cambio se pierde.

Por ejemplo para cambiar el 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
fuente
1
También puede crear una nueva clase de bloque que "herede" la clase de bloque que desea reemplazar. Deberá agregar una entrada en config.xml de su extensión personalizada para intercambiar la clase de bloque con la suya. Esto tendría sentido si planea extender o modificar la funcionalidad del bloque.
Biagio Arobba
3

No puede cambiarlo en los archivos de diseño afaik. Sin embargo, puede extenderlos y anularlos en sus archivos de configuración.

Ejemplo:

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

Recuerda extender el bloque original.

smdev
fuente
1

Estaba enfrentando un problema similar que necesito para actualizar un bloque específico para un diseño específico.

Lo que termino haciendo y parece funcionar es (en el archivo de diseño)

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

Espero que esto ayude.

Alvin Nguyen
fuente