Juan Cots Posted May 14, 2015 Share Posted May 14, 2015 Si recibes los productos de tu proveedor a través de un csv, seguramente te habrás encontrado con las dificultades típicas para convertirlo al orden que prestashop necesita para poder aceptarlo. También es posible que las categoría de tu proveedor no coincidan con las tuyas. Pues bien podemos conseguir mediante programación, reescribir el csv de nuestro proveedor de tal forma que podamos subirlo inmediatamente a nuestro prestashop, además vamos a dar la opción de trocearlo para evitar los periodos largos de ejecución en el servidor. ¿Que necesitamos para este proyecto? 1.- Necesitamos conocimientos básicos de PHP 2.- Un servidor web, local o externo (no importa) Empezamos… Normalmente nuestro proveedor nos va a facilitar los datos por una de dos vías, URL (una dirección web de donde descargar los datos) o FTP (una dirección FTP con un usuario y un password) Vamos a ver las dos formas de recuperar ese archivo de forma automática para luego poder trabajar con él. 1.- Obtener el archivo de nuestro proveedor Caso 1.- El proveedor nos da una URL Creamos un nuevo archivo php en la carpeta que deseemos de nuestro servidor y escribimos el siguiente código, lo único que tienes cambiar es donde yo pongo: ‘aquí va la dirección de la url que nos han facilitado’. Debes poner la dirección que te ha facilitado tu proveedor <?php $fichero = file_get_contents(‘aquí va la dirección de la url que nos han facilitado’);// Abre el fichero para obtener el contenido existente$proveedor= “proveedor.csv”;// Escribe el contenido al ficherofile_put_contents($proveedor, $fichero);echo ‘Fichero recibido'; ?> Podemos probarlo para ver si funciona correctamente. Lo ejecutamos y en la misma carpeta desde donde lo ejecutamos debería aparecer el archivo proveedor.csv Si es así podríamos continuar… Caso 2.- El proveedor nos da un FTP En este caso necesitamos saber 4 cosas 1.- La dirección FTP del servidor 2.- Como se llama el archivo en el servidor ftp 3.- Nuestro Usuario 4.- Nuestro Password Todos esos datos deberemos cambiarlos en el código que pongo aquí <?php $local_file = ‘proveedor.csv';$server_file = “nombre archivo ftp en servidor“;$conn_id = ftp_connect(“direccion ftp que nos facilitan“);$login_result = ftp_login($conn_id, “usuario“, “password“);if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {echo “Se ha guardado satisfactoriamente $local_file\n<br>”;} else {echo “Ha habido un problema\n”;}ftp_close($conn_id); ?> Podemos probarlo para ver si funciona correctamente. Lo ejecutamos y en la misma carpeta desde donde lo ejecutamos debería aparecer el archivo proveedor.csv Si es así podríamos continuar… 2.- Reescribir el archivo Ahora lo que vamos a hacer es vía programación abrir el archivo proveedor.csv y reescribirlo en el orden que nosotros deseemos, cambiando precios y mapeando las categorías a nuestra medida Lo primero abrimos el archivo y lo recorremos $fp = fopen (“proveedor.csv”,”r”);//Establezco el contador a 0$contador=0;//Recorro linea a linea el archivowhile ($datos = fgetcsv ($fp, 100000, “;”, “‘”)) { Con estas líneas hemos abierto el archivo y vamos a recorrerlo, en el array datos encontraremos la información de cada línea de tal forma que dado que los arrays empiezan a contar desde el 0, en datos[0] tendríamos la información de la primera columna de nuestro proveedor, en datos[1] la de la segunda columna, en datos[2] la de la tercera y así sucesivamente. Supongamos que nuestro proveedor tiene la información de la referencia del producto en la primera columna, eso para nosotros sería en datos[0]. Vamo a crear un array donde iremos guardando todas las referencias. $referencia[] = datos[0]; El precio lo tiene en la columa 3 y vamos a subirlo un 30% y redondearlo, la descripción en la 5 y las imágenes en la 7 $precio[] = ceil($datos[2]/0.70); $descripcion[] = datos[4]; $imagenes[] = datos[6]; Ahora vamos a las categorías, nuestro proveedor las tiene en la columna 2 (para nosotros datos[1]) y para este ejemplo vamos a suponer que se trata de un proveedor de informatica y que donde el tiene puesto “Consumibles” para nosotros es “Desechables” y lo que para el es “Ordenadores” para nosotros es “Portatiles” y si no es ninguno de estos para nosotros es “Varios informatica”. Logicamente en cada elseif podemos poner todas las condiciones que necesitemos if($datos[1]==”Consumibles”) { $datos[1] = “Desechables”; }elseif($datos[1]==”Ordenadores”) { $datos[1] = “Portatiles”; } else { $datos[1] = “Varios informatica”;} $categoria[] = $datos[1]; Vamos a agregar por ejemplo el ean13 que el proveedor lo tiene en la columna 15 , el nombre del artículo que lo tiene en la 4 y el stock que está en la columna 19 $ean[] = $datos[14]; $nombre[] = $datos[3]; $cantidad[] = $datos[18]; Bueno supongamos que ya tenemos todos los campos que necesitamos, hago avanzar el contador y recorro todas las filas, al terminar cierro el fichero $contador++; }fclose($fp); Para pode trocear los archivos creo una variable llamada $numeroarchivos y divido el número total de registros por el numero máximo de productos que quiero en cada archivo. $numeroarchivos= ceil($contador/150); //la variable $x la voy a utilizar para incrementar el número del contador en cada pasada del for$x=0; //la variable $z irá desde 1 hasta el resultado de la división del total de productos entre 150, que será el número total de archivos creadosfor ($z = 1; $z <= $numeroarchivos; $z++) { //abro un fichero en modo escritura variando en cada pasada su nombre con la variable $z.$fp = fopen(‘prove’.$z.’.csv’, ‘w’); //pongo los títulos$titulo = array(“Referencia”,”Nombre”,”Precio”,”Categoria”,”Descripcion”,”Cantidad”,”Imagen”,”ean”,”Activo”);fputcsv($fp, $titulo, $delimiter = “;” ); //escribo 150 productos, el último campo, “Activo”, lo pongo fijo en 1, si no deseamos activar los productos lo pondríamos a cero. Podemos incluir los campos que estimemos necesarios, por ejemplo se puede añadir “Regla de impuestos o cualquier otro. Deben coincidir en orden las columnas de los títulos con los datos del array inferiorfor ($i = $x; $i <= $x+149; $i++) {$lista = array (array($referencia[$i],$nombre[$i],$precio[$i],$categoria[$i],$descripcion[$i],$cantidad[$i],$imagen[$i],$ean[$i],1));foreach ($lista as $campos) {fputcsv($fp, $campos, $delimiter = “;” );}}//cierro el archivofclose($fp);//incremento la $x$x=$x+150;} Y así tendría tantos archivos de 150 productos como fuera necesario llamados prove1.csv, prove2.csv…etc Si quieres obtener los ficheros de ejemplo completos puedes hacerlo desde aquí 1 Link to comment Share on other sites More sharing options...
Recommended Posts