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.
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
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!
Buen aporte! deberías publicarlo en el foro (si es que aún no lo haces)
Hola Víctor!
Gracias por pasarte!
¿a qué foro te estás refiriendo?
Un saludo!
Al Foro de Oficial de Prestashop.
https://www.prestashop.com/forums/forum/82-foro-en-espa%C3%B1ol/
—————————-
http://www.castrocontreras.com
Daniel
Cuando harás la 2da parte con funciones personalizadas?
Daniel,
necesito obtener la referencia de un producto apartir de su Product_Id. Es posible desde la API?
Un saludo!!!!
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!
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!!!
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!
Buenos días,
¿Cómo quedaría la estructura de directorios y ficheros?.
Un saludo y gracias.
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!
Sí, muchas gracias.