Si lo que buscas es un script que te permita importar datos a Prestashop desde un ERP, fuentes CSV/XML o varios proveedores, lee este otro post.
Estoy en pleno desarrollo de una tienda virtual con Prestashop para un cliente del sector de la ferretería. El cliente tiene su aplicación de gestión de productos en el servidor de la empresa y la base de datos de estos debe de ser sincronizada con el e-commerce de forma automática de modo que cualquier modificación en la misma se vea actualizada en la base de datos del Prestashop.
Inicialmente había pensado en la posibilidad de hacer un script que sincronizara las dos bases de datos conectando directamente con ellas pero visto que el Prestashop dispone de un módulo de importación a partir de ficheros CSV, he decidido utilizarlo.
En esta arquitectura existen dos partes, la parte del cliente situada en el servidor local de la empresa y la parte de la tienda virtual situada en un alojamiento web, que entre otras cosas requiere dar de alta reglas en el firewall para permitir conectar al Mysql desde una IP externa, cosa que finalmente no necesitaremos.
En la parte del cliente programaré un script que exporte en el formato CSV, esperado por Prestashop, tanto las categorías como los productos -en este caso lo único que necesito exportar- y que suba ambos ficheros al servidor donde está ubicada la tienda.
En la parte de la tienda virtual se requiere un script que sea capaz de lanzar el proceso de importación y es el que describiré a continuación.
Existía la posibilidad, en esta segunda parte, de simular la navegación utilizando CURL, haciendo el login y posterior proceso de importación, pero complica mucho más las cosas cuando lo que necesitamos es simplemente llamar a la clase AdminImport y utilizar su funcionalidad.
Aquí dejo el código del script que, situado en la parte de la tienda, lanza una importación de un fichero CSV productos (pro.csv) o categorías (cat.csv), según se le indique por GET[‘entity’]
Los ficheros CSV a importar deben encontrarse en el directorio /admin/import mientras que nuestro script debe de estar situado en el directorio /admin del Prestashop.
Espero que le pueda (re)servir a alguien.
<?php define('PS_ADMIN_DIR', getcwd()); include(PS_ADMIN_DIR.'/../config/config.inc.php'); include(PS_ADMIN_DIR.'/functions.php'); include_once './tabs/AdminImport.php'; if (!isset($_GET['entity'])) die(); $import = New AdminImport(); switch ($_GET['entity']) { case 0: loadCategoriesPost(); $import->categoryImport(); break; case 1: loadProductsPost(); $import->productImport(); break; default: die(); break; } function loadCategoriesPost() { $_POST = array ( 'tab' => 'AdminImport', 'skip' => '0', 'csv' => 'cat.csv', 'convert' => '', 'entity' => '0', 'separator' => ';', 'multiple_value_separator' => ',', 'import' => 'Importar datos CSV', 'type_value' => array ( 0 => 'id', 1 => 'active', 2 => 'name', 3 => 'parent', 4 => 'description', 5 => 'meta_title', 6 => 'meta_keywords', 7 => 'meta_description', 8 => 'link_rewrite', 9 => 'image', ), ); } function loadProductsPost() { $_POST = array ( 'tab' => 'AdminImport', 'skip' => '0', 'csv' => 'pro.csv', 'convert' => '', 'entity' => '1', 'separator' => ';', 'multiple_value_separator' => ',', 'import' => 'Importar datos CSV', 'type_value' => array ( 0 => 'id', 1 => 'active', 2 => 'name', 3 => 'category', 4 => 'price_tex', 5 => 'tax_rate', 6 => 'wholesale_price', 7 => 'on_sale', 8 => 'reduction_price', 9 => 'reduction_percent', 10 => 'reduction_from', 11 => 'reduction_to', 12 => 'reference', 13 => 'supplier_reference', 14 => 'supplier', 15 => 'manufacturer', 16 => 'ean13', 17 => 'ecotax', 18 => 'weight', 19 => 'quantity', 20 => 'description_short', 21 => 'description', 22 => 'tags', 23 => 'meta_title', 24 => 'meta_keywords', 25 => 'meta_description', 26 => 'available_now', 27 => 'available_later', 28 => 'image', 29 => 'no', ), ); } ?> |
Hay una alternativa a este script que permite importar los datos a Prestashop desde un ERP, fuentes CSV/XML o múltiples fuentes, como proveedores de drop shipping.
Para saber más haz click aquí
juanmicastillo says
Mas que duplicar es, que cada vez que hago una importación me suma otra copia de la imagen.
Jhonatan says
Hola, solo de empezar a leer el post ya me empiezo a marear, que follón…
Lo que está claro es que hay todo un negocio con esto de las importaciones de productos y lo se porque tras intentar cambiar de proveedores me encuentro con que Prestashop no es capaz de importar correctamente ni un CSV ni un XML y no es un casi aislado, es toda una comunidad de usuarios intentando solucionar el tema y que no se solucione…
Da fallos con las categorías y otras cosas porque funciona de una forma muy particular y ningún proveedor te da los archivos XML o XSV con esa estructura.
¿Solución?.
Aquí es donde está el negocio del siglo, te venden modulos (programitas) a precio de oro, entre 150€ y 300€ para que puedas importar los productos de ese proveedor en concreto (eso si el proveedor no cambia mañana la estructura de sus XML o CSV y te dan por el culo porque has tirado 150€ a la basura).
Para cada uno necesitas un modulo y si hay modulos genéricos también dan problemas y tienes que saber configurarlos.
¿Para cuando un PUTO modulo gratuito que permita importar XML?, vamos que creo yo que no será para tanto… que alguien comparta el suyo si es que tiene uno o lo haga saber, porque yo llevo 3 semanas ya intentando importar los productos, pero es que hay gente que lleva mas y esto es para mear y no echar gota…
admin says
Hola Jhonatan,
efectivamente hay todo un modelo de negocio detrás de los módulos. Yo personalmente vengo del mundo del open source e intento compartir aquello que hago de idéntica forma que aprovecho los recursos de que otros que comparten. No obstante, esa es una vía y entiendo que otros modelos son compatibles y entre ellos el modelo de cobrar por un desarrollo.
También es cierto que Presashop podría invertir más esfuerzos en mejorar las importaciones pero me da la sensación de que intentan compatibilizar con ese addon store que han creado y del cual también monetizan. Legítimo, por otro lado.
Un saludo,
Santi (aka vigoncas)
Pedro says
Buenas,
lo primero muchas gracias por compartir la solución.
Como respuesta a Jhonatan me gustaria comentar algunas cosas. Los modulos de importación/migración son complicados de programar, hace falta una solución en cada caso. Eso son horas de desarrollo.
Por otro lado, a los programadores nos gusta comer, pagar el aquiler, comprar ropa… y cuando programas un modulo de migración/sincronización para una tienda no estas programando para una ONG, estas programando para un cliente que gana dinero con lo que vas a hacer, por lo que no veo ningún problema por querer tambien ganar dinero nosotros.
Hay una forma de tener un modulo a medida y sin pagar un €. Programandolo uno mismo. A veces la gente se acostumbra a la soluciones gratis y piensa que tienen derecho a todo. El desarrollo de software a medida implica gasto
Pedro says
Jhonatan, aprende a programar, como tu dices no es para tanto no?, y deja de quejarte. Y si no quieres invertir tu tiempo en aprender pues paga por ello. El peluquero te cobra el corte no?? Pues el programador esta en su derecho de cobrarte su trabajo.
Para ADMIN..impresionante tu trabajo y que ademas lo compartas, me has dado una linea de desarrollo a seguir muy buena. Si llego a algun lado con ella la compartire aqui tb
admin says
Hola Pedro,
encantado de que le saques provecho. Espero tus aportaciones.
Abrazo,
Santi (aka @vigoncas)
Henki says
Hi everybody, i guess you can read the english else i can try to speak spanish next time.
First thank you guys for the script, it’s exactly i was needed since 2 weeks !
But i’ve at least, one more question…
Does my csv file contain all the inputs you quoted. I mean id, active, name, category etc… Can someone show me an extract of his csv pls ?
Thank you
admin says
Hi Henki,
You can obtain a csv structure example from the Prestashop import tool.
Henki says
Para resumir, me gustaria ver un ejemplo de csv con los titulos de las columnas
Henki says
Thanks for your answer.
But i knew that. I did a script to create a csv file which depends of my DB with the following inputs : “reference” “quantity” “price” “id” “name”.
Can i, with your script, import my csv file ?
Henki says
Or i need to create a csv file with exactly the same inputs of prestashop?
admin says
Henik,
this script uses the Prestashop import classes. You need a CSV with the format expected by Prestashop.
Henki says
Ok thanks for your answer.
Is it problematic if i don’t fill all inputs ?
For example if my csv file contain only the reference, name, price and quantity information, can i still use the script with filling a blank in the others inputs ?
admin says
You can test it but I think the unique required field is the name. Try it and remember to share info 😉
Henki says
Ok guys it works ! You just need, and it’s imperative, to notify the name, and the category by default of a product in your csv !
Eric says
Hola,
¿Alguien lo ha probado ya con la version 16?
Adsoa says
Hola Eric.
Yo lo tengo funcionando en la version 1.6 sin problemas.
Eric says
Gracias Adsoa,
¿Hay que hacerle alguna modificación a los códigos que hay aqui? Me gustaría saber cual es tu web y cuantos productos cargar en cada importación.
Gracias de nuevo
Eloy Fernández says
Hola buenos días.
¿Cómo hacéis para llamar al script? Estoy utilizando el que ha puesto un compañero en esta página que es éste:
https://docs.google.com/document/d/1jeJ2d1W2ZAXiwqdwvP4fz_z7Nh7f7z7_eoPueNValVk/edit
Gasto la versión 1.6 de prestashop, y hasta ahora para utilizar el script hago esto (de momento en local):
localhost/prestashop/importar_csv.php?entity=1
Donde importar_csv.php es el nombre con el que he guardado el script. Pero no hace nada… le he puesto unos echos para ver que entra donde toca y responden bien, también hago var_dump($_POST) en la función productImport de la clase AdminImportController y hace lo que toca “escupe” por pantalla los valores que le introduzco en la variable POST… No me saca ningún fallo, pero miro si algo ha cambiado en la base de datos y no hay nada.
PD: tres posibles datos importantes:
– El script lo pongo en la carpeta admin.
– El csv lo pongo en la carpeta admin/import.
– Las imágenes (en el csv) utilizo una url (si cargo el csv normalmente funciona bien).
GRACIAS
amigo says
Enormemente agradecido por este post, gracias al autor y a los q han enriquecido el mismo, todo perfecto!!
Adsoa says
Hola Eloy Fernández.
me doy cuenta que en el docs que has puesto tenemos cierta diferencia en los productos. Aquí te dejo lo que yo tengo puesto:
_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘0’,
‘csv’ => ‘productos.csv’,
‘forceIDs’ => ‘1’,
‘convert’ => ‘1’,
‘entity’ => ‘1’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘iso_lang’ => ‘es’,
‘import’ => ‘Importar datos CSV’,
Espero que te sirva.
Un saludo
Pedro says
Adsoa, en el array… los nombres los dejas en inglés supongo.
Por ejemplo:
0 => ‘id’,
1 => ‘active’,
2 => ‘name’,
3 => ‘category’,
No lo cambias por:
0 => ‘id’,
1 => ‘Activo’,
2 => ‘Nombre’,
3 => ‘Categoria’,
¿O esto hay que adaptarlo al titulo que lleve el CSV?
Pedro says
Vale ya lo he conseguido hacer funcionar, thank you muy bueno, para actualizar un catálogo que ya está importado habría que indicarle algun valor en el array concreto?
yulkar says
Hola
podrias insdicarme como has hecho que funciones??? yo lo ejecuto y no pasa nada,,, se queda la pantalla en blanco,
goyo says
todo muy bien, gracias a sus comentarios me e retroalimentado excelentemente, y he logrado crear el script, y funciona muy bien, pero no me sube las imagenes, estoy trabajando localhost y el resto de los datos se importanta correctamente, lo mas curioso es q usando la herramienta de imporacion de prestashop, si sube las imagenes, pero a traves del script estas no se crean, alguien ha solucionado esto? aclaro q estoy trabajando con la version 1.6
Jose says
Hola, al igual que a Goyo no me sube las imágenes el script.
El csv está bien generado ya que el importador de prestashop las coge, pero el script no.
Alguien tiene la solución?
Dani says
Acabo de conseguir una solución, aunque quizás no la más limpia.
En el /controllers/admin/AdminImportController.php, dentro de la función ProductImport(), hay que añadir las siguientes líneas:
if (!is_array($product->image) )
{
$product->image = explode($this->multiple_value_separator, $product->image);
}
Justo antesde de: (línea 1670 aprox)
if (isset($product->image) && is_array($product->image) && count($product->image))
Ernesto says
Muchas gracias!!!
Me he vuelto loco buscando la solución y la he conseguido de tu escrito, y aunque lo actualiza todo, me gustaría saber si lo que me dice después de la carga habría alguna posibilidad de solucionarlo:
Notice: Undefined property: Product::$image_alt in /home/tecnotorba/paginas/tecnotorba/controllers/admin/AdminImportController.php on line 2103
Esa linea que acabo de escribir, sale por cada archivo que carga, por lo que salen miles, y siempre lo mismo, he mirado y tiene que ser algo de la variable $image_alt pero no se ni para que sirve, ya que yo sólo utilizo la “image” y el campo “image_alt” no se ni lo que es.
Alguna sugerencia/solución?
Muchas gracias de nuevo.
Rosa says
Estás con prestashop 1.7, verdad?
El campo Image_alt es nuevo en 1.7 y no está incluido en los campos del codigo que hay más arriba, deberías incluirlo para que deje de darte el error.
Ernesto says
Gracias Rosa por contestar, si, usto 1.7.2, los productos ya me los carga, mirare lo de “image_alt” en otra ocasión porque no es algo que me corra sumamente prisa pero ya los carga, pero,…, las categorías, eso es otra historia de no acabar…., mi código de categorias es este y la pantalla en blanco sin errores pero no carga ni una categoria, ni crea ni actualiza ni nada de nada:
//______________________________________CATEGORIAS
function loadCategoriesPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘forceIDs’ => ‘1’,
‘skip’ => ‘0’,
‘csv’ => ‘Base_de_datos_categorias.csv’,
‘entity’ => ‘0’,
‘separator’ => ‘|’,
‘multiple_value_separator’ => ‘,’,
‘iso_lang’ => ‘es’,
‘convert’ => ‘1’,
‘import’ => ‘1’,
array (
0 => ‘id’,
1 => ‘name’,
2 => ‘parent’,
3 => ‘is_root_category’,
4 => ‘image’,
),
);
}
¿Alguien sabe como se llaman los campos exactos de las categorias en prestasho 1.7?, creo que se llaman asi, he entrado en el AdminImportController.php y salen esos nombres pero es que sigue sin hacer nada de nada…, y es dudoso que los productos si los cargue mientras las categorias las ignora y claro, si no crea antes las categorias, al crear los productos sin los correspondientes id de esas categorias creadas da problemas.
Rosa says
Intenta poniendo el force_id a 0, sólo por saber si es eso.
Ernesto says
Nada, le doy y en 1 segundo la pantalla en blanco y sin cambios en las categorias, necesitaría saber como saber en que linea salta en el AdminImportController.php para saber que es lo que falla, porque está claro que no toma ningún valor de los campos de array que le estoy mandando, otra solución sería saber de donde puedo conseguir los nombres exactos que debo indicar, he añadido “id”, “name”, “parent” etc, pero en algunos casos de prestashop antiguos se llamaban “id_category”, “name”, “id_parent”, etc, lo he probado de varias formas pero sigue sin ir.
Alguna idea?, he buscado por todos sitios hasta en foros ingleses y no hay nada mas que este post…, asi que a ver si alguien puede ayudarme porque no hay manera de que cargue ni una sola categoría, y como se que funciona porque los productos si los carga, se que tiene que ser algun nombre de campo que no está bien escrito, pero…. ¿cuál?…
Ernesto says
Rosa, podrias decirme cual es la versión que utilizas de Prestashop y pegarme el código de la carga de las categorias?, asi como el principio del script php?, a ver si veo algo distinto en mi código y que al cambiarlo, resuelva el problema.
Gracias.
Rosa says
Yo uso prestashop 1.6, las categorías no las importo, para mi es más fácil que las cree el cliente.
Hice las pruebas en su momento, pero lo dejé, me daba demasiados problemas.
Intentaré a ver si encuentro el código que usaba pero cambié de PC y no se donde habrá ido a parar.
Ernesto says
Vale gracias, es que teniendo tu versión del script php y sabiendo que es la versión 1.6, puedo editar el archivo AdminImportController.php de esa versión y buscar los campos para, de igual manera, revisar en las mismas o casi, lineas de la versión 1.7 y mirar a ver si algún campo ha cambiado , y en vez de llamarse “parent” se llama ahora “id_parent”, pues de conseguirlo ya podría cargar el catálogo automaticamente cada hora sin necesidad de estar pegado al servidor y activando las actualizaciones a mano.
Si alguien más tiene la versión 1.6 y tiene el script php, tambien sería de gran ayuda (siempre que le funcione el tema de creación/revisión de categorias, pues el tema de productos lo tengo solventado).
Javier says
Tengo laversion de prestashop 1.6.0.6 y cuando ejecuta la linea
$import = New AdminImportControllerCore();
Se queda en blanco
Alguno tienen el script completo para esa version dado por lo que he visto los campos de productos llegan hasta el 54 en vez del 52.
No se si será pro eso…
GRACIAS
Manu says
Hola tio lo has conseguido solucionar, porque tengo la 1.6.0.9 y me cuando importo las categorías se me queda en blanco.
Dani says
A mi tampoco me funcionaba, pero lo he solucionado cambiando:
define(‘PS_ADMIN_DIR’, getcwd());
include(PS_ADMIN_DIR.’/../config/config.inc.php’);
include(PS_ADMIN_DIR.’/functions.php’);
include_once ‘./tabs/AdminImport.php’;
Por:
if (!defined(‘_PS_ADMIN_DIR_’))
define(‘_PS_ADMIN_DIR_’, getcwd());
include(_PS_ADMIN_DIR_.’/../config/config.inc.php’);
include(_PS_ADMIN_DIR_.’/functions.php’);
include_once ‘./tabs/AdminImport.php’;
require_once(_PS_ADMIN_DIR_.’/init.php’);
$context = Context::getContext();
Ahora funciona todo menos la importación de imágenes. ¿Alguna idea?
Antonio says
from traslate.google.it
Hola, Adsoa lo siento, pero ¿cómo se ejecuta el comando desde la línea de comandos? usted puede enviar el archivo por correo para x controlalre dónde estoy equivocado? Estaría muy agradecido. Estoy golpeando mi cabeza durante mucho tiempo. Muchas gracias
manel says
para aquellos que les de un error de isLoggedBack():
probad de añadir la siguiente linea antes de llamar a la funcion de importar y de crear el objecto también mejor:
Context::getContext()->employee = new Employee(id_empleado_que_está_loggeado);
EB says
Gracias!! Funciona perféctamente!!
🙂
Dani says
Primero decir que tu script me parece muy bueno y que me alegro que aún exista gente que comparta su trabajo para los que estamos empezando en esto, nos sirve de mucho y te doy las gracias.
Estoy probando tu script, porque es justamente lo que necesito, tengo la versión 1.5.4.0 de prestashop, y tengo algunas dudas ya que no consigo hacer funcionar tu script, he descomentado las lineas $import = New AdminImportControllerCore(); //para version 1.5.4.1 y comentado las lineas //$import = New AdminImportController(); y el script se ejecuta pero no me actualiza los productos, he decir que mi directorio admin se llama privado, y he hubicado los archivos como explicas en el script no se si el cambio de nombre influye o no? Tampoco entiendo si el csv ubicado en el directorio admin/import se debe llamar pro.csv o cat.csv obligatoriamente o coge lo que hay dentro del directorio?
Espero tu respuesta y muchas gracias de nuevo por compartir tu trabajo.
admin says
Hola Dani,
encantado de compartir 😉
El cambio de nombre del directorio admin no debería de ser un problema. Eso sí, si tus ficheros CSV tienen otro nombre, lo tienes que indicar. El script, tal cual está, busca los ficheros cat.csv y pro.csv.
Espero que con esto te funcione.
Abrazo,
Santi
jascaniojah says
Alguien me ayuda con un script funcional para 1.6.0.9? No logro hacerlo andar.
Rodrigo says
Hola,
He seguido vuestras indicaciones pero tampoco logro que haga nada. Se queda la pantalla en blanco sin ningún error pero no hace nada. Estoy con la version 1.6.0.9.
¿Alguien lo ha conseguido?
samuel says
tengo el mismo problema :
Se queda en $import = new AdminImportControler();
he metido uno echo en AminImportControler.php en el construtor
y llega hasta hay, pero no sigue para delante
Manu says
Hola,
tengo el mismo problema. Conseguiste solucionarlo?
samuel says
employee = new Employee(‘info@inmobiliariacastrum.com’);
echo “COMENZAMOS”;
$a = “soporte@baqap.es”;
$tema = “Importación de datos Castrum”;
$cuerpo = “Ha comenzado la importación de datos de Castrum el proceso tarda varias horas, cuando termine recibira un correo”;
if (mail($a,$tema,$cuerpo)) echo “Correo enviado Revise su bandeja de entrada”;
error_reporting(E_ALL);
ini_set(‘display_errors’, ‘1’);
//define(‘PS_ADMIN_DIR’, getcwd());
//}
include (‘mezclame.php’);
//include(‘functions.php’);
//mezclaficheros ();
//if (!isset($_GET[‘entity’])) die();
//echo “seguimos pa lante”;
$import = New AdminImportController();
//switch ($_GET[‘entity’]) {
//case 0:
// loadCategoriesPost();
// $import->categoryImport();
// break;
// case 1:
//echo “CARGANDO PRODUCTOS”;
loadProductsPost();
$import->productImport();
// break;
//default:
//echo “pa fuera”;
// die();
// break;
//}
function loadCategoriesPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘0’,
‘csv’ => ‘cat.csv’,
‘convert’ => ”,
‘entity’ => ‘0’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘import’ => ‘Importar datos CSV’,
‘type_value’ =>
array (
0 => ‘id’,
1 => ‘active’,
2 => ‘name’,
3 => ‘parent’,
4 => ‘description’,
5 => ‘meta_title’,
6 => ‘meta_keywords’,
7 => ‘meta_description’,
8 => ‘link_rewrite’,
9 => ‘image’,
),
);
}
function loadProductsPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘truncate’=>’1’,
‘skip’ => ‘0’,
‘csv’ => ‘prod.csv’,
‘iso_lang’=> ‘es’,
‘convert’ => ‘0’,
‘entity’ => ‘1’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘forceIDs’ => ‘1’,
‘import’ => ‘Importar datos CSV’,
‘type_value’ =>
array (
0 => ‘id’,
1 => ‘active’,
2 => ‘name’,
3 => ‘category’,
4 => ‘supplier’,
5 => ‘price_tex’,
6 => ‘id_tax_rules_group’,
16 => ‘manufacturer’,
22 => ‘description_short’,
23 => ‘description’,
34 => ‘meta_description’,
29 => ‘image_url’,
31 => ‘reference’
),
);
}
?>;
samuel says
yo lo uso solamente para los productos (por eso comento lo de las categorias)
utilízalo al gusto.
Estoy intentando solventar el problema de la importación de imagenes ya que no me importa ninguna mi version de PS es la
1.6.0.9
salva says
Hola, que nombre le pongo al script cuando lo meta dentro de /admin
Saludos
admin says
Hola Salva,
Este script sólo lo llamarás tú a voluntad, por lo que puedes bautizarlo como quieras 😉
Marcureli tech says
Perdonar , que diferencia hay entre el modulo que viene por defecto en prestashop 1.5.x para importar un csv y el script que planteáis.
Yo hasta ahora importo los productos etc.. con el modulo que viene por defecto sin problemas . Que me aporta mas .
admin says
De hecho este script utiliza ese módulo. No obstante, implementado así, te permite automatizar las sincronizaciones, por ejemplo o incluso lanzar la importación de varios ficheros. Imagínate que tienes un CSV que te proveen por FTP y el cual tienes que sincronizar cada hora.
Espero haberte ayudado 😉
Gustavo says
Hola!
Primero que nada, muchas gracias por compartir el script, está genial!
ahora que nombras las sincronizaciones, yo tengo problemas para ejecutar mi script mediante un CRON job. Investigando, he averiguado que el problema reside en las direcciones relativas, incluso copié tu encabezado y lo probé:
define(‘PS_ADMIN_DIR’, getcwd());
include(PS_ADMIN_DIR.’/../config/config.inc.php’);
include(PS_ADMIN_DIR.’/functions.php’);
include_once ‘./tabs/AdminImport.php’;
pero también dió error. Mi servidor es un linux con Plesk.
¿A tí te da algún tipo de problema la automatización con CRON ??
Saludos,
Gustavo
Gustavo says
Me olvidé de comentar antes que si ejecuto mi script desde el navegador, a mano, funciona tanto de la manera original que yo tenía, como copiando tu cabecera.
Pongo aquí como lo tengo yo con la ruta completa:
include(‘/var/www/vhosts/vlmotorsport.com/httpdocs/prueba/config/config.inc.php’);
include(‘/var/www/vhosts/vlmotorsport.com/httpdocs/prueba/init.php’);
Category::regenerateEntireNtree();
Lo necesito para que regenere el listado Ntree luego de hacer la importación de categorías.
admin says
Hola Gustavo,
en principio no tendría el porqué dar problemas la llamada desde CRON. En mi caso, como comentaba en el texto, no llegue a utilizarla. No obstante, a ver si alguien te puede dar luz.
Abrazo
Gustavo says
Hola,
ya solucioné el tema del CRON. Al hacer las llamadas al CORE, hace que la tienda se ponga en modo mantenimiento, durante una fracción ínfima de tiempo, por lo que hay que añadir la ip del servidor en el apartado correspondiente del BO de prestashop.
Si alguien necesita ayuda con esto… 😉
Iñaki says
hola gracias por este gran post, solo me gustaria hacerle una pregunta, no entiendo bien “según se le indique por GET[‘entity’]” la verdad que no entiendo mucho pero me seria de gran ayuda, un saludo
admin says
Hola Iñaki,
me refiero a que según el valor que se pase por GET de ‘entity’ el script importa categorías o productos. Queda claro en la línea que pone:
…
switch ($_GET[‘entity’]) {
…
Marc says
Buen post, pero tengo una consulta, si solo deseo actualizar el stock con un CSV con los ean13 y la cantidad, me puede servir? Que debería cambiar? El proveedor me facilita una URL que actualiza el stock y como referencia utiliza el ean13. Gracias de antemano.
haven66 says
Hola buenas, he llegado a este post buscando soluciones de importación de productos ya que la versión de prestashop la 1.6.0.9 me da problemas a la hora de importar productos de 120 en 120, ya que tengo que añadir 3700 productos, tienes tu algún módulo de importación que funcione bien o has probado alguno que si que funcione de forma correcta.
Un saludo y gracias
admin says
Hola,
siento decir que no tengo experiencia con ningún módulo concreto de importación. Siempre que lo he necesitado he desarrollado soluciones a medida.
Abrazo
Flykillerman says
Funciona de lujo en la 1.5.6.2 con categorias y productos. Pero se puede usar este script para importar combinaciones ???
Gran aporte 🙂
Flykillerman says
Me autocontesto 🙂
function loadCombinationsPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘1’,
‘csv’ => ‘auto_import_combination.csv’,
‘convert’ => ‘1’,
‘entity’ => ‘2’,
‘iso_lang’ => ‘es’,
‘regenerate’ => ”,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘import’ => ‘2’,
‘type_value’ =>
array (
0 => ‘id_product’,
1 => ‘group’,
2 => ‘attribute’,
3 => ‘supplier_reference’,
4 => ‘reference’,
5 => ‘ean13’,
6 => ‘upc’,
7 => ‘wholesale_price’,
8 => ‘impact’,
9 => ‘Ecotax’,
10 => ‘quantity’,
11 => ‘minimal_quantity’,
12 => ‘impact_on_weight’,
13 => ‘default_on’,
14 => ‘image_position’,
15 => ‘image_url’,
16 => ‘delete_existing_images’,
17 => ‘Shop’
),
);
}
Un saludo
admin says
Me alegra que te guste 😉
Roque says
Excelente post, una pregunta: si utilizo este script tal cual está me carga nuevos productos y los que ya tenia creados manualmente en la tienda quedan intactos?
admin says
Hola Roque,
si no recuerdo mal, Prestashop te permite decidir cuando haces importaciones, si quieres eliminar previamente todos los datos o no. Si localizas el parámetro lo puedes pasar en la llamada y conseguir el efecto que prefieras.
Dario says
Hola admin, Como estas, antes que nada quiero felicitarte por el excelente script q después de muchas horas de quemarme las pestañas pude hacerlo funcionar.. Te comento q estoy buscando el parámetro que me permite eliminar todos los productos antes de comenzar con la importar pero no logro descubrirlo, podrías decirme cual es?
Muchas gracias,
admin says
Hola Dario,
creo que no está incluido en el script pero por defecto, si no me equivoco, el script elimina todo antes de importar.
Hardman says
Gracias por el aporte , yo en sql no tengo ni zorra, hasta ahora me defendia con html y css , pero esto ya no lo pillo.
1 – en que formato guardo el script ? php?
2-segundo como realizo las consultas ? desde phpmy admin y cual es la formula exacta si el nombre del fichero es pepito. lo que sea?
Insisto perdon por las preguntas pero soy neofito en sql
Hardman says
Ah!!!! se me olvidava , otra cosa que no pillo es lo de crear tareas cron , no tengo tareas cron o cronjobs porque mi proveedor (strato) las a quitado (lumbreras) de mi paquete , en html o css con un simle enlace basta , pero al ser un sql no se como hacerlo ( he leido mas arriba pero ….lo dicho sy novato y no tengo ni idea).
admin says
Hardman, no entiendo muy bien lo de que un simple enlace basta para el caso de html o css. No obstante, el cron se utilizaría para llamar periódicamente al script en el caso de querer programar actualizaciones regulares.
Jesus says
Hola alguien me puede pasar el script completo Gracias.
Hardman says
he creado el script , pero al darle al enlace se queda en blanco , he cambiado los parametros wholesale_price por precio_al_por_mayor por ejemplo el script lo he guardado en php y lo he subido a la raiz de mi tienda , despues he subido el archivo csv a la carpeta import pero eso…se queda en blanco
Alba says
jajaja, me parto con el primer comentario.
Que bueno el señor Jhonatan , que ganas tiene de que los programadores trabajen gratis, software gratis, pelis gratis, todo genial. y gratis.
Los programadores ya curran para ti porque les mola la idea de currar gratis, vaya Jeta
Saludos y gracias por compartir.
Marco says
Hola, y se podria utilizar el mismo para actualizar tarifas de un transportista? Muchas gracias
admin says
Hola Marco,
en el momento Prestashop permita la importación de esas tarifas desde su herramienta de importación, se podrá adaptar este script para realizar la actualización de los datos con él. Es decir, por ahora creo que no 🙂
Abrazo
David says
Me parece un poco de caradura el ir pregoneando de que Prestashop y otros es un modelo de negocio en plan “sacaperras”. Decir que esos 150 o 300 euros o lo que te vaya a costar va a ser siempre inferior a un módulo programado a medida en un software hecho a medida.
Gaizka says
Hola a todos,
Antes que nada agradeceros la gran ayuda, el script inicial era buenisimo y gracias a los comentarios del resto de compañeros hemos podido completar toda la información. Nosotros usamos la versión 1.5.6.2. y hemos conseguido que nos funcione el último script aportado por “mario carlomagno”, pero no se añaden las imágenes. Si lo importamos manualmente no hay problema, pero con el script no se meten (aunque no da ningún error).
Como la imágen nos viene dada por url, lo que hacemos es añadir en el array:
11 => ‘image_url’,
¿Alguna idea?
Muchas gracias de antemano.
Jose says
Hola,
Sería posible cargar los datos desde una variable o array en vez desde un csv?
Gracias, un saludo
admin says
Hola José,
este script utiliza la base de importación de Prestashop que se basa en el CSV. Lo veo complicado. Para eso te recomiendo un desarrollo a medida. Aquí puedes encontrar uno que hace justo eso pero es de pago 😉
https://programadorphp.es/downloads/script-de-importacion-a-prestashop
Abrazo,
Santi
Dario says
Hola admin, Como estás, yo de nuevo por acá..
Quería consultarte ya que estoy buscando el parámetro que me permite eliminar todas las categorías que existen antes de comenzar con la importar.
Me encontre con este parametro: ‘truncate’ => ‘truncate’; el cual supongo, debería eliminar todas las categorías para luego importarlas nuevamente pero veo que está ignorando dicho parametro.
Podrías decirme si estoy tomando el parametro correcto?
P.D: Si a alguien le sirve, lo tengo funcionando correctamente en la versión 1.6.14,
Muchas gracias,
Saludos!
admin says
Hola de nuevo Dario,
no lo tengo tocado en la versión 1.6. No sé si truncate es el parámetro pero si desgranas un poco el código de Prestashop lo verás de inmediato.
Siento no poder ayudarte más 😉
Abrazo
Isaac Aristil says
Hola,
tienes la solucion para el ‘truncate’ => ‘truncate’ ?
gracias de ante mano
saludos
Luis says
A alguien se le ocurre como hacerlo funcionar en prestashop 1.6.14, no he conseguido que haga nada, además el archivo de la carpeta tabs no existe, gracias.
Dr.yodarga says
Hola Admin, tengo la versión 1.6.0.14 y estoy haciendo un script para esa versión. Muchas gracias por este aporte. ¿Me puedes orientar en como cargar las imágenes? He mirado dentro de adminimport para sacar una función que la suba mediante post pero nada.
admin says
Hola Dr.yodarga,
en esa versión en concreto desconozco como se suben las imágenes pero en principio se le deberían de pasar las urls como un parámetro más del CSV, no?
dr.yodarga says
Echando un vistazo al adminImport veo que el array de image_url esta fuera de la tabla producto. Y tambien creo que en esta version lo que hace el adminimport es descargar la imagen y lo que sube a la mysql es el nombre de la imagen, no la url. En el adminImport tiene que haber una funcion que me suba la url y luego ya si pueda entrar con el codigo de arriba.
luis says
Hola Admin,
estoy tratando de hacerlo funcionar en la versión 1.6.0.14, concretamente lo que quiero hacer es una vez subidos todos los artículos poder modificar el stock. Pero no consigo que haga absolutamente nada, ¿que tengo que modificar para que funcione en esta versión?
admin says
Hola Luis,
no dispongo de una versión que funcione en ese Prestashop. Si la consigo te la paso. Si te adelantes y lo consigues antes, te pido que la compartas.
Abrazo
Luis says
Hola admin, creo que he solventado el problema de la versión, buen al menos con las categorias funciona, podrías mandarme un archivo de demo.csv de los artículos, porque muchos campos no se ni que poner gracias.
admin says
Hola Luis,
lo siento pero no tengo ninguno a mano. A ver si alguien se anima a colgar alguno.
Abrazo,
Santi
Jorge says
Hola admin, en primer lugar muchas gracias por el aporte.
Aqui va mi problema, estoy usando la version 1.6 de prestashop y he conseguido que me funcione la importación de productos y de categorías (gracias a los comentarios de toda la gente), pero cuando intento que cargue un archivo csv con los proveedores o con los fabricantes no me hace nada.
No se si hay que hacer algo especial en estos casos.
Muchas gracias.
Aqui adjunto el codigo del método que llamo para cuando es proveedores o fabricantes.
//fabricantes
function loadManufacturersPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘1’,
‘csv’ => ‘fabricantes.csv’,
‘convert’ => ‘0’,
‘regenerate’ => ‘0’,
‘entity’ => ‘5’,
‘iso_lang’ => ‘es’,
‘truncate’ => 1,
‘forceIDs’ => ‘1’,
//”match_ref” => ‘0’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘import’ => ‘1’,
‘type_value’ =>
array (
0 => ‘id’,
1 => ‘active’,
2 => ‘name’,
3 => ‘description’,
4 => ‘short_description’,
5 => ‘meta_title’,
6 => ‘meta_keywords’,
7 => ‘meta_description’,
8 => ‘image’,
),
);
}
//proveedores
function loadSuppliersPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘1’,
‘csv’ => ‘proveedores.csv’,
‘convert’ => ‘0’,
‘regenerate’ => ‘0’,
‘entity’ => ‘6’,
‘iso_lang’ => ‘es’,
‘truncate’ => 1,
‘forceIDs’ => ‘1’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘import’ => ‘1’,
‘type_value’ =>
array (
0 => ‘id’,
1 => ‘active’,
2 => ‘name’,
3 => ‘description’,
4 => ‘short_description’,
5 => ‘meta_title’,
6 => ‘meta_keywords’,
7 => ‘meta_description’,
8 => ‘image’,
),
);
}
Jorge says
Me contesto y dejo la respuesta por si a alguién mas le sirve.
Ya lo he conseguido, encontre la solución en esta página:
https://coderwall.com/p/2q5lcw/prestashop-background-cron-csv-products-import
Esto te permite realizar la importación sin tener que estar logueado como administrador, para realizar una importación automática en un futuro mediante una tarea programada.
Un saludo.
Mikel says
Hola Jorge y al resto de participantes de este post,
Primero gracias a todos los que han comentado y aportado su trabajo y su esfuerzo con sus scripts y comentarios.
Bien, tengo una tienda online funcionando. Creada por mi mismo sin conocimientos de programación ni nada. Después de un año estudiando para crearla y aprendiendo pues he podido aprender algo de programación en php.
En tu aporte Jorge, entiendo que los dos códigos (php curl wrapper y wrapper curl class ) se han de guardar en archivos diferentes, pero:
1º ¿podrías aclararme si es así y con que nombre?
2º Según ese post, es para la versión 1.5.6. ¿Funciona con la version 1.6.0.14?
3º PARA CUALQUIER USUARIO QUE DESEE ORIENTARME:
Llevo un tiempo haciéndome el valiente he investigando como se hace una tarea de cron para actualizar mis productos diariamente con el archivo que me proporciona mi proveedor (tiene 1 en xml y otro en csv). En el aporte tuyo Jorge, el post habla de la sentencia de cron que usa pero eso es Linux y lo que yo he encontrado es algo así como “* * * * 0 …” o esto “30 4 * * * /usr/bin/curl “. He probado con innumerables ejemplos y no me ha funcionado nada en la tienda que tengo en local.
Total que esto del cron parece un poco tabú porque no encuentro nada que me diga como sería la sentencia a introducir dentro del módulo de cron de prestashop. Por lo que si hay alguien que actualice sus productos diariamente en prestashop y quiera compartir dicha sentencia de cron, pues yo personalmente estaría muy agradecido y seguramente muchas otras personas también lo estarían.
En fin un saludo y agradecidos por los aportes de este post.
Jorge says
Hola Mikel,
Lo primero decirte que yo lo estoy usando en una versión de prestashop 1.6.0.14 y me funciona.
En lo referente a donde se han de guardar los archivos (script cron y wrapper curl class ), yo los guardo como en el enlace que puse, en archivos separados pero se pueden guardar en el mismo archivo (Si no sabes programación para no liarte dejalos en archivos separados, porque para ponerlos en uno solo hay que hacer algunos cambios).
El motivo de guardarlos en archivos separados es porque el “wrapper curl class” es una clase que implementa las funciones (métodos) que son comunes siempre y en ella en principio no hay que modificar nada (te sirve para llamar a esa clase desde otros scripts y asi reutilizarla sin tener que copiar y pegar todo otra vez en otros usos).
Es en el “script cron” donde tiene que modificar los datos que necesitas y asi adecuarlo a tu tienda.
El nombre con el que los guardas da igual, les das el nombre que quieras. Por ejemplo al “script cron” lo llamas “importar.php” (este sería el codigo que aparece primero en el enlace) y al “wrapper curl class” lo llamas “MiClase.php” (el segundo código que aparece en el enlace) .
En el “script cron” donde pone require_once (‘class.PSRequest.php’); en nuestro ejemplo sería require_once (‘class.MiClase.php’);.
En el “wrapper curl class” pone class PSRequest en nuestro ejemplo sería class MiClase.
Y cuando hagas la tarea programada al archivo que tendrás que llamar es al “importar.php”.
(Guarda ambos archivos en la misma ubicación)
Espero haberme explicado y que te sirva (siento si me he enrrollado demasiado).
PD: para entender mejor el código si no lo has hecho ya mira tutoriales sobre PHP orientado a objetos (para este caso).
Un saludo.
Luis says
Ahora no consigo que pase de if (!isset($_GET[‘entity’]))
die();
no sé que estoy haciendo mal, ni siquiera me funciona el código original, alguien me puede decir como hace la ejecución del script? Gracias.
Jorge says
Perdón pero nose porque no pega todo el código (será por la longitud que será demasiado)
Dame un correo si quieres y te mando los archivos.
Al administrador si no le importa que elimine las 2 contestaciones anteriores para no confundir a nadie.
Un saludo
richard says
Hola jorge, podrías por favor pasarme el script? disculpa es que lo necesito y no me funciona..
Jorge says
Hola Richard,
dame una dirección de correo y te mando los scripts necesarios.
Un saludo.
Isaac Aristil says
Hola , resolviste el problema?
saludos
Isaac Aristil says
Hola,
Prestasho : 1.6.1.0
La importation con el script, solo importa 55 productos de 430, pero sin imagenes.
Mientras que la importacion mediante la herramienta de prestashop(Back-Office) importa el mismo csv correctamente y hasta con las imagenes.
Solo me da un pequeNo erro y un Warningn, pero eso no altera el resultado de la importacion:
error:
(id = null) no puede ser guardado (desde notepad++ he eliminado las liNas en blanco)
warnings:
Prestashop ha re-escrito los nombres de los productos , remplazando los espacios por: – y las mayusculas en minusculas
**
Lo 55 productos importados, desde mi punto de viste fueron tomado al azar, es decir que el script no fue importando desde la primera liNa hasta la liNa 55.
El script esta adjunto.
Gracias de antemano !
saludos
Jiri says
Hola,
Por favor, aqui puede dar guión funcional completa PrestaShop 1.6.1.0.?
Gracias.
Isaac Aristil says
Hola,
Si, podria pasarte el código del script funcionando para la versión 1.61.0
dame tu email
Saludos
Isaac
Juanky says
Podrías pasarme el script a mi también? por favor.
Fernando says
Buenas!!!!
Alguien podría pasarme el código del script funcionando para la versión 1.61.0, llevo varios días probando con el original, y no consigo que funcione, me da errores. Ni siquiera hago funcionar la class AdminImportController. Por cierto, ¿en que carpeta esta la clase AdminImport.php? veo bastante claro el script, pero estoy teniendo algún pequeño error con las clases y no lo veo…….gracias de antemano.
Isaac Aristil says
Hola,
Si, podria pasarte el código del script funcionando para la versión 1.61.0
dame tu email
Saludos
Isaac
Antonio Dominguez says
Si puedes pasármelo a mi también te lo agradecería. MMUUuuuuchas Graciasssss!!
Belicit says
Me uno a la petición también para PS 1.6.1.0 … , no lo doy puesto a funcionar 🙁 , pantalla en blanco…muchas gracias.
Belicit says
Ya, está lo hice funcionar en 1.6, lo tenía en una carpeta con otros scripts y había que ponerlo en la carpeta de admin 😉
Daniel says
Hola muy buenas!
Me uno a la petición del script para 1.6.10 ya que he intentado este, modificandolo pero no me funciona del todo como me gustaria.
De echo, no hace nada… 🙁
alex says
también tengo el mismo problema si podrías pasarme el script te lo agradecería mucho .