
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!!