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

Hola!

Hoy vamos a aprender a crear una nueva función en la API de PS de forma muy sencilla donde los parámetros podemos incluirlos en la propia URL. Para ello necesitaremos el artículo anterior y lo que aprendimos allá, así como la clase drapps que allá creamos.

Nuestra función con management personalizado

Abriremos nuestro

WebserviceRequest

y cambiaremos la declaración de nuestro nuevo servicio web para que sea de la siguiente forma:


class WebserviceRequest extends WebserviceRequestCore
{
    public static function getResources()
    {
        $resources = parent::getResources();
        $resources['drapps'] = array('description' => 'Mis funciones', 'specific_management' => true);
        return $resources;
    }
}

El cambio aquí está en el parámetro specific_management: este parámetro cambia la manera en que esta función de nuestra API funciona… pudiendo manejarla como nosotros queramos.

Clase personalizada

Ahora crearemos un nuevo fichero en /override/classes/webservices llamado WebserviceSpecificManagementDrapps que implementará la interfaz WebserviceSpecificManagementInterface.

A continuación os dejo un esqueleto de la clase con las funciones implementadas de la interfaz:


<?php class WebserviceSpecificManagementDrappsCore implements WebserviceSpecificManagementInterface { 

    /** @var WebserviceOutputBuilder */ 
    protected $objOutput; 
    protected $output; 
    /** @var WebserviceRequest */ 
    protected $wsObject; 
    protected $validateFunctions = array( 'funcion1', 'funcion2' ); 

    public function setObjectOutput(WebserviceOutputBuilderCore $obj) { 
        $this->objOutput = $obj;
        return $this;
    }

    public function setWsObject(WebserviceRequestCore $obj)
    {
        $this->wsObject = $obj;
        return $this;
    }

    public function getWsObject()
    {
        return $this->wsObject;
    }

    public function getObjectOutput()
    {
        return $this->objOutput;
    }

    public function getContent()
    {
        return $this->objOutput->getObjectRender()->overrideContent($this->output);
    }

    public function manage() 
    {

         ...

    }
}

La función manage la explicaré a continuación. las otras funciones son casi siempre parecidas. Y el parámetro de clase $validateFunctions lo he introducido ya como un comienzo de implementación de nuestras funciones. Si tenéis alguna duda con el funcionamiento de estas funciones básicas preguntad libremente.

La función manage

La implementación de esta función ya corre por nuestra parte. Presentaré una implementación que haga lo que en el anterior artículo hacía para dar una idea de cómo podría usarse.


public function manage()
{
    if (count($this->wsObject->urlSegment) < 2) 
        throw new WebserviceException('Error', array(100, 400)); 

    if ( ! in_array( $this->wsObject->urlSegment[1], $this->validateFunctions ) )
        throw new WebserviceException('Error', array(100, 400));

    $funcion = $this->wsObject->urlSegment[1];
    $params = array_slice( $this->wsObject->urlSegment, 2);

    $response = $this->{$funcion} ( $params );

    $this->output .= $this->objOutput->getObjectRender()->renderNodeHeader('drapps', array(), $response, false);
}

Aquí tenemos el objeto wsObject con el parámetro urlSegment con todos los parámetros de la prettyUrl.

Por ejemplo: drapps, funcion1, parametro1, parametro2 si la url es del tipo http://url_tienda/api/drapps/funcion1/parametro1/parametro2

Ahora solamente quedaría implementar nuestras funciones personalizadas: por ejemplo funcion1:


private function funcion1 ( $params ) {
    /** @var drapps $drappsObj */
    $drappsObj = new drapps( $params[0] );
    return ['nImages' => $drappsObj->getNumberOfImages()];
}

private function funcion2 ( $params ) {
    throw new WebserviceException('Funcion2 Not implemented yet', array(100, 400));
}

Alguna anotación

  • Recordar activar este Resource desde el admin de Prestashop (Parámetros avanzados -> webservice).

  • Asimismo, no estoy teniendo en cuenta en este ejemplo casi nada acerca de la validación de parámetros, eso os lo dejo a vuestra libertad.

 

¡Nada más!

Si queréis que siga escribiendo sobre Prestashop… no dudéis en contactarme; así como si tenéis alguna duda.

Un saludo y gracias por leerme!

8 comentarios

  1. Buenos días,
    Tengo una tienda online con prestashop, hago dropshipping con bigbuy. Pero necesito crear un API que me actualize automaticamente el catalogo completo de bigbuy cada 4 horas, así como los costes de envío y los atributos de los productos.
    Bigbuy me facilito las claves de API para poder realizar estas tareas, pero no tengo nada de conocimientos de programacion.

    Te escribo para ver si me puedes dar alguna solucion, espero tu respuesta

    Gracias!!

    1. Hola José!

      Gracias por tu comentario… en breve os pondremos en contacto contigo para gestionar tus dudas

      Un saludo!

    1. Hola Jasmin!

      Escribiré un nuevo post explicando esto un poco ¿vale? Sois varios los que me habéis preguntado y responderé con un post.

      Gracias!

  2. Hola David.

    Estoy tratando de crear un servicio web que me retorne todo el menú de la web. eh simulado lo que necesito que me retorne de esta forma. http://superpet.juankuga.io/modules/ps_mainmenu/ws/

    Pero leyendo tu articulo estoy intentando que sea de esta forma. http://superpet.juankuga.io/api/psmainmenu,

    En el modulo de ps_mainmenu eh creado una funcion que me retorne todo el menú que nesito. lo que intento hacer es coger ese método y llamarlo desde el webservice y me retorne todo aquí http://superpet.juankuga.io/api/psmainmenu.
    Gracias por tu post. enserio que ayudas a mucho. pero creo que seria genial también que todo tu ejemplo lo puedas subir en GitHub.

    Muchas Gracias.

    1. Hola Juan!

      Puedes crear un wrapper que llame a dicha función que te retorne el menu y ya ese wrapper lo llamas desde tu función del servicio web (o desde el servicio web llamas a esta función que has realizado). No tengo muy claro cómo ayudarte a través de un comentario. Si quieres contáctame por skype y lo vemos

      Un saludo y gracias por pasarte!

Los comentarios están cerrados.