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í
Luis says
A mi también me interesa el código, lo tengo todo funcionando salvo imagenes
Juanky says
Hola , me puedes pasar el codigo que tengas aunque no funcionen las imagenes ? gracias
Ernesto says
He leido que es algo que hay en el archivo ImportAdminController.php, la imágen cuando se toma desde fuera no se toma como un array, pero al no tener conocimientos muy extensos en PHP no me entero y no encuentro a nadie que sepa solucionar mi problema, el post que he encontrado que dice como cambiarlo es este:
https://www.prestashop.com/forums/topic/74735-importar-productos-desde-cvs-con-script-no-sube-imagenes/
Pero la versión de este prestashop es la 1.5 creo, y yo tengo la 1.7.2 y no sale igual.
En mi versión sale este código:
————————————————————————————————————–
if (!$validateOnly && isset($product->image) && is_array($product->image) && count($product->image)) {
$product_has_images = (bool)Image::getImages($this->context->language->id, (int)$product->id);
foreach ($product->image as $key => $url) {
$url = trim($url);
$error = false;
if (!empty($url)) {
$url = str_replace(‘ ‘, ‘%20’, $url);
$image = new Image();
$image->id_product = (int)$product->id;
$image->position = Image::getHighestPosition($product->id) + 1;
$image->cover = (!$key && !$product_has_images) ? true : false;
$alt = $product->image_alt[$key];
if (strlen($alt) > 0) {
$image->legend = self::createMultiLangField($alt);
}
// file_exists doesn’t work with HTTP protocol
if (($field_error = $image->validateFields(UNFRIENDLY_ERROR, true)) === true &&
($lang_field_error = $image->validateFieldsLang(UNFRIENDLY_ERROR, true)) === true && $image->add()) {
// associate image to selected shops
$image->associateTo($shops);
if (!AdminImportController::copyImg($product->id, $image->id, $url, ‘products’, !$regenerate)) {
$image->delete();
$this->warnings[] = sprintf($this->trans(‘Error copying image: %s’, array(), ‘Admin.Advparameters.Notification’), $url);
}
} else {
$error = true;
}
} else {
$error = true;
}
————————————————————————————————————–
Si alguien tiene conocimientos PHP y sabe hacer que la variable “image” se pueda exportar desde fuera nos sería de gran ayuda, puede fijarse en el foro que he escrito para ver si con esta versión se puede modificar algo.
Espero información de alguien gracias 🙂
Richard says
Buenas tenia el tuyo anterior y funcionaba perfectamente, pero actualice a 1.6 y dejo de funcionar, puedes pasarme el nuevo por favor? y muchas gracias!
Alfonso says
Hola
Estoy intentando hacer la importación en prestashop 1.6.1.2 y no lo consigo, aqui el código que uso:
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 => ‘category’,
1 => ‘parent’,
2 => ‘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’,
),
);
}
?>
Se queda la pantalla en blanco y no hace nada.
¿Alguna pista de qué hago mal?
Gracias.
Alfonso says
Se ha copiado solo parte esto es lo que falta:
categoryImport();
break;
case 1:
loadProductsPost();
$import->productImport();
break;
default:
die();
break;
}
Marco says
i have more that 29 fields on prestahsop sample csv file :
ID|Active (0/1)|Name *|Categories (x,y,z…)|Price tax excluded or Price tax included|Tax rules ID|Wholesale price|On sale (0/1)|Discount amount|Discount percent|Discount from (yyyy-mm-dd)|Discount to (yyyy-mm-dd)|Reference #|Supplier reference #|Supplier|Manufacturer|EAN13|UPC|Ecotax|Width|Height|Depth|Weight|Quantity|Minimal quantity|Visibility|Additional shipping cost|Unity|Unit price|Short description|Description|Tags (x,y,z…)|Meta title|Meta keywords|Meta description|URL rewritten|Text when in stock|Text when backorder allowed||Available for order (0 = No, 1 = Yes)|Product available date|Product creation date|Show price (0 = No, 1 = Yes)|Image URLs (x,y,z…)|Delete existing images (0 = No, 1 = Yes)|Feature(Name:Value:Position)|Available online only (0 = No, 1 = Yes)|Condition|Customizable (0 = No, 1 = Yes)|Uploadable files (0 = No, 1 = Yes)|Text fields (0 = No, 1 = Yes)|Out of stock|ID / Name of shop|Advanced stock management|Depends On Stock|Warehouse
how can i identify correct names of new files tables ??
alex says
Me sube los caracteres en otra iso como los puedo corregir:
Pequeño | electrodoméstico
y los subo con
iso lang = es
ender ochoa says
saludos…
primero que nada muchisimas gracias, me ha servido mucho, subire mis observaciones a lo que termine, pero por ahora tengo un problema, agradeceria si pueden ayudarme.
uso prestashop 1.6, recien descargado y estoy tratando de usar la opcion truncate, la cual no veo en los ejemplos anteriores, pero en teoria si al arreglo se le pasa la opcion truncate, debe borrar toda la entidad(categorias, productos, combinaciones), pero esta no se ejecuta, viendo el codigo de prestashop es necesario estar logeado como super admin.
Entonces mi pregunta es como hacerlo?
he intentado hacer algo pero no me funciona, escribo parte del codigo aqui
include_once ‘../controllers/admin/AdminLoginController.php’;
$_POST=array(
‘ajax’ => 1,
‘token’ => ”,
‘controller’ => ‘AdminLogin’,
‘submitLogin’ => 1,
‘passwd’ => ‘123456’,
’email’ => ‘enderochoa@gmail.com’,
‘redirect’ =>false ,
‘ajaxMode’ => 1
);
$login = new AdminLoginController();
$login->processLogin();
me retorna esto
{“hasErrors”:false,”redirect”:”index.php?controller=AdminDashboard&token=1e605de6926c3a2a03e253226dfc490b”}
Muchas Gracias…
Javi says
Hola, me ha servido el código para importar en Prestashop 1.6+, dejo las modificaciones que he tenido que hacer.
// Cabmios en la preparación
define(‘_PS_ADMIN_DIR_’, getcwd());//Recordar que el script tiene que estar en la carpeta del backoffice/administrador, sino, modificad esta constante para que apunte a tal carpeta.
require_once(_PS_ADMIN_DIR_.’/../config/config.inc.php’);
require_once(_PS_ADMIN_DIR_.’/../controllers/admin/AdminImportController.php’);
$import = new AdminImportController();
// Cambios en los parámetros POST
function loadProductsPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘1’,
‘csv’ => ‘20160330165306-products_import.csv’,
‘convert’ => ”,
‘regenerate’ => ”,
‘entity’ => ‘1’,
‘iso_lang’ => ‘es’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘import’ => ‘Importar datos CSV’,
‘type_value’ =>
array (
0 => ‘id’,
1 => ‘active’,
2 => ‘name’,
3 => ‘category’,
4 => ‘price_tex’,
5 => ‘id_tax_rules_group’,
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 => ‘upc’,
18 => ‘ecotax’,
19 => ‘width’,
20 => ‘height’,
21 => ‘depth’,
22 => ‘weight’,
23 => ‘quantity’,
24 => ‘minimal_quantity’,
25 => ‘visibility’,
26 => ‘additional_shipping_cost’,
27 => ‘unity’,
28 => ‘unit_price’,
29 => ‘description_short’,
30 => ‘description’,
31 => ‘tags’,
32 => ‘meta_title’,
33 => ‘meta_keywords’,
34 => ‘meta_description’,
35 => ‘link_rewrite’,
36 => ‘available_now’,
37 => ‘available_later’,
38 => ‘available_for_order’,
39 => ‘available_date’,
40 => ‘date_add’,
41 => ‘show_price’,
42 => ‘image’,
43 => ‘delete_existing_images’,
44 => ‘features’,
45 => ‘online_only’,
46 => ‘condition’,
47 => ‘customizable’,
48 => ‘uploadable_files’,
49 => ‘text_fields’,
50 => ‘out_of_stock’,
51 => ‘shop’,
52 => ‘advanced_stock_management’,
53 => ‘depends_on_stock’,
54 => ‘warehouse’,
)
);
}
admin says
Javi, gracias por el aporte 😉
joan says
sigo con la pregunta.
si solo quisiera actualizar mediante cron con este script las cantidades
teniendo en cuenta que tengo combinaciones?
alguien me podria pasar una plantilla?
please!!!!
gracias de antemano!
Rosa says
Lo único que hay que hacer es eliminar los campos que no quieres subir el resto es identico.
joan says
gracias lo intentare!!!
Rosa says
Hay alguna forma de recibir conformidad de que todo ha funcionado correctamente?, la importación funciona en el 99% de los casos, pero no he conseguido tener la seguridad de que ha sido así. Me falta algo?
Javi says
Pues si quieres ver si hay errores, creo que los mensajes de error se guardarian en el array ‘$import->errors’
Y en ‘$import->warnings’ se guardan los tipicos mensajes como:
El link reescrito para #nombre de producto@ (ID: null) se reescribió como …….
Rosa says
A ver si consigo capturarlos, porque mi nivel de PHP es bastante justito. Gracias
Juan Muñoz says
Antes de nada agradecerte este post ya que resuelve uno de mis problemas…
Me gustaría saber como se puede ejecutar este script para que se ejecute cada X tiempo y como pasarle el parámetro en el cual decimos si importa productos o categorias
Soy bastante novato en esto como podrás observar
Gracias
admin says
Hola Juan,
lo ideal es con un CRON utilizando el cliente php de consola. Dicho así te sonará a chino pero si buscas por Internet encontrarás mucha información.
Suerte
Juan Muñoz says
Y la sentencia include_once ‘./tabs/AdminImport.php’; a que hace referencia? Es algún archivo que hay que añadir?
gonzalo says
Buenas me podría enviar alguien de como hacerlo para la 1.6, no tengo la carpeta admin sino BACKOFFICE y no se como llamar al fichero para que me exporte los datos me podrías ayudar alguno que lo haya elaborado en esa versión, o como llama al scripts
muchas gracias
Isabel says
Buenos días estoy usando prestashop 1.6.1.6 y no consigo hacerlo funcionar he copiado los dos csv a la carpeta import dentro de la de administrador y el fichero php en la propia del administrador, para ejecutarlo me logeo en la tienda y en url arriba añado la url del script de php añadiendo al final ?entity=0 ya que quiero importar las categorías, al darle o bien aparece la pantalla en blanco o bien me tira un http error 500; ¿alguien ha conseguido hacerlo funcionar con esta versión de prestashop? (también he probado los cambios de javi pero no funciona).
Un saludo
Rosa says
Yo lo he hecho fucionar, intentalo con sólo una categoría a ver si así te funciona, a mi me da el error 500 cuando he excedido el tiempo de proceso del servidor.
Juan says
Hola!
¿podrías echarme un cable?
Yo lo quiero usar para importar sólo imágenes, pero al cambiar a 1.6 no logro que funcione.
El script está bien colocado, así como el CSV y la ruta a las imgs la reconoce, accede a la BBDD, vamos, que funciona todo menos importar las imágenes.
¡Gracias a todos !
joan says
hola muy buenas
mi pregunta es….
si lo quisiera solo para actualizar el stock ???
podria quitar las demas categorias
es decir..
yo tengo una bbdd que se actualiza cada dia a mano, guardandola en la misma carpeta siempre pero solo unsando ID, Referencia, cantidad
seria posible?
Rosa says
Quieres actualizar el stock en el fichero de productos o en el de combinaciones?
Desde prestashop 1.6.0.11(no se en que versión empezó a poder hacerse) se seguro que se puede hacer con las combinaciones, imagino que con productos no debería haber problema.
joan says
yo desde el mismo back lo actualizo con un csv `por combinaciones
ya que cada combinacion tiene su referencia
Rosa says
Pues entonces sin problema
joan says
ya pero la idea es programar un script que se automatice y me coja cada X horas/dias un csv que modifico a diario y me lo actualice en la web
Rosa says
Eso se hace via cron tasks, el script es el mismo, solo cambia la forma en que lo lanzas.
vero says
Buenos días,
me gustaría saber de donde se sacan los números que va en cada nombre
while (($data = fgetcsv($handle, 0, “;”)) !== FALSE) {
if ($fila > 1) {
$referencia = $data[12];
$nombre = $data[2];
$descripcion = $data[30];
$des_corta = $data[29];
$precio_compra = number_format((float)str_replace(‘,’, ‘.’, $data[(6)]), 2, ‘.’, ”);
$precio_venta = $precio_compra * 1.15;
$stock = $data[23];
$imagenes = explode(“,”, $data[43]);
$categorias = explode(“,”, $data[3]);
$url_rew = $data[35];
$ean13 = $data[16];
$width = $data[19];
$height = $data[20];
$depth = $data[21];
$weight = $data[22];
$attribute = $data[22];
Mercedes Navarro says
Hola,
y si lo que quiero subir son los fabricantes y asignarlos a los articulos?
gracias
Rosa says
Te refieres a que tienes los productos creados sin fabricante o con un fabricante ficticio? Para eso tienes que buscar un script para editar los productos, este script es para crearlos a partir de un CSV.
Ana says
Hola, el scritp me funcionó perfectamente, pero alguien sabe como hacer si lo que quiero es borrar productos?
Alex says
Estoy intentando hacerlo funcionar en mi prestashop 1.6.1.23 pero me está dando fallo en primer lugar con el AdminImport.php y luego con el AdminTab.php ( en el que me dice ARRAY_KEY_EXISTS )
¿Alguien podría ayudarme?
vigoncas says
Hola Álex,
por favor, pega los errores para tener más info
Andrea says
Hola,
Me gustaría saber cómo se puede forzar el id de una dirección al insertarla desde el API?
Podemos insertar nuevas pero no nos permite ponerles el id predeterminado, nos inserta el siguiente de la secuencia de BBDD.
Muchas Gracias
Alejandro says
Alguien puede facilitar el codigo para poder ver los errores de la importación?? No consigo importar mi csv, el script no me responde 500 – Internal server error, pero sigue sin importar los productos, lo único que me queda es poder ver los errores ‘errors’ y ‘warnings’ para saber que es lo que está fallando.
Alex says
Hola,
Estoy haciendo un script para importar productos a mi prestashop 1.7, el problema que tengo es que tengo un csv de 40Mb y tarda muchisimo. ¿cómo podría hacer para que se importe mucho más rápido?
Gracias
Cardo says
Divide el fichero en otros más pequeños y haz la importación por tandas
Ivan says
Buenas tardes!
Tengo prestashop 1.7.6.5 y tengo un programa que me genera el csv con los productos ya sean nuevos o modificados para poder subirlos a prestashop.
Quería saber el funcionamiento de este sript. Cuando sería aplicado? es automatico?
vigoncas says
Hola, el script solo soporta Prestashop 1.5 y 1.6.
Alex says
Hola a todos, Agradezco vuestras aportaciones. Soy nuevo en Prestashop y necesitaría saber como ejecutar el Script. He ubicado en el directorio /admin/importel fichero .CSV y el fichero del script en formato php en el directorio /admin. Gracias y un saludo.