lunes, 5 de agosto de 2013

Menú desplegable oculto

Al colocar un menú desplegable en prestashop en la cabeza se qeudaba oculto.
Esto es por que en el div #header está la propiedad overflow: hidden; elimina y ya se verá el menú desplegable.

viernes, 2 de agosto de 2013

Hooks nuevos en Prestashop con categorías

Al final me ha tocado ponerme con prestashop para las tiendas. Es un cms bastante completo y no muy complejo una vez que entiendes el sistema. A diferencia con Wordpress, Prestashop compila los archivos mediante smarty utilizando para ello los archivos php y los tpl.

Cada vez que modificar un archivo hay que compilarlo, para ello abre el panel de control y en:
Preferencias>rendimiento 
Forzar compilación y de paso pon que no se almacene caché.

Vamos al grano:

CREAR UN NUEVO HOOK

1. Crear una nueva entrada en la base de datos en la tabla ps_hook
INSERT INTO `ps_hook` (`name`, `title`, `description`) VALUES ('Hooknuevo', 'Nombre que se mostrará al usuario', 'Descripcion del hook para mostrar al usuario');

2. Modificar el archivo /classes/FrontController.php
Verás un código como este:
self::$smarty->assign(array(
'HOOK_HEADER' => Module::hookExec('header'),
'HOOK_TOP' => Module::hookExec('top'),
'HOOK_LEFT_COLUMN' => Module::hookExec('leftColumn') 


Insertar nuestro nuevo hook con la nomenclatura correspondiente:
self::$smarty->assign(array(
'HOOK_HEADER' => Module::hookExec('header'),
'HOOK_TOP' => Module::hookExec('top'),
'HOOK_LEFT_COLUMN' => Module::hookExec('leftColumn') 

'HOOK_MIONUEVO' => Module::hookExec('Hooknuevo') 

Con esto indicamos como vamos a llamar desde los templates a nuestro nuevo hook que contendrá un módulo.
Por ejemplo en el archivo header.php como eras {$HOOK_TOP}, puedes colocar un {$HOOK_MIONUEVO}

3, Ahora tenemos que indicar los módulos que pueden ir en nuestro hook para que el programa desde el panel de control nos permita modificarlo.
E inserto este código:
public function hookHooknuevo($params) { return $this->funcionquequeremso( $params ); }
En este caso recupero el valor de una variable global de la clase y la incorporo a mi hook. Pero podeis escribir vuestra nuevva función.
Ejemplo en /modules/blockcategories/blockcategories.php para crear un menu de categorías en la cabeza.
public function  hookHooknuevo($params) {
        global $smarty, $cookie;

        $id_customer = (int)($params['cookie']->id_customer);
        // Get all groups for this customer and concatenate them as a string: "1,2,3..."
        $groups = $id_customer ? implode(', ', Customer::getGroupsStatic($id_customer)) : _PS_DEFAULT_CUSTOMER_GROUP_;
        $id_product = (int)(Tools::getValue('id_product', 0));
        $id_category = (int)(Tools::getValue('id_category', 0));
        $id_lang = (int)($params['cookie']->id_lang);
        $smartyCacheId = 'blockcategories|'.$groups.'_'.$id_lang.'_'.$id_product.'_'.$id_category;

        $smarty->cache_lifetime = 31536000; // 1 Year
        Tools::enableCache();
        if (!$this->isCached('blockcategories_header.tpl', $smartyCacheId))
        {
            $maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH');
            if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
                SELECT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
                FROM `'._DB_PREFIX_.'category` c
                LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.$id_lang.')
                LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`)
                WHERE (c.`active` = 1 OR c.`id_category` = 1)
                '.((int)($maxdepth) != 0 ? ' AND `level_depth` <= '.(int)($maxdepth) : '').'
                AND cg.`id_group` IN ('.pSQL($groups).')
                GROUP BY id_category
                ORDER BY `level_depth` ASC, '.(Configuration::get('BLOCK_CATEG_SORT') ? 'cl.`name`' : 'c.`position`').' '.(Configuration::get('BLOCK_CATEG_SORT_WAY') ? 'DESC' : 'ASC'))
            )
                return;
            $resultParents = array();
            $resultIds = array();

            foreach ($result as &$row)
            {
                $resultParents[$row['id_parent']][] = &$row;
                $resultIds[$row['id_category']] = &$row;
            }
            //$nbrColumns = Configuration::get('BLOCK_CATEG_NBR_COLUMNS_FOOTER');
            $nbrColumns = Configuration::get('BLOCK_CATEG_NBR_COLUMN_FOOTER');
            if (!$nbrColumns)
                $nbrColumns=3;
            $numberColumn = abs(sizeof($result)/$nbrColumns);
            $widthColumn= floor(100/$nbrColumns);
            $smarty->assign('numberColumn', $numberColumn);
            $smarty->assign('widthColumn', $widthColumn);
           
            $blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH'));
            unset($resultParents);
            unset($resultIds);
            $isDhtml = (Configuration::get('BLOCK_CATEG_DHTML') == 1 ? true : false);

            if (Tools::isSubmit('id_category'))
            {
                $cookie->last_visited_category = $id_category;
                $smarty->assign('currentCategoryId', $cookie->last_visited_category);
            }
            if (Tools::isSubmit('id_product'))
            {
                if (!isset($cookie->last_visited_category) OR !Product::idIsOnCategoryId($id_product, array('0' => array('id_category' => $cookie->last_visited_category))))
                {
                    $product = new Product($id_product);
                    if (isset($product) AND Validate::isLoadedObject($product))
                        $cookie->last_visited_category = (int)($product->id_category_default);
                }
                $smarty->assign('currentCategoryId', (int)($cookie->last_visited_category));
            }
            $smarty->assign('blockCategTree', $blockCategTree);

            if (file_exists(_PS_THEME_DIR_.'modules/blockcategories/blockcategories_header.tpl'))
                $smarty->assign('branche_tpl_path', _PS_THEME_DIR_.'modules/blockcategories/category-tree-branch.tpl');
            else
                $smarty->assign('branche_tpl_path', _PS_MODULE_DIR_.'blockcategories/category-tree-branch.tpl');
            $smarty->assign('isDhtml', $isDhtml);
        }

        $display = $this->display(__FILE__, 'blockcategories_header.tpl', $smartyCacheId);
        Tools::restoreCacheSettings();
        return $display;
    }/* fin nuevo hook */

En este caso me he creado un nuevo tpl para mostrar, que es lo que está en color morado.

4. Hemos creado nuestro hook, le hemos asigniado los módulos/funciones que queremos permitirle mostrar y le hemos indicado una nomenclatura para colocarlo en los tpls.
Ahora sólo nos queda ir al panel de control compilar como he indicado al principio e ir a modulos/posiciones para indicar a nuestro nuevo hook que modulo queremos inisertar. En este caso nos dejará insertar el bloque de categorías como se lo hemos puesto en el archivo php.