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.
lunes, 5 de agosto de 2013
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:
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.
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_hookINSERT 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.
Suscribirse a:
Comentarios (Atom)