📦

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.

MetodoPS 1.7PS 8+
Tabs del BOdisplayAdminProductsExtra (BO v1)displayAdminProductsExtra (BO v2 tambien lo soporta)
Modificar fieldsactionProductFormBuilderModifier (nuevo)actionProductFormBuilderModifier
Guardar datosactionAfterUpdateProductFormHandleractionAfterUpdateProductFormHandler
Form TypesHelperForm legacySymfony 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.