2011-04-26 17 views
8

Tengo un módulo de productos destacados que escribí que coloca un bloque personalizado en la página con una lista de productos que coinciden con los atributos que he definido en el bloque. Originalmente lo tenía funcionando agregando una línea {{block...}} a la sección Contenido de la página CMS. Esto funcionó bien, pero no recibí el buscapersonas. Por lo tanto, me fijo que al eliminar la línea {{block...}} de la sección de contenido XML y añadiendo a la sección XML Disposición de actualización de este modo:¿Cuál es la forma correcta de hacer actualizaciones de diseño con páginas CMS?

<reference name="content"> 
    <block type="cms/block" name="product_list_top" /> 
    <block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml"> 
     <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml"> 
      <block type="page/html_pager" name="product_list_toolbar_pager"/> 
     </block> 
     <action method="setToolbarBlockName"><name>product_list_toolbar</name></action> 
     <action method="setAttributeName"><name>my_attribute</name></action> 
    </block> 
</reference> 

Esto también funcionaba muy bien. Entonces decidí, dado que hay tantas instancias de este bloque, que sería mucho más claro si añadiera un archivo XML a la carpeta de diseño de mi tema y colocara este código allí. Luego, en la sección Diseño de actualización, yo podría simplemente tener esto en su lugar:

<reference name="vps_featured_list"> 
    <action method="setAttributeName"><name>other_attribute</name></action> 
</reference> 

tanto, he creado un archivo llamado vps_featured.xml y agregó que esto es:

<layout version="0.1.0"> 
    <default> 
     <reference name="content"> 
      <block type="cms/block" name="product_list_top" /> 
      <block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml"> 
       <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml"> 
        <block type="page/html_pager" name="product_list_toolbar_pager" /> 
       </block> 
       <action method="setToolbarBlockName"><name>product_list_toolbar</name></action> 
      </block> 
     </reference> 
    </default> 
</layout> 

se hace referencia a este archivo XML actualización de diseño en el config.xml para mi módulo destacado personalizado. Ingenuamente asumí que vps_featured.xml solo se incorporaría al diseño de página cuando mi bloque de VPS Destacado estuviera en la página, lo que solo ocurriría en estas pocas instancias en páginas especiales de CMS. Aparentemente, ese no es el caso. Esto rompió cada otra página, supongo porque estaba anulando el identificador predeterminado.

Así que esto me lleva a la pregunta n. ° 1: ¿Cuándo se incluyen los archivos xml de diseño en el diseño de la página? ¿Se utilizan para TODAS las páginas, independientemente de si el módulo que hace referencia a ellas se utiliza o no?

Luego decidí intentar agregar un nuevo identificador de diseño al que pudiera hacer referencia cuando quisiera en mis páginas de CMS. Modifiqué mi archivo XML de diseño para que la parte principal esté dentro de las etiquetas <vps_featured_list> en lugar de las etiquetas <default>. Esto hizo que las otras páginas cobraran vida, pero, por supuesto, mis páginas CMS ya no funcionaban porque ese control de actualización de diseño no se usa en esas páginas. Traté de agregar <update handle="vps_featured_list" /> a la sección XML de actualización de diseño de la página de CMS, pero no funcionó (no esperaba).

Así que esto me lleva a la pregunta # 2: ¿Cuál es la forma correcta de lograr esto?

Esto no suena como debería ser tan difícil, pero claramente me falta algo. He leído todo lo que puedo encontrar en diseños, pero siempre son ejemplos simples, como "agregar esto a CADA página de producto". No quiero que se agregue algo a TODAS las páginas de cms ... solo unas pocas. ¿Estoy atascado usando la sección de Layout Update XML para las páginas de CMS en cuestión? Siento que tiene que haber una manera más limpia.

Gracias,

Brian

Respuesta

17

El nodo <default/> es algo que se llama un "mango de diseño". Cada solicitud en Magent genera una cantidad de estos identificadores. Consulte el sitio Layout tab on the Commerce Bug demo para tener una idea del tipo de identificadores que se generan.

Magento fusiona todos los archivos XML de en un árbol gigante llamado el diseño del paquete. Luego, los identificadores determinan qué fragmentos de Layout XML Update se usan para una solicitud en particular. Estos fragmentos se combinan en el diseño de página.Como intuyó, el identificador <default/> es siempre añadido, por lo que está ejecutando borking en todos los sitios de su sistema.

La mala noticia es que mientras haya un identificador para las páginas de CMS, (<cms_page_view />), todavía sería un asunto de todo o nada. Puede agregar algo a todas las páginas de CMS, pero no a las páginas de CMS específicas. Así que sí, la sección XML de actualización de diseño del administrador de CMS es la forma "correcta" de hacer lo que usted desea.

La buena noticia es que hay dos enfoques que puede tomar que son más limpios que los que ha surgido hasta ahora. Primero, puede limpiar un poco las cosas definiendo su propio identificador en su archivo XML, y luego usar un comando especial de Layout XML para incluir ese identificador.

En su XML, agregue su fragmento XML de actualización de diseño dentro de un identificador personalizado.

<layout version="0.1.0"> <my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names> <reference name="content"> <block type="cms/block" name="product_list_top" /> <block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml"> <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml"> <block type="page/html_pager" name="product_list_toolbar_pager" /> </block> <action method="setToolbarBlockName"><name>product_list_toolbar</name></action> </block> </reference> </my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names> </layout> 

Then in the CMS Admin, add the following Layout Update XML for the pages you want

<update handle="my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names" />

Magento permite fragmentos Disposición de actualización XML para añadir mangos adicionales a la solicitud. Eso es lo que estás haciendo arriba. Esto limpia un poco las cosas, y si quería cambiar algo del XML, hay un lugar centralizado para ello.

actualización: Resulta que que el < actualización/> comando puede única ser utilizado desde el código XML Disposición archivos mismos. El código que carga el XML de actualización de diseño para páginas CMS no es el mismo código que carga y procesa las actualizaciones para los archivos XML. Magento será literalmente agregar algo en el formulario CMS como una actualización de diseño. No lo procesará para actualizaciones recursivas. Por lo tanto, la adición de algo como esto para local.xml funcionaría

<mock_product_list> 
    <reference name="head"> 
    <label>Mock Product List</label>   
       <action method="addItem"><type>skin_js</type><name>js/sw/wall.js</name></action> 
    </reference>  
</mock_product_list> 

<cms_page_view> 
    <update handle="mock_product_list" /> 
</cms_page_view> 

Pero no puede hacerlo directamente con una actualización aplicada a través del administrador de CMS. Vive y aprende.

Dicho todo esto, el enfoque del widget probablemente sea aún viable, y una alternativa a lo anterior sería.

  1. Crear un módulo personalizado con una clase de bloque personalizado

  2. La clase del bloque en cuestión no preste HTML

  3. La clase bloque contiene un solo método llamado algo así como "addFooToLayout"

Luego, en su página CMS, agregue una actualización como esta

<block type="yourmodule/yourblock" name="unique_name" alias="unique_name"> 
    <action method="addFooToLayout" /> 
</block> 

y luego en su definición de bloque

public addFooToLayout() 
{ 
    $layout = Mage::getSingleton('core/layout'); 
    $head = $layout->getBlock('head'); 
    $head->addItem('skin_js','js/sw/wall.js'); 
    //etc... 
} 

Algo así debe trabajo y es un poco más claro (dependiendo de la cantidad de actualización de diseño XML que desea añadir). Sin embargo, no lo he probado y mi credibilidad ha estallado en este, así que ten cuidado con el comprador.

El segundo enfoque es create a single widget que abarca lo que desea agregar a la página y, a continuación, utilice el administrador de Instancia de widgets para agregar ese widget a bloques específicos en páginas específicas. Que los enlaces deberían ayudarte a comenzar.

Finalmente, a riesgo de ser un error, recientemente publiqué a book on Magento Layouts que cubre este tipo de cuestiones en profundidad. Vale la pena su tiempo si está interesado en comprender cómo funciona todo el sistema.

+0

Se actualizó para corregir la información errónea acerca de las etiquetas de actualización que trabajan en páginas CMS. –

+0

Muchas gracias @ alan-storm por la respuesta increíblemente detallada. De hecho, encontré tu libro reciente en mi búsqueda de una respuesta a esto y es probable que tome una copia. Curiosamente, había intentado exactamente lo que sugirió por primera vez, que, por supuesto, no funcionó. Voy a ver sus otras sugerencias pronto. Mientras tanto, el XML de actualización parece estar funcionando bien. Sin duda, me encantaría actualizar los controladores para las páginas de CMS ... – BrianVPS

+0

GRR !! Agregué más pero tardé demasiado y rebasé el límite de edición de 5 minutos. ¡Me estoy cansando de todas estas malditas reglas! ¡Solo quiero ser parte de la comunidad! Deja de hacerme pasar por tanta burocracia !! – BrianVPS

3

Sin embargo, esta pregunta ya es bastante antigua, la encontré a través de Google y me gustaría añadir algo de información para quienes leerán esta publicación en el futuro.

Ayer, cuando leí esta pregunta y respuesta, y también las publicaciones this y this, llegué a estar bastante seguro de que no era posible o bastante difícil anular/ampliar el identificador de diseño de página CMS solo para páginas específicas. Eso me llevó a desarrollar una extensión pequeña, que inyecta cualquier identificador de diseño personalizado en cualquier página específica. Pronto actualizaré esta publicación con un enlace público a la extensión.

Pero luego descubrí que en realidad es posible crear una nueva plantilla para la página CMS y asignar cualquier manejador de diseño personalizado a esa plantilla, consulte this question and answer de Marius, por ejemplo. Aquí está la parte importante de ese ejemplo de código:

<global> 
    <page> 
     <layouts> 
      <lookbook module="page" translate="label"> 
       <label>Lookbook</label> 
       <template>page/1column-lookbook.phtml</template> 
       <layout_handle>lookbook</layout_handle> 
      </lookbook> 
     </layouts> 
    </page> 
</global> 

Es bastante fácil de inyectar cualquier mango diseño personalizado a cualquier página y hacer lo que quiera solamente con las páginas que utilizan esta plantilla y su mango de diseño personalizado. Ojalá lo supiera antes, espero que esta publicación le ahorre tiempo a alguien.

Cuestiones relacionadas