🔌

Extender el Webservice API con recursos propios

Actualizado: 2024-12-01

La API Webservice de PrestaShop permite exponer datos de tu modulo como recursos REST. Los clientes pueden leer, crear, modificar y eliminar registros usando los mismos patrones que con los recursos del core (productos, pedidos, clientes...).

#Registrar el hook

Registrar hookAddWebserviceResources en install()
php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('addWebserviceResources');
}

/**
 * Define los recursos del modulo en el Webservice.
 * Clave: nombre del endpoint (URL)
 * Valor: clase que gestiona el recurso
 */
public function hookAddWebserviceResources(): array
{
    return [
        'mymodule_items' => [
            'description' => 'Items del modulo MyModule',
            'class'       => 'WebserviceMyModuleItem',
            'object'      => 'MyModuleItem',   // ObjectModel class
        ],
    ];
    // Endpoint resultante: /api/mymodule_items
}

#Crear la clase del recurso

classes/webservice/WebserviceMyModuleItem.php
php
<?php

/**
 * Webservice resource para MyModuleItem.
 * Archivo: modules/mymodule/classes/webservice/WebserviceMyModuleItem.php
 */
class WebserviceMyModuleItem extends WebserviceRequestCore
{
    /**
     * Define los campos que expone el endpoint.
     * Coinciden con los campos del ObjectModel.
     */
    public static $content_type = 'items';
    public static $endpoint_method = ['GET', 'POST', 'PUT', 'DELETE'];

    /**
     * Si no se sobreescribe, PS usa el ObjectModel directamente.
     * Sobreescribir para filtrar datos o añadir logica extra.
     */
}

#ObjectModel como base del recurso

classes/MyModuleItem.php — ObjectModel para el recurso
php
<?php

if (!defined('_PS_VERSION_')) { exit; }

class MyModuleItem extends ObjectModel
{
    public $name;
    public $description;
    public $active;
    public $date_add;
    public $date_upd;

    public static $definition = [
        'table'   => 'mymodule_item',
        'primary' => 'id_mymodule_item',
        'fields'  => [
            'name'        => ['type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'size' => 255, 'required' => true],
            'description' => ['type' => self::TYPE_HTML,   'validate' => 'isCleanHtml'],
            'active'      => ['type' => self::TYPE_BOOL,   'validate' => 'isBool'],
            'date_add'    => ['type' => self::TYPE_DATE,   'validate' => 'isDate'],
            'date_upd'    => ['type' => self::TYPE_DATE,   'validate' => 'isDate'],
        ],
    ];
}

#Probar el endpoint

Probar el endpoint con cURL
bash
# Listar todos los items
curl -X GET "https://tutienda.com/api/mymodule_items" \
  -u "TU_API_KEY:" \
  -H "Accept: application/json"

# Obtener un item por ID
curl -X GET "https://tutienda.com/api/mymodule_items/1" \
  -u "TU_API_KEY:"

# Crear un item
curl -X POST "https://tutienda.com/api/mymodule_items" \
  -u "TU_API_KEY:" \
  -H "Content-Type: application/json" \
  -d '{"mymodule_item":{"name":"Nuevo item","active":1}}'

# Actualizar
curl -X PUT "https://tutienda.com/api/mymodule_items/1" \
  -u "TU_API_KEY:" \
  -H "Content-Type: application/json" \
  -d '{"mymodule_item":{"name":"Nombre actualizado"}}'
⚠️
La API key necesita permisos explicitos

Despues de instalar el modulo, ve al BO > Parametros avanzados > Servicios web y concede permisos GET/POST/PUT/DELETE al recurso mymodule_items para la API key que uses.

Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.