Prestashop: Web service: aprende a crear una nueva función

Hoy vamos a aprender a añadir una nueva función a los servicios web de Prestashop. Es bastante simple, pero hay que hacerlo bien. Vamos por ejemplo a crear una nueva url que ejecute un código y devuelva una respuesta.

Por ejemplo vamos a crear la url que devuelva el número de imágenes que tiene actualmente un id de producto pasado por parámetro (ejemplo sencillo y que tal vez esto no sea de utilidad pero es un comienzo para hacer cosas muy chulas con tu tienda, y para hacer integraciones importantes con sistemas ERP u otros).

Web service

Lo primero nuestra url sería por ejemplo:

[sourcecode language=»plain»]http://url_tienda/api/drapps/{id_product}[/sourcecode]

 

NOTA: Si lo que queremos es crear una serie de funciones bajo nuestra clase drapps, la implementación de la clase sería de otra forma. Si os gusta este artículo puedo explicar cómo se hace un servicio web de Prestashop avanzado para por ejemplo hacer funcionales los recursos del estilo:

[sourcecode language=»plain»]
http://url_tienda/api/drapps/funcion1/{parametros}
http://url_tienda/api/drapps/funcion2/{parametros}
[/sourcecode]

 

Seguimos.

Lo primero crear un override en la carpeta /override/classes/webservice llamado WebserviceRequest.php. Crearemos un overload de la función getResources para añadir nuestra función.


class WebserviceRequest extends WebserviceRequestCore
{
  public static function getResources()
  {
    $resources = parent::getResources();
    $resources['drapps'] = array('description' => 'The Product image number','class' => 'drapps');
    return $resources;
  }
}

Esto último escribirá una línea nueva en la tabla de recursos en el backend (Parámetros avanzados -> webservice).

screensavescreensavescreenshot-dev.valdizarbe.es 2016-07-16 13-37-19

Ahí podremos gestionar los permisos por clave de servicio web.

NOTA: si no aparece esta línea en dicha página del backend, probar a eliminar el fichero class_index.php de la carpeta cache para que se actualicen los overrides.

A continuación crearemos nuestra clase drapps. También en /override/classes

class drapps extends ObjectModel
{
  /** @var int numberImages */
  public $numberImages;
  public static $definition = array(
    'table' => 'drapps',
    'primary' => 'id',
    'fields' => array(
        'numberImages' => array('type' => self::TYPE_INT)
    )
  );
  protected $webserviceParameters = array(
    'objectNodeNames' => 'drapps',
    'fields' => array(
        'numberImages' => array(
            'getter' => 'getNumberOfImages'
        )
    )
  );
  public function __construct($params = null)
  {
    parent::__construct();

    if(isset($params) && strlen($params) > 0){
        $this->id = $params;
    }
  }
  public function getNumberOfImages()
  {
    $product = new Product($this->id);
    $id_lang = Context::getContext()->language->id;
    $images = $product->getImages($id_lang);

    return count($images);
  }

}

Al ejecutar este recurso de la API ya nos devolverá la respuesta que deseamos xD: por ejemplo para /api/drapps/2

<prestashop xmlns:xlinkhttp://www.w3.org/1999/xlink«>
  <drapps>
    <id>
      <![CDATA[ 2 ]]>
    </id>
    <numberImages notFilterabletrue«>
       <![CDATA[ 5 ]]>
     </numberImages>
  </drapps>
</prestashop>

Para mi producto con id número dos actualmente tengo 5 imágenes.

 

¿os ha gustado?

Dejar comentarios si tenéis alguna duda

 

Un saludo!

13 comentarios

  1. Daniel,

    necesito obtener la referencia de un producto apartir de su Product_Id. Es posible desde la API?

    Un saludo!!!!

    1. Hola!

      Gracias por pasarte!

      Claro que es posible… Crea un nuevo objeto producto con su id de producto y obten el parametro reference. O si no, haz una consulta simple a la base de datos. O haz una función «overradeando» la clase Producto creando una función que dado un id te devuelva su reference.

      Y por último la devuelves en tu servicio web.

      Gracias!

      1. Daniel,

        gracias por su respuesta tan rápida. El problema es que la referencia la tienen las combinaciones ya que en dependencia de la combinación del producto es una referencia distinta.Estoy obteniendo desde un ERP con la APi de prestashop un pedido y necesito enlazar el producto del ERP con el de Presta y creo que la mejor manera es apartir de la referencia que es la misma en ambas plataforma.

        De esta manera obtengo la referencia genérica. Alguna idea ????

        Un millon de gracias!!!

        1. Hola!

          no es complejo. Habría que hacer una consulta para obtener la referencia del producto. Pero no es muy buena práctica, Prestashop tienes sus campos y es mejor usarlos… cuando insertes el producto, rellena el campo de referencia.

          Si quieres podemos verlo en privado.

          Un saludo y gracias por pasarte!

  2. Buenos días,

    ¿Cómo quedaría la estructura de directorios y ficheros?.

    Un saludo y gracias.

    1. Hola Miguel Ángel!

      Actualmente estoy escribiendo un nuevo post avanzando las ideas y dudas que me habéis planteado algunos… voy a indicar también en esa entrada cómo queda la estructura de ficheros ¿te parece?

      Gracias!

Los comentarios están cerrados.