🔌 WebService — recurso personalizado completo

Actualizado: 2025-01-15

#Como funciona el WebService de PS

El WebService de PrestaShop expone ObjectModels como recursos REST. Para crear un recurso custom, necesitas: (1) un ObjectModel con $definition que incluya la clave 'webservice', (2) registrar el recurso via hook addWebserviceResources. PrestaShop se encarga del CRUD automaticamente.

#ObjectModel con webservice

classes/EcomReview.php — ObjectModel expuesto como WebService
php
<?php
class EcomReview extends ObjectModel
{
    public $id_ecom_review;
    public $id_product;
    public $id_customer;
    public $customer_name;
    public $title;
    public $content;
    public $rating;
    public $validated;
    public $date_add;

    public static $definition = [
        'table'   => 'ecom_review',
        'primary' => 'id_ecom_review',
        'fields'  => [
            'id_product'    => ['type' => self::TYPE_INT,    'validate' => 'isUnsignedId', 'required' => true],
            'id_customer'   => ['type' => self::TYPE_INT,    'validate' => 'isUnsignedId'],
            'customer_name' => ['type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 128],
            'title'         => ['type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'required' => true, 'size' => 255],
            'content'       => ['type' => self::TYPE_HTML,   'validate' => 'isCleanHtml', 'required' => true, 'size' => 65535],
            'rating'        => ['type' => self::TYPE_INT,    'validate' => 'isUnsignedInt', 'required' => true],
            'validated'     => ['type' => self::TYPE_BOOL,   'validate' => 'isBool'],
            'date_add'      => ['type' => self::TYPE_DATE,   'validate' => 'isDate'],
        ],
    ];

    /**
     * Configuracion WebService
     * Esta clave en $definition expone el ObjectModel como recurso API
     */
    protected $webserviceParameters = [
        'objectNodeName'  => 'review',           // Nombre del nodo XML/JSON individual
        'objectsNodeName' => 'reviews',          // Nombre del nodo XML/JSON lista
        'fields' => [
            // Asociar foreign keys a recursos existentes
            'id_product' => [
                'xlink_resource' => 'products',  // Link a /api/products/{id}
            ],
            'id_customer' => [
                'xlink_resource' => 'customers', // Link a /api/customers/{id}
            ],
        ],
        // Campos virtuales (solo lectura, calculados)
        'hidden_fields' => [],
    ];

    /**
     * Campo virtual: nombre del producto
     * Accesible via API como <product_name>
     */
    public function getWebserviceObjectList($sql_join, $sql_filter, $sql_sort, $sql_limit)
    {
        // Personalizar la query del listado si necesitas JOINs extras
        $sql_join .= ' LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl
            ON (a.id_product = pl.id_product AND pl.id_lang = ' . (int) Configuration::get('PS_LANG_DEFAULT') . ')';

        return parent::getWebserviceObjectList($sql_join, $sql_filter, $sql_sort, $sql_limit);
    }
}

#Registrar el recurso

Hook addWebserviceResources en el modulo
php
<?php
// En el modulo principal:
public function install()
{
    return parent::install()
        && $this->registerHook('addWebserviceResources')
        && $this->createTable();
}

/**
 * Registrar recurso WebService
 * Despues de esto, el recurso estara disponible en:
 *   GET    /api/reviews        — listar reviews
 *   GET    /api/reviews/42     — obtener review #42
 *   POST   /api/reviews        — crear review
 *   PUT    /api/reviews/42     — actualizar review #42
 *   DELETE /api/reviews/42     — eliminar review #42
 */
public function hookAddWebserviceResources($params)
{
    return [
        'reviews' => [
            'description' => 'Product reviews (ecom_reviews)',
            'class'       => 'EcomReview',
            // Permisos que se pueden configurar en BO > Advanced Parameters > Webservice
            // El admin decide cuales activar por API key
        ],
    ];
}

// IMPORTANTE: despues de instalar el modulo, ve a:
// BO > Advanced Parameters > Webservice > tu API key > marca permisos para 'reviews'

#Campos virtuales (computed)

Anadir campos calculados al recurso
php
<?php
// En EcomReview, anadir al array $webserviceParameters:
protected $webserviceParameters = [
    'objectNodeName'  => 'review',
    'objectsNodeName' => 'reviews',
    'fields' => [
        'id_product'  => ['xlink_resource' => 'products'],
        'id_customer' => ['xlink_resource' => 'customers'],
    ],
    // Campos virtuales: getter methods
    'associations' => [
        'product_name' => [
            'getter' => 'getWsProductName',
            'fields' => [
                'name' => ['required' => false],
            ],
        ],
    ],
];

/**
 * Getter para campo virtual product_name
 * PrestaShop llama a este metodo automaticamente en GET
 */
public function getWsProductName()
{
    $name = Db::getInstance()->getValue(
        'SELECT name FROM `' . _DB_PREFIX_ . 'product_lang`
         WHERE id_product = ' . (int) $this->id_product . '
         AND id_lang = ' . (int) Configuration::get('PS_LANG_DEFAULT')
    );
    return [['name' => $name ?? '']];
}

#Consumir el recurso (ejemplos cURL)

Ejemplos con cURL
bash
# === LISTAR reviews ===
curl -s "https://mitienda.com/api/reviews" \
  -u "TU_API_KEY:" \
  -H "Output-Format: JSON"

# === OBTENER review #5 ===
curl -s "https://mitienda.com/api/reviews/5" \
  -u "TU_API_KEY:" \
  -H "Output-Format: JSON"

# === FILTRAR: reviews del producto 42, validadas, rating >= 4 ===
curl -s "https://mitienda.com/api/reviews?filter[id_product]=42&filter[validated]=1&filter[rating]=[4,5]&display=full" \
  -u "TU_API_KEY:" \
  -H "Output-Format: JSON"

# === CREAR review (POST) ===
curl -X POST "https://mitienda.com/api/reviews" \
  -u "TU_API_KEY:" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0"?>
<prestashop>
  <review>
    <id_product>42</id_product>
    <id_customer>15</id_customer>
    <customer_name>Juan Garcia</customer_name>
    <title>Excelente producto</title>
    <content>Muy buena calidad, envio rapido.</content>
    <rating>5</rating>
    <validated>0</validated>
  </review>
</prestashop>'

# === ACTUALIZAR review (PUT) ===
curl -X PUT "https://mitienda.com/api/reviews/5" \
  -u "TU_API_KEY:" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0"?>
<prestashop>
  <review>
    <id>5</id>
    <validated>1</validated>
  </review>
</prestashop>'

# === ELIMINAR review ===
curl -X DELETE "https://mitienda.com/api/reviews/5" \
  -u "TU_API_KEY:"
Consumir desde PHP con PrestaShopWebservice class
php
<?php
require_once 'PSWebServiceLibrary.php';

$ws = new PrestaShopWebservice(
    'https://mitienda.com',
    'TU_API_KEY',
    false // debug
);

// Listar reviews validadas
$xml = $ws->get([
    'resource' => 'reviews',
    'filter[validated]' => '1',
    'display'  => 'full',
    'limit'    => '50',
]);

foreach ($xml->reviews->review as $review) {
    echo $review->title . ' — ' . $review->rating . '/5' . PHP_EOL;
}

// Crear review
$xml = $ws->get(['url' => 'https://mitienda.com/api/reviews?schema=blank']);
$xml->review->id_product     = 42;
$xml->review->customer_name  = 'Maria Lopez';
$xml->review->title          = 'Muy recomendable';
$xml->review->content        = 'Producto de gran calidad.';
$xml->review->rating         = 5;
$xml->review->validated      = 0;

$result = $ws->add(['resource' => 'reviews', 'postXml' => $xml->asXML()]);

#Seguridad y permisos

  • Usa HTTPS siempre — las API keys viajan en la peticion
  • Crea API keys distintas por integracion (una para ERP, otra para app movil, etc.)
  • Activa SOLO los permisos necesarios (no GET+POST+PUT+DELETE para todo)
  • Valida datos en el ObjectModel ($definition validates) — el WS los aplica automaticamente
  • Usa pSQL() y (int) en cualquier query custom dentro de getWebserviceObjectList()
  • Monitoriza accesos: registra llamadas API en un log custom
  • Rota API keys periodicamente
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.