Javier1959 Posted January 23, 2015 Share Posted January 23, 2015 Hola: Estoy intentando usar un script para actualizar el stock sólo de productos (sin combinaciones), y he encontrado este script: <?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); } Según dice es para versiones 1.6 y posteriores. Como estoy muy pez en PHP, ¿alguien lo ha probado? El enlace al blog del desarrollador es http://www.whiletrue.it/update-prestashop-product-quantities-csv-file/ El CSV que me facilita el proveedor contiene unas 7000 referencias, de las cuales sólo me interesan unas 3000, es decir el script tiene que leer si la referencia del CSV está en la base de datos de la tienda, y si está actualizar el stock, en caso contrario descartarla. Entiendo que este script cumple lo que necesito y que a lo sumo habría que eliminar las referencias a los atributos. ¿Alguien que se maneje bien en PHP podría revisarlo y aconsejarme antes de que haga alguna metedura de pata? Un saludo y gracias por anticipado a todos. Link to comment Share on other sites More sharing options...
Guille Ontivero Posted February 11, 2015 Share Posted February 11, 2015 Hola. Yo lo acabo de probar y va de lujo. Link to comment Share on other sites More sharing options...
AlbertoEpic Posted April 22, 2015 Share Posted April 22, 2015 Hola Guille, podrías explicar un poco más cómo lo has hecho funcionar? Estoy probando yo y no consigo resultados... Sospecho que se debe a un error 500. Estoy con Prestashop 1.6.0.9 Muchas gracias!!! Link to comment Share on other sites More sharing options...
Guille Ontivero Posted April 23, 2015 Share Posted April 23, 2015 Hola AlbertoEpic Donde pone 'YOURCSVFILEPATH.csv' e puesto el nombre de mi archivo csv y donde pone "mysql:host=YOURDBHOSTNAME;port=YOURDBPORT;dbname=" e puesto el nombre de mi base de datos y el puerto. Subo el archivo php y el csv al servidor y desde chrome accedo al php como si fuera una pagina web normal y solo se actualiza el stock. Link to comment Share on other sites More sharing options...
AlbertoEpic Posted April 24, 2015 Share Posted April 24, 2015 Pues algo se me escapa... Creo que lo hago todo correctamente, pero no hay forma. Otra cosa, en la línea 16: // 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) { el valor "1000" corresponde al nº máximo de productos que puede haber en el csv, no? Yo tengo casi 3000. ¿Podría aumentarlo a 3000? Gracias!!! Link to comment Share on other sites More sharing options...
Guille Ontivero Posted April 26, 2015 Share Posted April 26, 2015 No lo se. eso no lo e variado y yo tengo 1800 referencias. En la linea 16 ";" es el separador de casillas del csv. Yo lo e cambiado por "|" porque mi proveedor me lo manda asi. Alomejor es eso lo que te falla. Link to comment Share on other sites More sharing options...
AlbertoEpic Posted April 28, 2015 Share Posted April 28, 2015 Uy, estaba muy equivocado... Sólo hay que consultar la documentación y buscar "fgetcsv()", allí lo explica. Nada, me sigue sin funcionar... :-( ¿Seguro que en mysql:host=YOURDBHOSTNAME; sustituyes YOURDBHOSTNAME por el nombre de la base de datos? Gracias! Link to comment Share on other sites More sharing options...
Guille Ontivero Posted April 28, 2015 Share Posted April 28, 2015 Hola. Si, donde pone YOURDBHOSTNAME yo le pongo el nombre de la base de datos. Link to comment Share on other sites More sharing options...
kaixodude Posted April 30, 2015 Share Posted April 30, 2015 No me funciona, tengo la versión 1.6.0.9 Link to comment Share on other sites More sharing options...
deltahel Posted February 26, 2016 Share Posted February 26, 2016 Hola! Por sí a alguien le sirve, mysql:host=YOURDBHOSTNAME; hace referencia a la propiedad "host" es decir identidad del hosting. (localhost, xx.xxx.xxx.xx, ejemplo.com) Link to comment Share on other sites More sharing options...
pepote1991 Posted February 20, 2017 Share Posted February 20, 2017 Hola, ¿alguien sabe si este script funciona con productos con combinaciones? Necesito actualizar mi stock pero por combinaciones, y si alguien puede indicarme que estructura debe tener el excel. Gracias de antemano. Link to comment Share on other sites More sharing options...
pepote1991 Posted February 20, 2017 Share Posted February 20, 2017 Hola AlbertoEpic Donde pone 'YOURCSVFILEPATH.csv' e puesto el nombre de mi archivo csv y donde pone "mysql:host=YOURDBHOSTNAME;port=YOURDBPORT;dbname=" e puesto el nombre de mi base de datos y el puerto. Subo el archivo php y el csv al servidor y desde chrome accedo al php como si fuera una pagina web normal y solo se actualiza el stock. ¿Que puerto es el que hay que indicar? Otra duda, si el producto tiene combinaciones, como indico en cada línea a que combinación corrsponde el stock? Muchas gracias de antemano. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now