🔌 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.