Prestashop – Permitir configurar el número de categorías en módulo “blockcategories”

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,

Imagen

Esto se puede conseguir modificando el módulo “blockcategories” que viene incluido en Prestashop.

Este módulo tiene la siguiente estructura:

blockcategories structure

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:

blockcategories default configuration

Pero nosotros vamos a añadir un nuevo elemento que nos permita en indicar el número de elementos a mostrar por defecto, quedando:

blockcategories new configuration

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:

<center><input type="submit" name="submitBlockCategories" value="'.$this->l('Save').'" /></center>

Añadimos el siguiente código:

<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>

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:

	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;
	}

De la misma forma, eliminaremos esta entrada en el método “Uninstall” del módulo:

	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;
	}

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:

	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();
	}

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:

$this->smarty->assign('itemsShow', Configuration::get('BLOCK_CATEG_ITEMS_SHOW'));

Justo después de:

$this->smarty->assign('isDhtml', $isDhtml);

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:

            //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();
                        })
                );

Justo después de:

			// we hide the tree only if JavaScript is activated
			$('div#categories_block_left ul.dhtml').hide();

Descarga el código completo en GitHub.

19 comentarios sobre “Prestashop – Permitir configurar el número de categorías en módulo “blockcategories””

  1. ¡Hola! He probado tu modificación del modulo, pero no me funciona.
    ¿Sera que sea por la versión que tengo (PrestaShop™ 1.5.4.1)?
    Me gustaría que me ayudaras a solucionar el problema. Te lo agradecería mucho.
    ¡Saludos!

    1. Hola Frank Alex,

      ¿Te está dando algún error o warning? ¿Has configurado el número de categorías a mostrar en el módulo?

      La modificación la había hecho para una tienda que tuve que hacer en Prestashop 1.5.2…. supongo que en la 1.5.4.1 debería funcionar sin problema.

      Saludos!

      1. ¡Hola Programwar!

        ¡Ya he solucionado el problema!

        Tenia que eliminar la carpeta “blockcategories” que se encuentra dentro de mi tema (themes/”NombreDelTheme”/modules/blockcategories). Ya con eso funciona tu modulo.

        ¡Muchas gracia por el apoyo!

        ¡Te mando saludos!

  2. ¡Hola!
    ¡Gracias por responder!
    No me señala ningún warning, ya he configurado el número de categorías (en mi caso solo quiero mostrar 4 categorías).

    Elimine y reinstale el modulo, vacié la caché, force la compilación y aun así me sigue mostrando todas las categorías.

    Tengo una duda, ¿Como hago que las items de mi menú principal no aparezcan en el modulo categorías?

    Una solución a la pregunta anterior fue tu modificación del modulo categorías.

    Te agradecería mucho que me ayudaras a solucionar este problema que tengo.

    ¡Muchas gracias de antemano!

      1. hola! gracias por responder tan rápido!! errores no me salen, simplemente al picar en [mostrar todas] y luego hacer clic en el + de una de las categorias que no se mostraba… pues no aparece las subcategorias….. pero no da errores, probé en local y en servidor. gracias

  3. Hola,
    Igual la pregunta que hago es un poco absurada, pero es que estoy empezando con esto. No entiendo muy bien como instalar este módulo, es decir, ¿basta con sustituir este codigo por el del módulo? pensaba hacerlo así, pero al leer que hay que reinstalar el módulo para que se registre la variable en la base de datos ya me he despistado.
    Gracias

      1. Hola,
        ¡Que rápido!
        Yo tengo un servidor local, y lo que estoy haciendo es con la opción “añadir nuevo módulo” subir tu .zip, pero luego no lo encuentro ni nada.
        He desinstalado el “bloque de categorias” y he vuelto a instalar después de añadir el .zip pero me sigue saliendo lo mismo de siempre.
        Otra cosila… ¿puedo hacer que no apareza la opción “mostrar todas?
        Un millón de gracias

    1. ¡Hola!
      Al final lo conseguí pero ayer no me dejaba comentar, no uso el que viene por defecto porque me muestra todas las categorías y yo solo quiero que me muestre unas en concreto porque las otras las muestro en el menú de arriba y si no se repiten y queda fatal.
      Saludos

    2. Hola de nuevo,
      Estaba yo tan contenta con mis categorias pero me ha durado poco. Actualicé a 1.6.1.5 porque me empezaron a salir unos errores rarísimos y mi sorpresa es que dejó de funcionar el módulo, he vuelto a 1.6.1.4 con la esperanza a que volviese a funcionar, lo he puesto tal cual sin modificar lo de mostrar y todas y no entiendo por qué ahora no funciona.
      El caso es que si le pones el -1 las muestra todas, pero si le pones otro valor ya no hace caso y solo muestra una y el “mostrar todas”.
      Es una instalación nueva con base de datos nueva.. no se qué puede pasar.
      ¿Alguna sugerencia?
      Gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s