---
title: Modificar el formulario de producto — PS 8+
section: trucos
slug: product-form
description: Como añadir campos personalizados al formulario de producto en PrestaShop 8/9 usando actionProductFormBuilderModifier, data providers y el nuevo admin de producto (V2).
keywords: prestashop formulario producto admin product form builder modifier campos custom ps8 ps9
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/trucos/product-form"
---

# Modificar el formulario de producto — PS 8+

> Como añadir campos personalizados al formulario de producto en PrestaShop 8/9 usando actionProductFormBuilderModifier, data providers y el nuevo admin de producto (V2).

PrestaShop 8 rediseño el formulario de producto con una arquitectura Symfony moderna. Para añadir campos al formulario ya no se usa `displayAdminProductsExtra` como unico punto de entrada — ahora existe un sistema de **Form Builder Modifiers** mas estructurado.

| Metodo | PS 1.7 | PS 8+ |
| --- | --- | --- |
| Tabs del BO | displayAdminProductsExtra (BO v1) | displayAdminProductsExtra (BO v2 tambien lo soporta) |
| Modificar fields | actionProductFormBuilderModifier (nuevo) | actionProductFormBuilderModifier |
| Guardar datos | actionAfterUpdateProductFormHandler | actionAfterUpdateProductFormHandler |
| Form Types | HelperForm legacy | Symfony FormTypes |

## Hook actionProductFormBuilderModifier

*Añadir campos al formulario de producto con Form Builder Modifier*

```php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionProductFormBuilderModifier')
        && $this->registerHook('actionAfterUpdateProductFormHandler')
        && $this->registerHook('actionAfterCreateProductFormHandler');
}

/**
 * Modifica el FormBuilder del producto para añadir nuestros campos.
 * $params['form_builder'] es el FormBuilderInterface de Symfony.
 */
public function hookActionProductFormBuilderModifier(array $params): void
{
    /** @var \Symfony\Component\Form\FormBuilderInterface $formBuilder */
    $formBuilder = $params['form_builder'];
    $productId   = (int) ($params['id'] ?? 0);

    // Cargar el valor actual del campo
    $currentValue = '';
    if ($productId > 0) {
        $currentValue = (string) Configuration::get('MY_PRODUCT_EXTRA_' . $productId);
        // O desde una tabla propia:
        // $currentValue = $this->getProductExtra($productId);
    }

    // Añadir un campo de texto al final del formulario
    $formBuilder->add('mymodule_extra_field', \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
        'label'    => $this->trans('Campo extra del modulo', [], 'Modules.Mymodule.Admin'),
        'required' => false,
        'data'     => $currentValue,
        'attr'     => ['placeholder' => 'Introduce un valor...'],
    ]);
}
```

## Guardar los datos con actionAfterUpdateProductFormHandler

*Guardar el valor extra al actualizar el producto*

```php
<?php

// Se ejecuta despues de guardar el producto (create y update)
public function hookActionAfterUpdateProductFormHandler(array $params): void
{
    $productId  = (int) $params['id'];
    $formData   = $params['form_data'];  // Array con todos los datos del form

    $extraValue = $formData['mymodule_extra_field'] ?? '';

    // Guardar en Configuration (simple) o en tabla propia
    Configuration::updateValue('MY_PRODUCT_EXTRA_' . $productId, pSQL($extraValue));
}

public function hookActionAfterCreateProductFormHandler(array $params): void
{
    // Mismo proceso para productos nuevos
    $this->hookActionAfterUpdateProductFormHandler($params);
}
```

## Añadir un tab completo al producto (BO)

*displayAdminProductsExtra — tab en el admin de producto*

```php
<?php

// Funciona tanto en PS 1.7 (v1 del BO de producto)
// como en PS 8 (v2, pero como panel en la zona de modulos)
public function hookDisplayAdminProductsExtra(array $params): string
{
    $productId = (int) $params['id_product'];
    $product   = new Product($productId);

    $this->context->smarty->assign([
        'product_id'    => $productId,
        'product_name'  => $product->name[$this->context->language->id],
        'extra_data'    => $this->getProductExtra($productId),
        'form_token'    => Tools::getAdminToken(
            'AdminProducts' . (int) $this->context->employee->id
        ),
    ]);

    return $this->display(__FILE__, 'views/templates/admin/product_extra.tpl');
}

private function getProductExtra(int $productId): array
{
    return Db::getInstance()->getRow(
        'SELECT * FROM `' . _DB_PREFIX_ . 'mymodule_product_extra`
         WHERE `id_product` = ' . (int) $productId
    ) ?: [];
}
```


---

*Fuente: [https://ayudaprestashop.es/trucos/product-form](https://ayudaprestashop.es/trucos/product-form). Version Markdown generada automaticamente para consumo por LLMs.*
