2012-03-03 14 views
8

Problemas para configurar una plantilla de bloque en el diseño xml de Magento. Estoy intentando establecer la plantilla de un bloque secundario, no el diseño completo de la página (casi todos los documentos explican cómo establecer la plantilla del diseño).Establecer la plantilla de bloque de Magento en el diseño xml

Antecedentes: soy actualizando un manejador de diseño en mi acción personalizada, usando la etiqueta <update /> en el diseño de mi módulo xml.

Básicamente, quiero reutilizar el diseño y los bloques de la acción de vista de producto integrada, pero proporciono plantillas personalizadas para algunos bloques. (No solo reemplaza, estas deben ser nuevas plantillas que solo se activan en mi acción personalizada y que son anulables).

Mi diseño html:

<?xml version="1.0"?> 
<layout version="0.1.0"> 
<mymodule_product_index> 
    <update handle="catalog_product_view" /> 
    <reference name="content"> 
     <block type="catalog/product_view" 
     name="product.info" output="toHtml" template="mymodule/product.phtml" /> 
     </reference> 

    <reference name="product.info.bundle"> 
     <action method="setTemplate"><template>mymodule/customtemplate.phtml</template></action> 
    </reference> 
</mymodule_product_index> 
</layout> 

El setTemplate en product.info.bundle nunca funciona; no parece afectar el diseño en absoluto. He intentado envolver el <reference> en otros nodos <reference> de los bloques principales sin ningún efecto. ¿Es posible reemplazar las plantillas de bloques de esta manera? Siento que mi problema se debe al hecho de que estoy usando un <update />.

Por cierto, lo que sé es que se está cargando mi diseño xml y no hay errores, el resto del archivo está trabajando muy bien, el almacenamiento en caché está desactivada, se han borrado la memoria caché de todos modos, etc.

+1

¿Sabes lo que significa/doing update tag? La etiqueta de actualización, tomando el manejador de actualización que es y fusionar, que contiene el layout.xml actual –

+0

. Consulta este enlace [Magento Layout XML's] (http://magebase.com/magento-tutorials/demystifying-magentos-layout- xml-part-1 /) –

+0

@ OğuzÇelikdemir Sí, es por eso que estoy usando la etiqueta ''; Deseo tomar un diseño existente y reutilizarlo. He utilizado la página a la que hizo referencia de manera bastante extensa; es un gran recurso ... aunque los únicos ejemplos 'setTemplate' cambian el diseño, no una plantilla de bloque. –

Respuesta

18

Su enfoque es casi correcto.
dos cosas:
1. Establecer una nueva plantilla en lugar de instanciar un nuevo bloque
En lugar de simplemente asignar una plantilla diferente al bloque product.info, se está creando una nueva instancia con el mismo nombre, en sustitución de la instancia original , y luego la nueva plantilla se establece en eso. En su lugar utilizar este:

<mymodule_product_index> 
    <update handle="catalog_product_view" /> 
    <reference name="product.info"> 
     <action method="setTemplate"> 
      <template>mymodule/product.phtml</template> 
     </action> 
    </reference> 
</mymodule_product_index> 

que debe tener el cuidado de la plantilla de vista del producto de una manera limpia.

2. orden de procesamiento de la manija
Si nos fijamos en donde se declara el bloque de vista product.info.bundle para los productos en paquete, verá que ocurre en el archivo bundle.xml, en un mango de actualización de diseño llamada <PRODUCT_TYPE_bundle>.

Su código hace referencia al bloque desde el controlador de diseño <[route]_[controller]_[action]>, es decir, <mymodule_product_index>.

Lo que debe tenerse en cuenta aquí es la orden de procesamiento de los identificadores de diseño. Aproximadamente que es:

  1. <default>
  2. <[route]_[controller]_[action]>
  3. <custom_handles>

El mango <PRODUCT_TYPE_bundle> pertenece al tercer tipo de asas de diseño, lo que significa que se procesa después de la manija <mymodule_product_index>.
Básicamente, está haciendo referencia al bloque product.info.bundle antes de que se haya declarado.

Para solucionar este problema, también deberá utilizar el asa <PRODUCT_TYPE_bundle>. Por supuesto, esto afectará a todas las exhibiciones de productos agrupados. Al usar XML de diseño solo no hay una forma limpia de solucionarlo.

Aquí hay algunas sugerencias de cómo resolver ese problema.

Puede crear una ruta separada en su módulo para mostrar los productos incluidos, y luego incluir el identificador <PRODUCT_TYPE_bundle> usando una directiva update para esa página, también.

En su controlador de acción personalizada, puede agregar otro controlador de actualización de diseño que se procesa después de<PRODUCT_TYPE_bundle>.

Puede usar un observador de eventos para establecer la plantilla en el bloque product.info.bundle si se crea una instancia. Una posibilidad sería el evento controller_action_layout_generate_blocks_after.

Ya se entiende, hay muchas maneras de evitar esto, pero requieren PHP.

+0

Gracias por su visión, fue muy útil. Lo hice funcionar usando su enfoque de observador de eventos. –

Cuestiones relacionadas