Creación y borrado de tablas en un módulo de Prestashop 1.7

En esta ocasión, vamos hablar del menú horizontal de Prestashop 1.7, pero no vamos hablar de su configuración.

Cuando añadimos los enlaces manuales dentro de la configuración del menú horizontal dentro del bloque: “Añadir un nuevo enlace

Enlaces manuales del menú horizontal en Prestashop 1.7

Enlaces manuales del menú horizontal en Prestashop 1.7

Se guardan en la tablas: “ps_linksmenutop y ps_linksmenutop_lang

Tabla ps_linksmenutop

En esta tabla se guarda el valor de los siguientes campos:

  • ID del enlace (id_linksmenutop)
  • ID de la tienda que tiene asociado ese enlace (id_shop)
  • (new_window)-> 0 El enlace no se abre en una nueva ventana / 1 El enlace se abre en una nueva ventana

Tabla ps_linksmenutop_lang

  • id_linksmenutop -> Este ID tiene vinculación, con el que esta definido en la tabla ps_linksmenutop)
  • id_lang -> ID del idioma  (Tener en cuanta que cuando añadimos enlaces en el menu horizontal, podemos hacerlo por idiomas, por eso esta disponible este campo para distinguir los datos del enlace entre un idioma y otro)
  • id_shop -> ID de la tienda
  • label -> Etiqueta de lenlace
  • link -> Url del enlace

Estas tablas, las crea el módulo del menú horizontal al instalarse.

Si entramos en el fichero:

“modules/ps_mainmenu/ps_mainmenu.php”

Vemos que dentro de la función “install” (public function install) tenemos una llamada a la función “installDb()

Y si vemos el contenido de la función “installDb()“, vemos el siguiente código:

 public function installDb()
    {
        return (Db::getInstance()->execute('
		CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'linksmenutop` (
			`id_linksmenutop` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
			`id_shop` INT(11) UNSIGNED NOT NULL,
			`new_window` TINYINT( 1 ) NOT NULL,
			INDEX (`id_shop`)
		) ENGINE = '._MYSQL_ENGINE_.' CHARACTER SET utf8 COLLATE utf8_general_ci;') &&
            Db::getInstance()->execute('
			 CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'linksmenutop_lang` (
			`id_linksmenutop` INT(11) UNSIGNED NOT NULL,
			`id_lang` INT(11) UNSIGNED NOT NULL,
			`id_shop` INT(11) UNSIGNED NOT NULL,
			`label` VARCHAR( 128 ) NOT NULL ,
			`link` VARCHAR( 128 ) NOT NULL ,
			INDEX ( `id_linksmenutop` , `id_lang`, `id_shop`)
		) ENGINE = '._MYSQL_ENGINE_.' CHARACTER SET utf8 COLLATE utf8_general_ci;'));
    }

Vemos que la función esta retornando la ejecución de la creación de dos tablas.

Dentro de return tenemos:

Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'linksmenutop` (
`id_linksmenutop` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`id_shop` INT(11) UNSIGNED NOT NULL,
`new_window` TINYINT( 1 ) NOT NULL,
INDEX (`id_shop`)
) ENGINE = '._MYSQL_ENGINE_.' CHARACTER SET utf8 COLLATE utf8_general_ci;')

Para crear la tabla “xx_linksmenutop

Y

Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'linksmenutop_lang` (
`id_linksmenutop` INT(11) UNSIGNED NOT NULL,
`id_lang` INT(11) UNSIGNED NOT NULL,
`id_shop` INT(11) UNSIGNED NOT NULL,
`label` VARCHAR( 128 ) NOT NULL ,
`link` VARCHAR( 128 ) NOT NULL ,
INDEX ( `id_linksmenutop` , `id_lang`, `id_shop`)
) ENGINE = '._MYSQL_ENGINE_.' CHARACTER SET utf8 COLLATE utf8_general_ci;')

Para crear la tabla: xx_linksmenutop_lang

Estamos usando “Db::getInstance()->execute” (evidentemente acompañado del CREATE TABLE) para crear las tablas.

Por otro lado, estas tablas son eliminadas al desinstalar el módulo, si nos fijamos en la función “uninstall” del módulo ( public function uninstall)

Vemos que entre otras instrucciones, tiene una llamada a la función uninstallDB()

Al entrar en el contenido de dicha función, nos encontramos con:

protected function uninstallDb()
{
Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'linksmenutop`');
Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'linksmenutop_lang`');
return true;
}

Donde vemos que usamos: “Db::getInstance()->execute” (evidentemente acompañado de DROP TABLE) para borrar las tablas: “xx_linksmenutop” y “xx_linksmenutop_lang“.

Recordar que “_DB_PREFIX_” es el prefijo de la base de datos, para indicar que sera añadido automáticamente al crear las tablas.

Es decir si el prefijo de la base de datos es ps_, cuando vaya a crear o a borrar por ejemplo la tabla  “linksmenutop“, la creara con el nombre ps_linksmenutop

Documento construido bajo la versión 1.7.1.2 de Prestashop y la versión “2.0.2” del módulo del menú horizontal.

Print Friendly

Ocultar método de pago a un producto en Prestashop

En esta guía, vamos a ocultar el método de pago de transferencia bancaria en Prestashop a un producto que se llama “Chorizos de Alcantarilla”.

En este ejemplo, vamos a editar a manorra (pero recordar que lo ideal es hacer un override de la clase del módulo):

Dentro del fichero: modules/bankwire/bankwire.php y dentro de la función del hook -> hookPayment

Recogemos los productos del carrito, comprobamos el ID de un producto en concreto coincide con el que queremos ocultar ese método de pago para ese producto  y dejamos de mostrar el método de pago en Prestashop para el producto “Chorizos de Alcantarilla”:

La función del hookPayment por defecto esta así en el módulo de transferencia bancaria.

public function hookPayment($params)
{
if (!$this->active)
return;
if (!$this->checkCurrency($params['cart']))
return;
$this->smarty->assign(array(
'this_path' => $this->_path,
'this_path_bw' => $this->_path,
'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/'
));
return $this->display(__FILE__, 'payment.tpl');
}

Dentro vamos añadir, la siguiente línea:

$products = $this->context->cart->getProducts();

Para obtener los productos del carrito.

Y para recorrer los productos del carrito, usaremos (un foreach), si alguno de los productos del carrito coincide con el ID del producto que hemos puesto en la comparación, no retornamos nada, y por tanto no se muestra el método de pago del módulo de transferencia bancaria.

if($products)
{
foreach ($products as $productos) {
if ($productos['id_product'] == 'X')
{
return;
}
}
}

Recordar que donde he puesto ‘X’, vosotros tenéis que colocar el ID del producto a ocultar

La función quedaría así:

public function hookPayment($params)
{
$products = $this->context->cart->getProducts();
if($products)
{
foreach ($products as $productos) {
if ($productos['id_product'] == 2)
{
return;
}
}
}
if (!$this->active)
return;
if (!$this->checkCurrency($params['cart']))
return;
$this->smarty->assign(array(
'this_path' => $this->_path,
'this_path_bw' => $this->_path,
'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/'
));
return $this->display(__FILE__, 'payment.tpl');
}

Código para ocultar método de pago por producto en Prestashop

Recordar que lo ideal es hacer un override de la clase del módulo. ¿Cómo se hace un override de la clase de un módulo?

Documento testeado en Prestashop 1.6.1.14

Print Friendly

Limitar número de productos en el carrito en Prestashop

Traducción de la guía realizada por el usuario Nemo de la Comunidad de Prestashop

Limitar números de productos en el carrito en Prestashop 1.6

Limitar número de productos en el carrito en Prestashop 1.6

Según nos indica Nemo, el tutorial es para Prestashop 1.6

Imaginemos que queremos que, en el carrito, no puedan existir más de 5 productos en total.

Recordamos que lo mejor es hacer un override de los Clases y Controladores que se vayan a modificar.

En el fichero:

/controllers/front/CartController.php

Dentro de la función:

processChangeProductInCart


Debajo de la línea: (En Prestashop 1.6.1.12, sobre la línea 241)

$cart_products = $this->context->cart->getProducts();

Añadimos la siguiente

$total_cart_produtcs_count=0;

Ahora un poco más abajo, donde tenemos esta línea:

foreach ($cart_products as $cart_product) {

Añadimos:

$total_cart_produtcs_count+=$cart_product['cart_quantity'];

Almacenamos en la variable total_cart_produtcs_count el número total de productos que se van añadiendo al carrito.

Ahora justo antes de este comentario:

// Check product quantity availability

Añadimos:

$max_qty = 5;
		if(Tools::getValue('op', 'up')=='up' && $mode=='add')
		{
			if (count($cart_products) == $max_qty || $total_cart_produtcs_count + $this->qty > $max_qty)
				$this->errors[] = sprintf(Tools::displayError('El limite de productos en el carrito son %s'), $max_qty);
		}

  • En la variable “max_qty” indicamos el límite máximo de productos que se pueden añadir al carrito.
  • En el primero IF se chequea cuando se añade/actualiza productos al carrito.
  • En el segundo IF contamos los productos añadidos al carrito y los comparamos con el límite que hemos establecido
  • Si se cumplen los dos IF, imprimimos el mensaje de que se ha llegado al límite de productos que se pueden añadir al carrito.

Esta traducción, puede contener errores o quedar desactualizada en el momento en el que vayáis a ver este post, revisarla siempre con el tutorial de Nemo:

Imagen de previsualización de YouTube
Print Friendly

Editor de textos avanzado en Prestashop 1.7

Gracias al usuario Vekia de la Comunidad de Prestashop, tenemos disponible una guía que nos permite habilitar funciones adicionales al editor de texto que tiene integrado Prestashop, cuando por ejemplo estamos escribiendo la descripción de la categoría, producto, etc..

Vekia, nos propone en su Guía, los siguientes cambios:

1º Paso – Editar fichero JS

Editamos el siguiente fichero “ /js/admin/tinymce.inc.js” y cambiamos el contenido del fichero por el siguiente código:

/**
* Change default icons to marerial icons
*/
function changeToMaterial() {
var materialIconAssoc = {
'mce-i-code': '<i class="material-icons">code</i>',
'mce-i-visualblocks': '<i class="material-icons">dashboard</i>',
'mce-i-charmap': '<i class="material-icons">grade</i>',
'mce-i-hr': '<i class="material-icons">remove</i>',
'mce-i-searchreplace': '<i class="material-icons">find_replace</i>',
'mce-i-none': '<i class="material-icons">format_color_text</i>',
'mce-i-bold': '<i class="material-icons">format_bold</i>',
'mce-i-italic': '<i class="material-icons">format_italic</i>',
'mce-i-underline': '<i class="material-icons">format_underlined</i>',
'mce-i-strikethrough': '<i class="material-icons">format_strikethrough</i>',
'mce-i-blockquote': '<i class="material-icons">format_quote</i>',
'mce-i-link': '<i class="material-icons">link</i>',
'mce-i-alignleft': '<i class="material-icons">format_align_left</i>',
'mce-i-aligncenter': '<i class="material-icons">format_align_center</i>',
'mce-i-alignright': '<i class="material-icons">format_align_right</i>',
'mce-i-alignjustify': '<i class="material-icons">format_align_justify</i>',
'mce-i-bullist': '<i class="material-icons">format_list_bulleted</i>',
'mce-i-numlist': '<i class="material-icons">format_list_numbered</i>',
'mce-i-image': '<i class="material-icons">image</i>',
'mce-i-table': '<i class="material-icons">grid_on</i>',
'mce-i-media': '<i class="material-icons">video_library</i>',
'mce-i-browse': '<i class="material-icons">attachment</i>',
'mce-i-checkbox': '<i class="mce-ico mce-i-checkbox"></i>',
};
$.each(materialIconAssoc, function (index, value) {
$('.' + index).replaceWith(value);
});
}
function tinySetup(config) {
if (!config) {
config = {};
}
if (typeof config.editor_selector != 'undefined') {
config.selector = '.' + config.editor_selector;
}
var default_config = {
selector: ".rte",
browser_spellcheck: true,
plugins : "visualblocks, preview searchreplace print insertdatetime, hr charmap colorpicker anchor code link image paste pagebreak table contextmenu filemanager table code media autoresize textcolor emoticons",
toolbar2 : "newdocument,print,|,bold,italic,underline,|,strikethrough,superscript,subscript,|,forecolor,colorpicker,backcolor,|,bullist,numlist,outdent,indent",
toolbar1 : "styleselect,|,formatselect,|,fontselect,|,fontsizeselect,",
toolbar3 : "code,|,table,|,cut,copy,paste,searchreplace,|,blockquote,|,undo,redo,|,link,unlink,anchor,|,image,emoticons,media,|,inserttime,|,preview ",
toolbar4 : "visualblocks,|,charmap,|,hr,",
external_filemanager_path: baseAdminDir + "filemanager/",
filemanager_title: "File manager",
external_plugins: {"filemanager": baseAdminDir + "filemanager/plugin.min.js"},
language: iso_user,
skin: "prestashop",
menubar: false,
statusbar: false,
relative_urls: false,
convert_urls: false,
entity_encoding: "raw",
valid_children: "+body[style|script|iframe|section],pre[iframe|section|script|div|p|br|span|img|style|h1|h2|h3|h4|h5],*[*]",
valid_elements : '*[*]',
force_p_newlines : false,
cleanup: false,
forced_root_block : false,
force_br_newlines : true,
convert_urls:true,
relative_urls:false,
remove_script_host:false,
init_instance_callback: "changeToMaterial"
};
$.each(default_config, function (index, el) {
if (config[index] === undefined)
config[index] = el;
});
// Change icons in popups
$('body').on('click', '.mce-btn, .mce-open, .mce-menu-item', function () {
changeToMaterial();
});
tinyMCE.init(config);
}

Sigue leyendo

Print Friendly

Mostrando información del proveedor en la ficha del producto en Prestashop 1.6

Es cierto que tenemos módulos disponibles en la Comunidad, que nos pueden servir para mostrar “parte” de la información de los proveedores en la ficha del producto en Prestashop 1.6

Otra opción que nos propone “Nemo” en la que no trabajamos con módulos es la siguiente: (Hemos traducido la guía al idioma de Cervantes)

Crear un override en el directorio:

/override/controllers/front/

con el nombre “ProductController.php” y el siguiente contenido

< ?php
class ProductController extends ProductControllerCore
{
public function initContent()
{
parent::initContent();
if($this->product->id_supplier) {
$id_supplier_address = Address::getAddressIdBySupplierId($this->product->id_supplier);
$supplier_address = new Address($id_supplier_address);
}
if (Validate::isLoadedObject($supplier_address))
{
$this->context->smarty->assign(array(
'supplier_country'=> $supplier_address->country,
'supplier_company'=> $supplier_address->company,
'supplier_address1'=> $supplier_address->address1,
'supplier_postcode'=> $supplier_address->postcode,
'supplier_city'=> $supplier_address->city,
'supplier_phone'=> $supplier_address->phone,
'supplier_state' => State::getNameById($supplier_address->id_state),
'supplier_vat_number'=> $supplier_address->vat_number,
));
}
}
}

El siguiente paso, es ir al fichero: “/themes/tu-plantilla/product.tpl” y añadir el siguiente código: Sigue leyendo

Print Friendly

¿Dónde se guardan los datos de conexión a la base de datos en Prestashop 1.7?

Sorpresa… sorpresa… no es igual que en antaño ni en el mismo fichero….ni en la misma ruta.. en Prestashop 1.7 cambia…

En este caso, para acceder al fichero que contiene los datos de conexión a la base de datos en Prestashop 1.7, tenemos que acceder al fichero:

Configuración Base de datos Prestashop 1.7

Configuración Base de datos Prestashop 1.7

/app/config/parameters.php

Y aquí:
Sigue leyendo

Print Friendly

Cambiar grupo por defecto en el registro de clientes en Prestashop 1.5

En esta guía, explicaremos como cambiar el grupo por defecto en el registro de clientes en Prestashop 1.5.

Los pasos son los siguientes:

Ir al fichero:

/config/defines.inc.php

Buscar la siguiente línea:

define('_PS_DEFAULT_CUSTOMER_GROUP_', 3);

Y cambiamos el 3, por el id del grupo, que queramos que se asigne por defecto. (Recordamos que los grupos los podemos crear en la pestaña Clientes -> Grupos del panel de administración en Prestashop 1.5)

El siguiente paso, es ir a la base de datos y buscar la tabla:

ps_configuration

psconfig

Dentro de la tabla, en el campo:

name

Buscamos el valor:

PS_CUSTOMER_GROUP Sigue leyendo

Print Friendly

Guía – Crear constantes en Prestashop 1.5

En esta guía, explicaremos como crear “variables” constantes en Prestashop 1.5.

El primero paso es ir al fichero:

/config/defines.inc.php

Si nos damos cuenta, veremos vemos que tiene lineas como por ejemplo esta:

define('_PS_CLASS_DIR_', _PS_ROOT_DIR_.'/classes/');

En este caso se indica que la el valor de la variable “_PS_CLASS_DIR_”, esta compuesto por el valor de la variable “_PS_ROOT_DIR_” (que en este caso podríamos decir que es el directorio raíz (_PS_ROOT_DIR_ es otra variable que hay definida que hace referencia al directorio raíz, lo que hace en este caso es una concatenación), acompañado de la carpeta “classes”.

¿Como definir nuestra propia variable constante? Sigue leyendo

Print Friendly

Guía – Uso de la clase Cookie en Prestashop 1.5

Recordamos que la clase “Cookie.php” en Prestashop 1.5 se encuentra en el directorio:

/classes/Cookie.php

Podemos leer “Determinados datos” en Prestashop, determinados por la Cookie, que serian lo siguientes:

Datos Cliente / Visitante – Front-End

  • date_add (Fecha creación de la cookie)
  • id_lang (El ID del idioma seleccionado)
  • id_currency (El ID de la moneda seleccionada)
  • last_visited_category (ID de la ultima categoría visitada en el listado de productos)
  • ajax_blockcart_display (Para saber si el carrito esta “Expandido” o no lo esta)
  • viewed (ID de los productos recién vistos (separados por comas)
  • id_wishlist (ID actual de la lista en el Bloque de wishlist)
  • checkedTOS ( Para saber si han marcado las condiciones del servicio (Condiciones generales de venta) en el checkbock  (“0” si no ha señalado nada, “1” si las ha aceptado)
  • id_guest (EL ID del usuario “invitado”)
  • id_connections (ID de la conexión actual  de la sección del usuario)
  • id_customer (El id del cliente)
  • customer_lastname (Nombre Cliente)
  • customer_firstname (Apellidos Cliente)
  • logged (Sirve para comprobar si estas logeado) Sigue leyendo
Print Friendly

Guía – Listado de controladores del Front-End en Prestashop 1.5

Recordamos que los “Controladores” del FrontEnd de tu tienda Prestashop, bajo la versión 1.5, se encuentran en el directorio:

/override/controllers/front/

(No es una lista completa, se esta completando)

  • AddressController.php – Usado por “address.php” para que los clientes modifiquen su dirección.
  • AddressesController.php – Usado por “addresses.php” para obtener la direcciones de los clientes
  • AuthController.php – Usado por “authentication.php” para la autentificación del usuario.
  • BestSalesController.php – Usado por “best-sales.php” para obtener el listado de productos mas vendidos.
  • CartController.php – Usado por “cart.php” para administrar el carrito de los clientes
  • CategoryController – Usado por “category.php” para obtener los listados de productos por categorías
  • CMSController.php – Usado por “cms.php” para obtener las paginas de CMS (Contenidos)
  • CompareController.php – Usado por “productscomparison.php” para la comparación de productos.
  • ContactController.php – Usado por “contactform.php” para el funcionamiento del formulario de contacto en el FrontEnd.
  • DiscountController.php – Usado por “discount.php” para obtener los vales de descuento de los clientes. Sigue leyendo
Print Friendly