Javier1959 Posted January 23, 2015 Share Posted January 23, 2015 Hola: He encontrado este script para actualizar los stocks y teóricamente sirve para todas las versiones igual o superiores a 1.6. ---------------------------------------------------------------------------------------------------------- <?php // PRESTASHOP SETTINGS FILE require_once ('config/settings.inc.php'); // REMOTE CSV FILE (CUSTOMIZE YOURCSVFILEPATH, CAN BE AN URL OR A LOCAL PATH) $remote_csv_file = 'YOURCSVFILEPATH.csv'; // DB CONNECTION (CUSTOMIZE YOURDBHOSTNAME AND YOURDBPORT) $db = new PDO("mysql:host=YOURDBHOSTNAME;port=YOURDBPORT;dbname="._DB_NAME_."", _DB_USER_, _DB_PASSWD_); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // MAIN CYCLE $row_num = 0; if (($handle = fopen($remote_csv_file, "r")) !== false) { while (($data = fgetcsv($handle, 1000, ",")) !== false) { $row_num++; if ($row_num == 1) { // SKIP FIRST LINE (HEADER) continue; } if ($data[0] == '' || !is_numeric($data[1])) { // SKIP EMPTY VALUES continue; } // INPUT SANITIZATION $reference = trim($data[0]); $quantity = ($data[1] >= 0) ? $data[1] : 0; try { $res4 = $db->prepare("SELECT id_product, id_product_attribute from "._DB_PREFIX_."product_attribute WHERE reference = :reference"); $res4->execute(array(':reference'=>$reference)); if ($res4->rowCount() > 0) { // IT'S A PRODUCT COMBINATION $row4 = $res4->fetch(); $res = $db->prepare("update "._DB_PREFIX_."stock_available set quantity = :q where id_product_attribute = :id_product_attribute"); $res->execute(array(':q'=>$quantity, ':id_product_attribute'=>$row4['id_product_attribute'])); $res = $db->prepare("update "._DB_PREFIX_."product_attribute set quantity = :q where id_product_attribute = :id_product_attribute"); $res->execute(array(':q'=>$quantity, ':id_product_attribute'=>$row4['id_product_attribute'])); $res = $db->prepare("update "._DB_PREFIX_."stock_available set quantity = quantity + :q where id_product = :id_product and id_product_attribute = 0"); $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product'])); $res = $db->prepare("update "._DB_PREFIX_."product set quantity = quantity + :q where id_product = :id_product"); $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product'])); } else { // IT'S A SIMPLE PRODUCT $res4 = $db->prepare("SELECT id_product from "._DB_PREFIX_."product WHERE reference = :reference"); $res4->execute(array(':reference'=>$reference)); if ($res4->rowCount() > 0) { $row4 = $res4->fetch(); $res = $db->prepare("update "._DB_PREFIX_."stock_available set quantity = :q where id_product = :id_product and id_product_attribute = 0"); $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product'])); $res = $db->prepare("update "._DB_PREFIX_."product set quantity = :q where id_product = :id_product"); $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product'])); } } } catch (PDOException $e) { echo 'Sql Error: '. $e->getMessage() .'<br /><br />'; } } fclose($handle); } ---------------------------------------------------------------------------------------------------------------- El enlace a blog del autor es : http://www.whiletrue.it/update-prestashop-product-quantities-csv-file/ No se si alguien lo habrá probado y si funciona correctamente. Yo necesito que lea el CSV de mi proveedor que tiene unas 7000 referencias y actualice el stock de unas 3000 que tengo en la base de datos, descartando el resto, y que no toque las referencias de otros proveedores distintos que hay en la base de datos. A priori creo que me podría servir, aunque no utilizo las combinaciones (¿quizás habría que comentar o eliminar las líneas que actualizan las combinaciones?) Como estoy muy pez en PHP, si alguien puede revisarlo y orientarme se lo agradecería mucho. Un saludo y gracias por adelantado. Link to comment Share on other sites More sharing options...
fjberro Posted January 26, 2015 Share Posted January 26, 2015 Lo acabo de probar y funciona!! Link to comment Share on other sites More sharing options...
Javier1959 Posted January 26, 2015 Author Share Posted January 26, 2015 ¿Hola fjberro, lo has aplicado tal cual o has hecho alguna modificación? ¿El CSV lo tienes separado con "," o con ";"? Saludos. Link to comment Share on other sites More sharing options...
fjberro Posted January 26, 2015 Share Posted January 26, 2015 Solo he puesto mi archivo csv en donde pone YOURCSVFILEPATH.csv, mi base de datos en YOURDBHOSTNAME y el puerto en YOURDBPORT. En el csv tengo los campos separados por coma. Si necesitas cambiar el separador puedes hacerlo cambiando la línea while (($data = fgetcsv($handle, 1000, ",")) !== false) { por while (($data = fgetcsv($handle, 1000, "SEPARADOR")) !== false) { Link to comment Share on other sites More sharing options...
Javier1959 Posted January 26, 2015 Author Share Posted January 26, 2015 Muchas gracias por tu respuesta, voy a probarlo hoy. Saludos Link to comment Share on other sites More sharing options...
Javier1959 Posted January 26, 2015 Author Share Posted January 26, 2015 He seguido tus indicaciones y va perfecto. Muchas gracias por tu ayuda fjberro. Saludos. Link to comment Share on other sites More sharing options...
fjberro Posted January 26, 2015 Share Posted January 26, 2015 De nada, para eso estamos Link to comment Share on other sites More sharing options...
Recommended Posts