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!