Script para la importación masiva de productos a PrestaShop mediante archivos .csv

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