Tagged:tiendas virtuales

Problemas para instalar Prestashop 1.6.0.6 en Ubuntu 16.04

Resumen rápido si no quieres perder tiempo: No lo intentes, usa Ubuntu 15.10 y todo irá a la perfección.

La historia

Al intentar migrar la versión de Prestashop 1.6.0.6 a un VPS con Ubuntu 16.04 surgen multitud de problemas que conviene tener en cuenta si lo que queremos es migrar la tienda a un nuevo hosting sin realizar una actualización a la última versión disponible (1.6.1.5 a fecha de hoy).

Read more

Problema con envío de correos en Prestashop

Versión de Prestashop: 1.5.0.17 (aunque seguramente será válido para otras versiones)

Hoy después de varias horas intentando averiguar por qué no podía enviar emails a través de la última tienda Prestashop que configuré, por fin di con la solución. El problema era que a pesar de tener la configuración correcta (servidor SMTP externo con todos sus datos bien puestos), al enviar el correo de prueba la tienda me devolvía el odioso mensaje en rojo:

Error: please check your configuration
There was a problem reading line 1 of an SMTP response. The response so far was:
[]. It appears the connection has died without saying goodbye to us! Too many emails in one go perhaps? (fsockopen: #0)

Finalmente, la clave estaba en la parte «the connection has died without saying goodbye to us«, lo que podía significar que, o bien el servidor de correo estaba mal configurado (descartado), o bien el tiempo que Prestashop estaba esperando por una respuesta era insuficiente. Después de dar muchas vueltas por el backend buscando este posible valor de configuración y no encontrarlo (qué raro que no sea un valor configurable), decidí mirar el código. Encontré el problema en las líneas 170 y 274 del fichero /classes/Mail.php, que efectivamente tenían valores que estaba claro que eran insuficientes:

Línea 170 :

$connection->setTimeout(4);

Línea 274 :

$smtp->setTimeout(5);

Cambié los respectivos valores por 5 y 10, y por fin pude ver el mensaje en verde que me indicaba que mis correos se estaban enviando.

Error «order creation failed» / «creación de pedido fallida» en Prestashop 1.3.1, 1.3.7 y 1.4.16

For non spanish readers, the short version:

The problem is related to your MySQL version. It fails with 5.1.x and 5.5.x versions.
Prestashop 1.3.1 : add the lines:

$order->invoice_date = '0000-00-00 00:00:00';
$order->delivery_date = '0000-00-00 00:00:00';

just before the order creation ($order->add()) in your «damaged» payment module.
Prestashop 1.4.x : modify your ps_orders table structure:

alter table ps_orders modify reference varchar(14) null;

Prestashop 1.3.7 : Presumably the error is one of both, or related with null values in that table.

Y la historia larga en castellano:

Después de varios días buscando una solución a este error y de no encontrar nada concluyente en la web, por fin he dado con ello.

El error en cuestión ocurría al intentar realizar un pago contrarreembolso (módulo cashondelivery) y también al intentar realizarlo por transferencia bancaria (módulo bankwire). El pago a través de PayPal funcionaba correctamente (por suerte).

El problema empezó a ocurrir después de realizar una migración de servidor de una máquina más antigua a una máquina más nueva.

Inicialmente pensé que el problema era una incompatibilidad entre el PHP instalado en mi nuevo servidor y el código de mi versión de Prestashop por lo que decidí actualizar la tienda a la última versión. Comprobé que el error se seguía dando en las versiones 1.3 7 y también en la 1.4.16.

Un post en http://www.prestashop.com/forums/viewthread/29422/third_party_modules/solved_order_creation_failed_with_every_payment_module_help_1_dot_2_dot_4/ me puso sobre la pista de que el problema estaba en la base de datos o en el conector a la base de datos. Después de trazar las consultas en la base de datos vi que en la versión 1.4.16 la consulta que se intentaba ejecutar :

INSERT INTO `ps_orders` (`id_address_delivery`,`id_address_invoice`,`id_c
art`,`id_currency`,`id_lang`,`id_customer`,`id_carrier`,`secure_key`,`payment`,`
module`,`conversion_rate`,`recyclable`,`gift`,`gift_message`,`shipping_number`,`
total_discounts`,`total_paid`,`total_paid_real`,`total_products`,`total_products
_wt`,`total_shipping`,`carrier_tax_rate`,`total_wrapping`,`invoice_number`,`deli
very_number`,`invoice_date`,`delivery_date`,`valid`,`date_add`,`date_upd`) VALUE
S ('15','15','690','1','3','3','15','8ebb6bdaaabe8e9daa8f15d774042747','Cash on
delivery (COD)','maofree_cashondeliveryfee','1','0','0','BLA:10','','0','91.67',
'91.67','81.67','81.67','10','0','0','0','0','0000-00-00 00:00:00','0000-00-00 0
0:00:00','0','2011-03-18 20:02:32','2011-03-18 20:02:32');

tiraba el error :

ERROR 1364 (HY000): Field 'reference' doesn't have a default value

Lo cual nos llevaba directamente a la causa del problema: en versiones anteriores de la base de datos o del conector, mysql gestionaba los nulls y/o cadenas vacías de manera diferente. Lo solucioné modificando la estructura de la base de datos permitiendo que el valor de ese campo por defecto fuese null:

alter table ps_orders modify reference varchar(14) null;

En la versión 1.3.1 el error en la consulta no venía de este campo sino de los campos invoice_date y delivery_date, a los que no se les asigna un valor por defecto. En este caso la solución podría haber sido la misma, pero preferí modificar el código PHP del módulo cashondelivery añadiendo las líneas :

$order->invoice_date = '0000-00-00 00:00:00';
$order->delivery_date = '0000-00-00 00:00:00';

en el fichero principal del módulo, en la parte en la que se crea la orden, justo antes de la instrucción $order->add() que la añade a la base de datos.

He de decir que inicialmente intenté esta misma solución por código para el caso de la versión 1.4, pero ninguna de las líneas

$order->reference = "null";
$order->reference = "";

añadidas en el sitio adecuado surtió el efecto deseado y el error persistió.

Este error está relacionado con la utilización de MySQL 5.5.x y por los reportes de error que he leído en algunos posts, también con MySQL 5.1.x.

No investigué el error exacto en Prestashop 1.3.7, pero presumiblemente es alguno de estos 2, o está relacionado con valores null en esta tabla.

Cómo migrar una tienda Prestashop de una ubicación a otra

Nota: Estas instrucciones son válidas para Prestashop 1.3, 1.4 y 1.5.

Los pasos a seguir para conseguir esta tarea son los siguientes:

1. Realizar backup de la base de datos de la tienda que se desea migrar:
mysqldump -u [usuario] -p -a [nombre_de_la_bd] > c:/ruta/backup.sql

2. Copiar los ficheros de nuestra tienda a la nueva ubicación.

3. Abrir el fichero /nueva_ubicacion/config/settings.inc.php y editar las líneas correspondientes a la definición de las variables __PS_BASE_URI_, _DB_NAME_, _DB_SERVER_, _DB_USER_ y _DB_PASSWORD_ para que se ajusten a la nueva ubicación y a la nueva base de datos.

4. Crear una nueva base de datos vacía e importar en la misma el backup previamente realizado.
mysql -u [usuario] -p -D [bd_nueva] < c:\ruta\backup.sql

5. Dar permisos al usuario designado en el paso 3 para que tenga acceso total a la nueva base de datos
grant all on [bd_nueva].* to [usuario]@localhost identified by "[contraseña]";
donde [usuario] y [contraseña] deben coincidir con los datos introducidos en el fichero settings.inc.php del paso3.

6. Nota: Este punto sólo es válido para Prestashop 1.3. Para 1.4 y 1.5 lee más adelante, el apartado actualizado el 20/03/2013.
Editar el valor de la variable de configuración PS_BASE_URI en la base de datos, cambiándolo por el de la nueva ubicación, que debe coincidir con el valor dado a la variable __PS_BASE_URI_ en el fichero settings.inc.php del punto 3.
update ps_configuracion set value="[nueva_ubicación]" where name="PS_BASE_URI";

7. Eliminar los archivos de la tienda de la ubicación original, así como su base de datos asociada.

Y listo, ya tenemos nuestra tienda en la nueva ubicación. Por supuesto se presupone que en la nueva ubicación ya hay un servidor web con php y mysql levantados.

Estas instrucciones son válidas también para clonar una tienda. En este caso simplemente basta con omitir el paso 7, y si alojamos el clon en la misma máquina que la tienda original, no es necesario dar de alta un nuevo usuario/contraseña para gestionar la BD, por lo que en el punto 3 sólo habría que modificar los 2 primeros parámetros y el grant hacia la nueva BD debería darse al usuario antiguo.

20/03/2013 – Actualización: Migrar Prestashop 1.4 y 1.5

Para migrar una BD de prestashop 1.5 es necesario realizar algunos cambios más:

  1. update ps_configuration set value="[nuevodominio.tld]" where name="PS_SHOP_DOMAIN" or name="PS_SHOP_DOMAIN_SSL";
  2. update ps_shop_url set domain="[nuevodominio.tld]",domain_ssl="[nuevodominio.tld]";
  3. Reemplazar en el .htaccess todas las referencias al antiguo dominio por el nuevo.

Si no se realizan estos cambios, la tienda nueva redireccionará a la URL de la tienda antigua.

Notas sobre la instalación de un OsCommerce

Estas notas son relativas a la versión 2.2rc2a. Se presupone la existencia de un servidor web con PHP y MySQL configurado. PHP necesita tener instaladas las extensiones MySQL, GD2, cUrl y OpenSSL.

0. Crear manualmente una base de datos vacía para la tienda, así como un usuario con su contraseña darle permisos totales para la base de datos creada.

1. Descargar la versión desde http://www.oscommerce.com/solutions/downloads

2. Descomprimirla en la carpeta en la que se quiera alojar (o subir los archivos por FTP).

3. Ejecutar en el navegador : http://[ruta]/catalog/install/ -> Seguir las instrucciones de instalación

4. Una vez instalado, descargar el módulo STS (Simple Template System) para gestionar plantillas de OsCommerce (aparentemente esto es innecesario para la versión 3.0, aunque no lo he comprobado). Se desarga de : http://addons.oscommerce.com/info/1524

5. Una vez desinstalado, descomprimir y copiar el contenido de la carpeta «STS/includes/» en la carpeta «catalog/includes/» y el contenido de la carpeta «Files for RC2/» en «catalog/»

6. Subir la plantilla. En particular yo he trabajado con plantillas de http://freeoscommerce.com. Estas plantillas van numeradas, el número es importante tenerlo en cuenta a la hora de la instalación de la misma. En este caso hay que subir el contenido de la carpeta «upload/» en la carpeta «catalog/».

7. Una vez subidos los ficheros de la plantilla, hay que activarla. Para ello vamos al módulo de administración  -> Módulos -> STS ->Editar. Aquí hay que cambiar:

– Use Templates? -> true.
– Set Template folder to freeoscommerce_###
– Set Default template file to freeoscommerce_###.html
– Use template for infoboxes -> true.

Listo, osCommerce  instalado  con  la hoja de estilos deseada. Ahora sólo queda personalizar la hoja de estilos deseada ajustándola a nuestras últimas necesidades y voilà. Evidentemente si la instalación de plantillas se realiza sobre un OsCommerce que ya esté funcionando, habría que hacer backup de todo por si hay que dar marcha atrás. Estas instrucciones están probadas sobre una instalación limpia de OsCommerce.

{ Piensa / Think }

"This is a waste of life. [...] the entire educational system in the modern day is nothing more than a cookie cutter processing plant that prepares humans for mostly predefined occupational roles. This element of human life has become so traditionally ingrained, that many falsely consider the nature of ‘having a job’ some form of human instinct. Even parents will ask their kids “What do you want to be when you grow up?” as though there was only one thing. This is disturbing and a violation of human potential." - The Zeitgeist Movement


"He aprendido que hay cosas que pueden ser comprendidas pero que nunca podrán ser explicadas con palabras sin desvirtuar su grandeza" - Andrés Pascual


"You never change things by fighting the existing reality. To change something, build a new model that makes the existing model obsolete." - Buckminster Fuller


"... I am the master of my fate. I am the captain of my soul." - William Ernest Henley