⚙️
Form Data Providers — modificar datos del formulario de producto
Actualizado: 2024-12-01
Los hooks action*FormDataProviderData permiten modificar los datos que se cargan en los formularios Symfony del Back Office antes de que se muestren al usuario. Es la alternativa moderna y no destructiva a los overrides de clases PHP para alterar formularios existentes.
#Como funciona el ciclo de datos
| Momento | Hook | Uso |
|---|---|---|
| Carga de producto existente | actionProductFormDataProviderData | Modifica datos antes de mostrar el form de edicion |
| Producto nuevo (defaults) | actionProductFormDataProviderDefaultData | Establece valores iniciales para un producto en blanco |
| Carga de combinacion | actionCombinationFormDataProviderData | Igual pero para el form de combinaciones |
| Carga de categoria | actionCategoryFormDataProviderData | Igual pero para el form de categorias (PS 8.1+) |
#Modificar datos de producto existente
Modificar datos antes de mostrar el formulario de producto
php
<?php
public function install(): bool
{
return parent::install()
&& $this->registerHook('actionProductFormDataProviderData')
&& $this->registerHook('actionProductFormDataProviderDefaultData');
}
/**
* Se llama cuando se carga un producto existente para editar.
* $params['id'] -> int ID del producto
* $params['data'] -> array mutable con todos los datos del form
*/
public function hookActionProductFormDataProviderData(array $params): void
{
$productId = (int) $params['id'];
// Leer dato propio de la tabla del modulo
$extra = Db::getInstance()->getValue(
'SELECT extra_note FROM `' . _DB_PREFIX_ . 'mymodule_product`
WHERE id_product = ' . $productId
);
if ($extra !== false) {
// Modificar el campo 'mpn' dentro del tab 'details > references'
// OJO: debes conocer el path exacto de la estructura de datos
$params['data']['details']['references']['mpn'] = (string) $extra;
}
// Ejemplo: inyectar datos en una seccion custom
// (requiere hookActionProductFormBuilderModifier para registrar el campo)
$params['data']['mymodule_tab']['extra_field'] = $extra ?: '';
}
#Modificar datos por defecto (producto nuevo)
Establecer valores por defecto cuando se crea un producto nuevo
php
<?php
/**
* Se llama al crear un producto nuevo (campos en blanco).
* Util para pre-rellenar campos con valores inteligentes.
*/
public function hookActionProductFormDataProviderDefaultData(array $params): void
{
// Pre-rellenar MPN con prefijo de la empresa
$params['data']['details']['references']['mpn'] = 'MY-PREFIX-';
// Pre-activar producto para usuarios avanzados
// $params['data']['header']['active'] = true;
// Establecer impuesto por defecto del modulo
// $idTaxRules = (int) Configuration::get('MY_MODULE_DEFAULT_TAX');
// if ($idTaxRules > 0) {
// $params['data']['pricing']['id_tax_rules_group'] = $idTaxRules;
// }
}
#Localizar el path del campo
Para saber el path exacto de un campo, usa var_dump($params['data']) en desarrollo o consulta las clases ProductFormDataProvider del core de PrestaShop. La estructura sigue la jerarquia de Form Types.
Paths comunes del formulario de producto PS 8
php
<?php
// Estructura principal del array $params['data']:
// header.name -> nombre del producto (multilingual)
// header.active -> bool activo/inactivo
// header.id_category_default -> categoria principal
// description.description -> descripcion larga
// description.description_short -> descripcion corta
// details.references.reference -> referencia
// details.references.mpn -> MPN
// details.references.isbn -> ISBN
// details.references.ean13 -> EAN13
// pricing.price -> precio
// pricing.id_tax_rules_group -> grupo de impuestos
// pricing.wholesale_price -> precio de coste
// stock.quantity -> stock
// stock.minimal_quantity -> cantidad minima de compra
// seo.meta_title -> meta title (multilingual)
// seo.meta_description -> meta description
// seo.link_rewrite -> URL amigable (multilingual)
// shipping.width / height / depth / weight
// combinations.* -> datos de combinaciones
#Ventajas sobre Overrides
| Aspecto | Override de clase | Data Provider Hook |
|---|---|---|
| Compatibilidad entre modulos | Conflictos frecuentes | Composable: varios modulos coexisten |
| Actualizaciones de PS | Puede romperse | Estable entre versiones menores |
| Estructura de datos DB | Requiere override del ObjectModel | Solo modifica el array del form |
| Efecto | Permanente y global | Solo en el contexto del formulario |
| Debug | Dificil de rastrear | Claramente localizado en el hook |
Performance: evita queries pesadas
Estos hooks se ejecutan cada vez que se carga el formulario. Usa Cache o queries simples (SELECT con indice) para no penalizar la velocidad del back office.
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.