Jump to content

Error al intentar listar los productos de tienda Prestashop con Webservice


Recommended Posts

Estoy teniendo problemas en intentar listar los productos de una tienda prestashop con Webservice. Cuando intento listar todos los productos me da este error:

Fatal error: Uncaught exception 'PrestaShopWebserviceException' with message 'This call to PrestaShop Web Services failed and returned an HTTP status of 404. That means: Not Found.' in C:\xampp\htdocs\AppClient\PSWebServiceLibrary.php:85 Stack trace: #0 C:\xampp\htdocs\AppClient\PSWebServiceLibrary.php(269): PrestaShopWebservice->checkStatusCode(404) #1 C:\xampp\htdocs\AppClient\R-Products.php(215): PrestaShopWebservice->get(Array) #2 {main} thrown in C:\xampp\htdocs\AppClient\PSWebServiceLibrary.php on line 85
Alguna idea de cual puede ser el problema?
Muchas Gracias!!

Link to comment
Share on other sites

On 12/6/2018 at 11:47 AM, Alex Sanchez said:

Hola,

 

A simple vista parece, que tu código no está bien creado.

Si nos los puedes copiar a lo mejor entre todos podemos ayudarte.

 

Un saludo

 

Hola Alex. A ver, la cuestión es que he probado con a realizar la conexión con un prestashop version 1.6.4.1 y funciona perfectamente, puedo listar los productos en una tabla. Pero si pruebo con una version superior no me funciona. ¿Tendrias idea de que puede ser?

Te adjunto el codigo. Muchas gracias!
Saludos!!

<?php

function conectar(){


    //*******SERVIDOR*******//
    $dsn = 'localhost';
    $usuario = 'root';
    $password = '';
    $database= 'prestashop';

    $mysqli = new mysqli($dsn, $usuario,$password, $database);
    $mysqli->set_charset("utf8");
    if ($mysqli -> connect_errno) {
        die( "Fallo la conexión a MySQL: (" . $mysqli -> mysqli_connect_errno()
            . ") " . $mysqli -> mysqli_connect_error());
    }
    else{
        /*echo "Conexión exitosa!";*/
        return $mysqli;
    }

}

function get_productos(){

    $mysqli = conectar();

$sql = "SELECT a.`id_product`, b.`name` AS `name`, `reference`, a.`price` AS `price`, sa.`active` AS `active` , shop.`name` AS `shopname`, a.`id_shop_default`, image_shop.`id_image` AS `id_image`, cl.`name` AS `name_category`, sa.`price`, 0 AS `price_final`, a.`is_virtual`, pd.`nb_downloadable`, sav.`quantity` AS `sav_quantity`, sa.`active`, IF(sav.`quantity`<=0, 1, 0) AS `badge_danger` FROM `ps_product` a LEFT JOIN `ps_product_lang` b ON (b.`id_product` = a.`id_product` AND b.`id_lang` = 1 AND b.`id_shop` = 1) LEFT JOIN `ps_stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0 AND sav.id_shop = 1 AND sav.id_shop_group = 0 ) JOIN `ps_product_shop` sa ON (a.`id_product` = sa.`id_product` AND sa.id_shop = a.id_shop_default) LEFT JOIN `ps_category_lang` cl ON (sa.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = a.id_shop_default) LEFT JOIN `ps_shop` shop ON (shop.id_shop = a.id_shop_default) LEFT JOIN `ps_image_shop` image_shop ON (image_shop.`id_product` = a.`id_product` AND image_shop.`cover` = 1 AND image_shop.id_shop = a.id_shop_default) LEFT JOIN `ps_image` i ON (i.`id_image` = image_shop.`id_image`) LEFT JOIN `ps_product_download` pd ON (pd.`id_product` = a.`id_product`) WHERE 1 ORDER BY a.`id_product` ASC LIMIT 0, 50";

    $result = mysqli_query($mysqli, $sql);

    return $result;

}

function get_link($id){

    $mysqli = conectar();

    $sql = "SELECT * FROM ps_product_lang WHERE id_product = $id AND id_lang = $id ";

    $result = mysqli_query($mysqli, $sql);

    /* array asociativo */
    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);

    return $row;
}




?>



<table  align="center"   cellpadding="0" cellspacing="0"  >

    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Precio</th>
        <th>Categoria</th>
        <th>IMAGEN</th>
    </tr>
    <?php


    $productos = get_productos();



    if ($productos){
        echo "<tr valign='top'><td colspan=\"\"></td></tr>";
        $i = 1;
       while ($row = mysqli_fetch_array($productos, MYSQLI_ASSOC)) {

           print_r($row);

           echo "<tr>";
           echo "<td>".$row['id_product']."</td>";
           echo "<td>".$row['name']."</td>";
           echo "<td>".$row['price']."</td>";
           echo "<td>".$row['name_category']."</td>";

           $link = get_link($row['id_product']);

           echo "<td><img width='50px' src='http://localhost/prestashop/img/p/".$row['id_product']."/".$row['id_product'].".jpg'></td>";

           echo "<td><a href='http://localhost/prestashop/es/camisetas/".$row['id_product']."-".$link['link_rewrite'].".html'>Ver productos</a></td>";

           echo "</tr>";


        }
    }
    else
    {
        echo "  ";
    }
    ?>

</table>



Edited by alejandro999 (see edit history)
Link to comment
Share on other sites

hace 2 horas, alejandro999 dijo:

Buenos dias gusman126, podrias indicarme como usar las clases que me comentas. Gracias!

 

Por ejemplo para leer todos los productos

      $productos = Product::getProducts($id_lang, 0, 0, 'id_product', 'ASC', false, true);

Luego si quieres trabajar con los datos de 1 producto en concreto

foreach ($productos as $producto){
            $id_product = (int)$producto['id_product'];
            $pro = new Product( $id_product);

................
        }

 

aqui el listado completo de classes de la version PS 1.6

https://gmartos.es/indice-de-classes-y-metodos-de-prestashop/

 

Edited by gusman126 (see edit history)
Link to comment
Share on other sites

On 18/6/2018 at 9:43 AM, gusman126 said:

 

Por ejemplo para leer todos los productos

      $productos = Product::getProducts($id_lang, 0, 0, 'id_product', 'ASC', false, true);

Luego si quieres trabajar con los datos de 1 producto en concreto

foreach ($productos as $producto){
            $id_product = (int)$producto['id_product'];
            $pro = new Product( $id_product);

................
        }

 

aqui el listado completo de classes de la version PS 1.6

https://gmartos.es/indice-de-classes-y-metodos-de-prestashop/

 

Buenos días!! Muchas gracias por el aporte. Pero me surje una duda. ¿Como puedo utilizar las clases desde fuera del prestashop? El problema es que necesito listar productos por categoría en otra web realizada en Wordpress.

Saludos. Gracias!!!!

Link to comment
Share on other sites

hace 6 horas, alejandro999 dijo:

Buenos días!! Muchas gracias por el aporte. Pero me surje una duda. ¿Como puedo utilizar las clases desde fuera del prestashop? El problema es que necesito listar productos por categoría en otra web realizada en Wordpress.

Saludos. Gracias!!!!

 

mismo servidor  o servidor diferente?

si usas el mismo servidor , añade la ruta completa de los ficheros init.php y config/config.php de Prestashop.

Si usas un servidor diferente, SI debes usar webservice, 

 

El codigo que pones en la captura al estar añadiendo el codigo para leer en la base de datos hizo que yo pensara que estaba el codigo que tu hacias en el mismo servidor,

Link to comment
Share on other sites

14 hours ago, gusman126 said:

 

mismo servidor  o servidor diferente?

si usas el mismo servidor , añade la ruta completa de los ficheros init.php y config/config.php de Prestashop.

Si usas un servidor diferente, SI debes usar webservice, 

 

El codigo que pones en la captura al estar añadiendo el codigo para leer en la base de datos hizo que yo pensara que estaba el codigo que tu hacias en el mismo servidor,

 

Es en un servidor diferente. Tendré que seguir probando con Webservice.  Muchas gracias por tu ayuda igualmente. Saludos! 

Link to comment
Share on other sites

hace 1 hora, alejandro999 dijo:

 

Es en un servidor diferente. Tendré que seguir probando con Webservice.  Muchas gracias por tu ayuda igualmente. Saludos! 

 

Ok, el codigo que has puesto no es correcto para pedir información por webservice a un prestashop.

Yo uso este

$api = 'TU API';
$url = 'URL de prestashop';

$orden ='products?filter[active]=[1]&sort=[id_DESC]';
$datos = self::getdata($api,$url,$orden);



 public function getdata($api,$url,$orden){
        //Orden general para recuperar la infor de WS
      try
        {
            $webService = new PrestaShopWebservice($url, $api,false);
            
            // Here we set the option array for the Webservice : we want customers resources
            $opt['resource'] = (string)$orden;
            
            // Call
            $xml = $webService->get($opt);
            // Here we get the elements from children of customers markup "customer"
            
        }
        catch (PrestaShopWebserviceException $e)
        {
            // Here we are dealing with errors
            $trace = $e->getTrace();
            if ($trace[0]['args'][0] == 404) ;
            
            else if ($trace[0]['args'][0] == 401) ;
            else ;
            echo $e;
            echo $trace;
        }  
        return $xml;
        
    }

 

Link to comment
Share on other sites

1 hour ago, gusman126 said:

 

Ok, el codigo que has puesto no es correcto para pedir información por webservice a un prestashop.

Yo uso este


$api = 'TU API';
$url = 'URL de prestashop';

$orden ='products?filter[active]=[1]&sort=[id_DESC]';
$datos = self::getdata($api,$url,$orden);



 public function getdata($api,$url,$orden){
        //Orden general para recuperar la infor de WS
      try
        {
            $webService = new PrestaShopWebservice($url, $api,false);
            
            // Here we set the option array for the Webservice : we want customers resources
            $opt['resource'] = (string)$orden;
            
            // Call
            $xml = $webService->get($opt);
            // Here we get the elements from children of customers markup "customer"
            
        }
        catch (PrestaShopWebserviceException $e)
        {
            // Here we are dealing with errors
            $trace = $e->getTrace();
            if ($trace[0]['args'][0] == 404) ;
            
            else if ($trace[0]['args'][0] == 401) ;
            else ;
            echo $e;
            echo $trace;
        }  
        return $xml;
        
    }

 

Perfecto!!!!He utilizado tu código y obtengo la respuesta de los productos. 
"object(SimpleXMLElement)#5 (1) { ["product"]=> array(622) { [0]=> object(SimpleXMLElement)#1 (1) { ["@attributes"]=> array(1) { ["id"]=> string(3) "785" } }"

¿Como podría acceder a los atributos del productos como por ejemplo nombre, precio etc...?

Me gustaría poder listar en una tabla los productos con precio y nombre del producto. 

MUCHISIMAS GRACIAS!!!

Link to comment
Share on other sites

hace 2 horas, alejandro999 dijo:

Perfecto!!!!He utilizado tu código y obtengo la respuesta de los productos. 
"object(SimpleXMLElement)#5 (1) { ["product"]=> array(622) { [0]=> object(SimpleXMLElement)#1 (1) { ["@attributes"]=> array(1) { ["id"]=> string(3) "785" } }"

¿Como podría acceder a los atributos del productos como por ejemplo nombre, precio etc...?

Me gustaría poder listar en una tabla los productos con precio y nombre del producto. 

MUCHISIMAS GRACIAS!!!

 

Lo primero : Siento que sea tan limitado y que ponga tan poca información, pero es una de las cosas que mas me ha costado aprender, el uso del webservice de prestashop y me niego a explicar con todo detalle y dar gratis algo que realmente me ha costado semanas saber bien como funciona y algo que los de prestashop deberian tener y poner publicos unos tutoriales o ayudas mas claros y gratuitos que para eso lo tienen como un negocio como algunos de nosotros.

El foro esta para ayudar y ayudare todo lo posible, pero no hare tutoriales o cursos sin tener un beneficio por el tiempo invertido

 

Ver datos de producto

$orden = 'products/'.$id_product;
$datosp = self::getdata($api,$url,$orden);

añades los atributos, imagenes etc.... a un array

foreach ($datosp as $producto){

$productos[] = array (
                                'id' =>  (int)$id_product,
                                'reference' => (string)$reference,
                                'name' => (string)$producto->name->language[0],
                                'refprov' => $producto->reference,
                                'ean13' => $producto->ean13,
                                'pvp' => $producto->price,
                                'stock' => $producto->quantity[0],
                                'combinations' => $producto->associations->combinations,
                                'images' => $producto->associations->images,
                                'cover' => $producto->id_default_image,
                                'features' => $featuresp,
                                'active' => $producto->active,
                            );

}

lees la caracteristica

foreach($featuresp as $featur){
               
                $idv = $featur['id_feature_value'];
                $orden = 'product_feature_values'.'/'.$idv;
                $datosa = self::getdata($api,$url,$orden);

}

lees los datos y valores de la caracteristica

foreach ($datosa as $valuesn){

$idfe = $valuesn->id_feature;
$orden = 'product_features'.'/'.$idfe;
$datosa = self::getdata($api,$url,$orden);

}

Combinaciones

$orden = 'combinations'.'/'.$idc;
                $datosc = self::getdata($api,$url,$orden);

Valor de esas combinaciones

$orden = 'product_option_values'.'/'.$id_product_attribute;
                    $datosov = self::getdata($api,$url,$orden);

y asi vas leyendo todos los datos de un producto. imagenes , 

 

foreach($productosfin['images'] as $img){

$imgor = $img['id'];

$url = 'https://'.$api.'@'.$domain.'/api/images/products/'.$productosfin['id_original'].'/'.$imgor;

}

Edited by gusman126 (see edit history)
Link to comment
Share on other sites

  • 1 year later...
On 6/20/2018 at 3:27 AM, gusman126 said:

Hola a todos. Chicos estoy muy nueva en esto del consumo de webservices desde prestashop, tengo una tienda en la que necesito listar los productos en una tabla desde un webservice, la pregunta es. Para iniciar, es necesario crear un modulo nuevo para esto? En caso de que no. En cual archivo de php puedo colocar la llamada al webservice para mostrar luego esta tabla, considerando que la tabla donde pretendo mostrar los productos esta en una pagina estática que creo en page.tpl. Les agradezco su ayuda. Estoy con la version 1.7 y utilizo el theme classic

Ok, el codigo que has puesto no es correcto para pedir información por webservice a un prestashop.

Yo uso este


$api = 'TU API';
$url = 'URL de prestashop';

$orden ='products?filter[active]=[1]&sort=[id_DESC]';
$datos = self::getdata($api,$url,$orden);



 public function getdata($api,$url,$orden){
        //Orden general para recuperar la infor de WS
      try
        {
            $webService = new PrestaShopWebservice($url, $api,false);
            
            // Here we set the option array for the Webservice : we want customers resources
            $opt['resource'] = (string)$orden;
            
            // Call
            $xml = $webService->get($opt);
            // Here we get the elements from children of customers markup "customer"
            
        }
        catch (PrestaShopWebserviceException $e)
        {
            // Here we are dealing with errors
            $trace = $e->getTrace();
            if ($trace[0]['args'][0] == 404) ;
            
            else if ($trace[0]['args'][0] == 401) ;
            else ;
            echo $e;
            echo $trace;
        }  
        return $xml;
        
    }

 

 

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