ACTION
BO
Desde 1.5
actionProductSave
~3 min de lectura
#Descripcion
Se ejecuta cuando un producto es guardado desde el back office, ya sea al crear uno nuevo o al modificar uno existente. Es el hook general para detectar cualquier guardado de producto, ideal para sincronizar datos con sistemas externos, regenerar caches o actualizar indices de busqueda.
Disparado por
-
AdminProductsController::processAdd() / processUpdate()— controllers/admin/AdminProductsController.php
#Parametros
| Nombre | Tipo | Requerido | Descripcion |
|---|---|---|---|
| $id_product | int | Si | ID del producto guardado |
| $product | Product | Si | Objeto Product guardado |
Retorno
void
Este hook no espera valor de retorno
#Ejemplo de codigo
mymodule.php
php
<?php
public function install()
{
return parent::install()
&& $this->registerHook('actionProductSave');
}
mymodule.php
php
<?php
/**
* Hook actionProductSave — producto guardado en admin
*/
public function hookActionProductSave(array $params)
{
$idProduct = (int) $params['id_product'];
/** @var Product $product */
$product = $params['product'];
// Ejemplo: Sincronizar producto con catalogo externo
$languages = Language::getLanguages(false);
$productData = [
'id' => $idProduct,
'reference' => $product->reference,
'ean13' => $product->ean13,
'price' => $product->price,
'active' => (bool) $product->active,
'names' => [],
'descriptions' => [],
];
foreach ($languages as $lang) {
$idLang = (int) $lang['id_lang'];
$productData['names'][$lang['iso_code']] = $product->name[$idLang] ?? '';
$productData['descriptions'][$lang['iso_code']] = strip_tags($product->description_short[$idLang] ?? '');
}
// Marcar para sincronizacion
Db::getInstance()->insert('mymodule_product_sync', [
'id_product' => $idProduct,
'payload' => pSQL(json_encode($productData)),
'synced' => 0,
'date_add' => date('Y-m-d H:i:s'),
], false, true, Db::ON_DUPLICATE_KEY);
// Limpiar cache del producto
if (method_exists('Cache', 'clean')) {
Cache::clean('product_' . $idProduct . '_*');
}
}
#Notas y gotchas
- ⚠️ Este hook se ejecuta tanto para productos nuevos como para actualizaciones — verifica con `$product->isNew()` si necesitas distinguir.
- ⚠️ No confundir con `actionProductAdd` (solo creacion) o `actionProductUpdate` (solo actualizacion).
- ⚠️ Los hooks ObjectModel (`actionObjectProductAddAfter`, etc.) se disparan a nivel de ORM, mientras que este se dispara a nivel de controlador.
- ⚠️ En PS 1.7+ con Symfony, este hook puede dispararse en contextos diferentes al controlador clasico.
- ⚠️ El producto ya esta guardado en BD cuando se ejecuta este hook.
#Relacionados
#Historial de versiones
| Version PS | Cambio |
|---|---|
| 1.5 | Introducido |
| 1.7 | Compatible con el nuevo formulario de producto Symfony |
| 8.0 | Sin cambios. Compatible |
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.