Jump to content

Actualizar stock mediante php en 1.6.0.11


Javier1959

Recommended Posts

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

  • 3 weeks later...
  • 2 months later...

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

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

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

  • 9 months later...
  • 11 months later...

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...