En ocasiones el número de categorías en un portal en Prestashop es demasiado grande y no deseamos mostrarlas todas directamente como se hace por defecto. La idea sería mostrar por defecto un número determinado de categorías, y añadir un enlace «Mostrar Todas» que muestre todas las categorías. Por ejemplo,
Esto se puede conseguir modificando el módulo «blockcategories» que viene incluido en Prestashop.
Este módulo tiene la siguiente estructura:
El fichero «blockcategories.php» tiene el código necesario para el funcionamiento del módulo, así como para su instalación, desinstalación y la gestión de sus «hooks».
El fichero «blockcategories.tpl» es la plantilla de Smarty para la visualización del módulo de categorías.
El fichero «category-tree-branch.tpl» contiene el código Smarty para la viualización de cada elemento del menú.
Los parámetros de UI que muestra el módulo «blockcategories» por defecto este módulo son:
Pero nosotros vamos a añadir un nuevo elemento que nos permita en indicar el número de elementos a mostrar por defecto, quedando:
Para añadir estos nuevos elementos a la UI tenemos que modificar el fichero «blockcategories.php» y buscaremos el método «displayForm». Antes de la línea que pone:
[sourcecode language=»html»]
<center><input type="submit" name="submitBlockCategories" value="’.$this->l(‘Save’).’" /></center>
[/sourcecode]
Añadimos el siguiente código:
[sourcecode language=»html»]
<label>Número de elementos a mostrar</label>
<div class="margin-form">
<input type="text" name="nbrShowItems" value="’.(int)Configuration::get(‘BLOCK_CATEG_ITEMS_SHOW’).’" />
<p class="clear">Indique el número de categorías a mostrar. -1 para todas.</p>
</div>
[/sourcecode]
Donde básicamente añadimos las etiquetas de texto a mostrar, un textbox para que el usuario pueda configurar el número de elementos a mostrar que se guardará en una nueva entrada de configuración en Prestashop (BLOCK_CATEG_ITEMS_SHOW).
Para poder emplear esa nueva entrada, tendremos que registrarla en la instalación del módulo. Por ello buscaremos el método «Install» y pondremos el siguiente código:
[sourcecode language=»php»]
public function install()
{
if (!parent::install() ||
!$this->registerHook(‘leftColumn’) ||
!$this->registerHook(‘footer’) ||
!$this->registerHook(‘header’) ||
// Temporary hooks. Do NOT hook any module on it. Some CRUD hook will replace them as soon as possible.
!$this->registerHook(‘categoryAddition’) ||
!$this->registerHook(‘categoryUpdate’) ||
!$this->registerHook(‘categoryDeletion’) ||
!$this->registerHook(‘actionAdminMetaControllerUpdate_optionsBefore’) ||
!$this->registerHook(‘actionAdminLanguagesControllerStatusBefore’) ||
!Configuration::updateValue(‘BLOCK_CATEG_MAX_DEPTH’, 4) ||
!Configuration::updateValue(‘BLOCK_CATEG_DHTML’, 1) ||
!Configuration::updateValue(‘BLOCK_CATEG_ITEMS_SHOW’, -1)) //Añadimos nuestra nueva entrada
return false;
return true;
}
[/sourcecode]
De la misma forma, eliminaremos esta entrada en el método «Uninstall» del módulo:
[sourcecode language=»php»]
public function uninstall()
{
if (!parent::uninstall() ||
!Configuration::deleteByName(‘BLOCK_CATEG_MAX_DEPTH’) ||
!Configuration::deleteByName(‘BLOCK_CATEG_DHTML’) ||
!Configuration::deleteByName(‘BLOCK_CATEG_ITEMS_SHOW’)) //Eliminamos nuestra entrada
return false;
return true;
}
[/sourcecode]
Para realizar el registro en BD de esta variable, lo más rápido es desinstalar y volver a instalar este módulo.
En este fichero sólo nos falta añadir el código para que se guarden los cambios del usuario una vez realice cambios en esta nueva entrada de configuración. Esto lo haremos en el método «getContent» quedando así el código:
[sourcecode language=»php»]
public function getContent()
{
$output = ‘<h2>’.$this->displayName.'</h2>’;
if (Tools::isSubmit(‘submitBlockCategories’))
{
$maxDepth = (int)(Tools::getValue(‘maxDepth’));
$dhtml = Tools::getValue(‘dhtml’);
$nbrColumns = Tools::getValue(‘nbrColumns’, 4);
if ($maxDepth < 0)
$output .= ‘<div class="alert error">’.$this->l(‘Maximum depth: Invalid number.’).'</div>’;
elseif ($dhtml != 0 && $dhtml != 1)
$output .= ‘<div class="alert error">’.$this->l(‘Dynamic HTML: Invalid choice.’).'</div>’;
else
{
Configuration::updateValue(‘BLOCK_CATEG_MAX_DEPTH’, (int)($maxDepth));
Configuration::updateValue(‘BLOCK_CATEG_DHTML’, (int)($dhtml));
Configuration::updateValue(‘BLOCK_CATEG_NBR_COLUMN_FOOTER’, $nbrColumns);
Configuration::updateValue(‘BLOCK_CATEG_SORT_WAY’, Tools::getValue(‘BLOCK_CATEG_SORT_WAY’));
Configuration::updateValue(‘BLOCK_CATEG_SORT’, Tools::getValue(‘BLOCK_CATEG_SORT’));
//Guardamos este valor en BD
Configuration::updateValue(‘BLOCK_CATEG_ITEMS_SHOW’, Tools::getValue(‘nbrShowItems’, -1));
$this->_clearBlockcategoriesCache();
$output .= ‘<div class="conf confirm">’.$this->l(‘Settings updated’).'</div>’;
}
}
return $output.$this->displayForm();
}
[/sourcecode]
Por último, nos falta enviar el valor configurado a la plantilla Smarty del módulo. Esto lo haremos en el método «hookLeftColumn». Tendremos que añadir la siguiente línea:
[sourcecode language=»php»]
$this->smarty->assign(‘itemsShow’, Configuration::get(‘BLOCK_CATEG_ITEMS_SHOW’));
[/sourcecode]
Justo después de:
[sourcecode language=»php»]
$this->smarty->assign(‘isDhtml’, $isDhtml);
[/sourcecode]
Ahora sólo nos falta, cambiar la visualización de las categorías en las plantillas de Smarty. Para ello vamos la fichero «blockcategories.tpl» y añadiremos el siguiente código:
[sourcecode language=»javascript»]
//Ocultamos las categorías configuradas en el módulo.
{if $itemsShow > -1}
$(‘ul#menuCategorias’)
.find(‘li:gt({$itemsShow})’)
.hide()
.end()
.append(
$(‘<li><a href="#"><b>[MOSTRAR TODAS]</b></a></li>’).click( function(){
$(this).siblings(‘:hidden’).show().end().remove();
})
);
[/sourcecode]
Justo después de:
[sourcecode language=»javascript»]
// we hide the tree only if JavaScript is activated
$(‘div#categories_block_left ul.dhtml’).hide();
[/sourcecode]
Descarga el código completo en GitHub.



