Una de las grandes bondades (y de los grandes problemas en el comienzo de la curva de aprendizaje) es el manejo de los templates a través de las definiciones xml del layout.
Normalmente, cuando trabajamos con un skin desde el comienzo, más allá de las líneas de diseño que puedan existir, tenemos bastante libertad de elección en la forma en que se va estructurar ese theme.
Ahora bien, cambia radicalmente el escenario cuando nos dedicamos a crear extensiones o cuando ciertas customizaciones que hayamos desarrollado se tornan parte de la batería de módulos y ajustes que usamos en cada proyecto.
Si para cada caso debiéramos estar modificando los archivos phtml, los xml, el css… bueno, sería bastante molesto y estaríamos dejando de tener código reutilizable.
A través de las definiciones de layout podemos aplicar cambios al momento de renderear el template sin hacer modificaciones a los archivos que ya se estén usando. En realidad, hay unas cuantas cosas que pueden hacerse, pero dada la cantidad de funciones con las que contamos para el manejo del layout, sólo me voy a centrar en el reemplazo de llamadas a los phtml.
Como ejemplo, vamos a tomar el selector de moneda. Vamos a suponer también que tenemos definido el update de layout en el módulo.
Ahora bien, el selector de moneda (suponiendo que nuestra tienda posee más de una y lo tenemos configurado) se muestra en varias secciones. En el archivo /app/design/frontend/base/default/layout/directory.xml tenemos todas las indicaciones.
Para el ejemplo, vamos a usar la llamada que se utiliza en la vista de categoría.
<?xml version="1.0"?>
<layout version="0.1.0">
...
<catalog_category_default>
<reference name="left">
<block type="directory/currency" name="currency" before="catalog.leftnav" template="directory/currency.phtml"/>
</reference>
</catalog_category_default>
...
</layout>
Podemos ver que al bloque referenciado como «currency» se le asigna el template «directory/currency.phtml».
Para hacer nuestro reemplazo sin alterar archivo alguno, tenemos que hacer uso del método setTemplate, que se encargará de reasignar un nuevo phtml al mismo bloque. Supongamos que la definición de layout de nuestro módulo estuviera en un archivo llamado currency.xml, el mismo debería tener la siguiente definición para aplicar el cambio.
<?xml version="1.0"?>
<layout version="0.1.0">
...
<catalog_category_default>
<reference name="currency">
<action method="setTemplate">
<template>path/a/mi/nuevo/currency.phtml</template>
</action>
</reference>
</catalog_category_default>
...
</layout>
Con ésta nueva definición, lo que estamos haciendo es indicar que en la vista de categoría, se busque el bloque llamado «currency» y se cambie el template por este que hemos definido.
De ésta forma, estamos haciendo una sobreescritura no intrusiva.