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