Icono del sitio Daniel Ruiz

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

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!

Salir de la versión móvil