📦
Modificar el formulario de producto — PS 8+
Actualizado: 2024-12-01
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
) ?: [];
}
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.