Hace unos días tuve que hacer un script para la importación masiva de productos a la base de datos de prestashop mediante la lectura de archivos .csv. Este código que presento, aunque funciona, no está terminado, faltan por hacer alguna validación más y una clase para convertir el archivo .csv al formato que quiere prestashop.
Me dieron un archivo .csv con separador por comas ”,” y separador de multiples valores por punto y coma “;” y a pesar de que se puede definir cuál es cual, al ejecutar el código prestashop no tenia en cuenta que le estaba diciendo que el separador era la coma “,” y separaba por el punto y coma “;” por lo que tenia dos camino, uno era modificar la clase adminImportController() y agregar un parámetro mas al método para que aceptara el punto y coma como separador principal, cosa que podría afectar a una futura actualización de prestashop por lo que me decidí a leer el fichero .csv usando la función de php fgetcsv y sustituir los separadores y adaptar el .csv al formato preferido por prestashop.
<?php header("Content-Type: text/html;charset=utf-8"); define('_PS_ADMIN_DIR_', getcwd()); include_once(_PS_ADMIN_DIR_ . '/../config/config.inc.php'); $context = Context::getContext(); $employee = new Employee(1); $context->employee = $employee; /* *leo el csv para cambiar el ";" por la "," y viceversa (al volverlo a montar) para no tener problemas con la importación * si no, tuve que modificar el codigo interno de prestashop en concreto * la clase adminImportController() para que funcionase. a demas de cambiar el * valor del IVA a su id_iva, no se me ocurre ahora otra manera. */ $fp = fopen('import/products_final.csv', 'w'); if (($gestor = fopen("import/products.csv", "r")) !== FALSE) { while (($datos = fgetcsv($gestor, 1000, ",")) !== FALSE) { $datos2 = preg_replace('/;/', ',', $datos);//cambio a formato de separadores de prestashop por defecto if($datos2[5] == 21) $datos2[5] = 1; //cambio valor por id_iva if($datos2[5] == 10) $datos2[5] = 2; if($datos2[5] == 4) $datos2[5] = 3; fputcsv($fp, $datos2, ';', chr(0)); } fclose($gestor); fclose($fp); } function loadProductsPost() { $_POST = array ( 'tab' => 'AdminImport', 'forceIDs' => '0', 'skip' => '1', 'csv' => 'products_final.csv', 'entity' => '1', 'separator' => ';', 'multiple_value_separator' => ',', 'iso_lang' => 'es', 'convert' => '', 'import' => 'Importar datos csv', 'type_value' => array( 0 => 'name', 1 => 'reference', 2 => 'ean13', 3 => 'price_tex', 4 => 'Wholesale_price', 5 => 'id_tax_rules_group', 6 => 'quantity', 7 => 'category', 8 => 'manufacturer', ), ); } $import = New AdminImportControllerCore(); loadProductsPost(); echo ($import->productImport()) ? 'Productos importados a la BBDD con éxito' : 'Falló la importación de productos a la BBDD';
Espero que os sirva, funciona perfectamete en la versión 1.7 de prestashop.
Saludos!!