domingo, 5 de agosto de 2012

Modificar navegabilidad de categorias en Prestashop

En una tienda con Prestashop no queríamos que las categorías intermedias fuesen "navegables", entendiendo por navegables que se pudiese clickar sobre ellas y nos mostrase en pantalla las subcategorías que de ella cuelgan. A continuación paso a ejemplificar esto para que quede claro el concepto de lo que queríamos.
Si partimos de este esquema de categorías:
  • Ropa
    • Hombre 
      • Pantalones
        • Vaqueros 
          • Vaquero 1
          • Vaquero 2
Donde Ropa, Hombre, Pantalones y Baqueros son categorías y  baquero 1, baquero 2 son artículos. Nosotros lo que queríamos era que las categorías intermedias (sin artículos ) como Ropa, Hombre, Pantalones no se pudiesen clickar para que no te listara las subcategorías que tenía. De esta manera solo queríamos que se pudiesen clickar las que tenían artículos.
Para ello tenemos que modificar el archivo que se encuentra en el directorio  modules/blockcategories/
category-tree-branch.tpl entendiendo que partimos del directorio donde tenemos instalado Prestashop.
Este fichero contiene el siguiente código:

<li {if isset($last) && $last == 'true'}class="last"{/if}>
        <a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'}</a>
        {if $node.children|@count > 0}
                <ul>
                {foreach from=$node.children item=child name=categoryTreeBranch}
                        {if isset($smarty.foreach.categoryTreeBranch) && $smarty.foreach.categoryTreeBranch.last}
                                {include file="$branche_tpl_path" node=$child last='true'}
                        {else}
                                {include file="$branche_tpl_path" node=$child last='false'}
                        {/if}
                {/foreach}
                </ul>
        {/if}
</li>

Lo que nosotros teníamos que hacer era modificar el código para que si el nodo tiene hijos nos pintase solo el nombre y además ponerle el p con clase "dynamize" (el jQuery de la pagina entonces pone el símbolo de + al lado del nombre) y sino, entonces es que es un nodo final y ponemos el enlace.

El código quedaría de esta manera:
  
{if $node.children|@count > 0} 
   <p class="dynamize">{$node.name|escape:html:'UTF-8'}</p>       
    {else}
   <a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'}</a>
{/if}

Y el módulo completo queda de la siguiente manera:

<li {if isset($last) && $last == 'true'}class="last"{/if}>
        {if $node.children|@count > 0}
                <p class="dynamize">{$node.name|escape:html:'UTF-8'}</p>
        {else}
                <a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'}</a>
        {/if}   {if $node.children|@count > 0}
                <ul>
                {foreach from=$node.children item=child name=categoryTreeBranch}
                        {if isset($smarty.foreach.categoryTreeBranch) && $smarty.foreach.categoryTreeBranch.last}
                                {include file="$branche_tpl_path" node=$child last='true'}
                        {else}
                                {include file="$branche_tpl_path" node=$child last='false'}
                        {/if}
                {/foreach}
                </ul>
        {/if}
</li>

Una vez modificado ya lo podríamos comprobar accediendo a la tienda y navegando por las categorías.
Una cuestión importante a tener en cuenta a la hora de hacer modificaciones en Prestashop es el funcionamiento de Smarty. Si en el backoffice tenemos activado que Prestashop use la cache y no compile los elementos, cogerá de la última configuración compilada para servirte las páginas (es el optimizador de Smarty). Si queremos que esta u otras modificaciones en Prestashop estuvieran disponibles en la pagina,  tendríamos que compilar de nuevo las plantillas (desde backoffice, herramientas, rendimiento).


No hay comentarios:

Publicar un comentario