Jump to content

Module ajout champs custom sur les fiches produit du Back Office


Recommended Posts

Bonjour à tous ! 

J'ai crée un module pour le presta de ma boîte, ce module est censé rajouter des champs custom aux fiches produit du Back Office.

J'ai bien les nouveaux champs qui s'affichent où je veux sur la fiche produit, tout va bien au niveau de l'enregistrement des données dans mes tables custom en BDD.

Mon soucis, c'est au niveau des langues. J'ai, pour chacun de ces champs custom, un onglet Langue, qui regroupe les langues actives du Prestashop, ici en sélectionnant "FR" 

champscustomfr.thumb.png.3fd4465252c70f6a1419497363dd9f95.png

et ici avec EN

champscustomen.thumb.png.d8eeb9d2998e543340e15d9ba3219d47.png

Voici mon code de génération du formulaire
 

<?php 

declare(strict_types=1);

namespace ProductCustomFields\Form\Modifier;

use Db;
use PrestaShop\PrestaShop\Core\ConstraintValidator\Constraints\DefaultLanguage;
use PrestaShopBundle\Form\Admin\Type\TranslatableType;
use PrestaShopBundle\Form\FormBuilderModifier;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

final class ProductFormModifier
{
    /**
     * @var FormBuilderModifier
     */
    private $formBuilderModifier;

    /**
     * @param FormBuilderModifier $formBuilderModifier
     */
    public function __construct(
        FormBuilderModifier $formBuilderModifier
    ) {
        $this->formBuilderModifier = $formBuilderModifier;
    }

    /**
     * @param int|null $productId
     * @param FormBuilderInterface $productFormBuilder
     */
    public function modify(
        int $productId,
        FormBuilderInterface $productFormBuilder
    ): void {
        $data = $this->getProductInfo($productId);

        $translatableData = [];
        foreach ($data as $productInfo) {
            $idLang = $productInfo['id_lang'];
            $translatableData[$idLang] = [
                'advice' => $productInfo['advice'],
                'title' => $productInfo['title'],
                'pose' => $productInfo['pose'],
                // Ajoutez d'autres clés si nécessaire
            ];
        }

        $tabFormBuilder = $productFormBuilder->get('description');
        $this->formBuilderModifier->addAfter(
            $tabFormBuilder, // the tab
            'description', // the input/form from which to insert after/before
            'advice', // your field name
            TranslatableType::class, // your field type
            [
                'type' => TextareaType::class,
                'options' => [
                    'label' => 'Advice', // you can remove the label if you dont need it by passing 'label' => false
                    'label_attr' => [ // customize label with any HTML attribute
                        'title' => 'h3',
                    ],
                    'attr' => [
                        'placeholder' => 'Advice',
                    ],
                    'data' => "Ceci est censé être ma data de la BDD, en fonction du choix de l'onglet, et d'id_lang de ma table",
                    'empty_data' => '',
                    'form_theme' => '@PrestaShop/Admin/TwigTemplateForm/prestashop_ui_kit_base.html.twig',
                ]
            ],
        );
        $this->formBuilderModifier->addAfter(
            $tabFormBuilder,
            'description',
            'title',
            TranslatableType::class,
            [
                'type' => TextType::class,
                'options' => [
                    'label' => 'Title',
                    'label_attr' => [
                        'title' => 'h3',
                    ],
                    'attr' => [
                        'placeholder' => 'Title',
                    ],
                    'data' => "Ceci est censé être ma data de la BDD, en fonction du choix de l'onglet, et d'id_lang de ma table",
                    'empty_data' => 'fgfgdfg<sgs',
                    'form_theme' => '@PrestaShop/Admin/TwigTemplateForm/prestashop_ui_kit_base.html.twig',
                ]
            ]
        );
        $this->formBuilderModifier->addAfter(
            $tabFormBuilder,
            'description',
            'pose',
            TranslatableType::class,
            [
                'type' => TextType::class,
                'options' => [
                    'label' => 'Pose',
                    'label_attr' => [
                        'title' => 'h3',
                    ],
                    'attr' => [
                        'placeholder' => 'Pose',
                    ],
                    'data' => "Ceci est censé être ma data de la BDD, en fonction du choix de l'onglet, et d'id_lang de ma table",
                    'empty_data' => '',
                    'form_theme' => '@PrestaShop/Admin/TwigTemplateForm/prestashop_ui_kit_base.html.twig',
                ]
            ]
        );

        $productFormBuilder->addEventListener(FormEvents::SUBMIT, [$this, 'onSubmit']);

    }

    public function onSubmit(FormEvent $event): void
    {

        $data = $event->getData();

        $this->updateProduct($data['description'], $data['id']);

    }

    public function updateProduct(array $data, int $id_product) {

        foreach ($data['advice'] as $key => $sql_data) {
            $sql = 'INSERT INTO `'._DB_PREFIX_.'product_custom_fields` (`id_product`, `id_lang`, `advice`) 
                VALUES (' . (int)$id_product . ', '. $key .', \'' . pSQL($sql_data) . '\')
                ON DUPLICATE KEY UPDATE `advice` = \'' . pSQL($sql_data) . '\'';

            // Exécutez la requête SQL
            Db::getInstance()->execute($sql);
        }

    }

    public function getProductInfo(int $id_product) {
        $sql = '
        SELECT * FROM `'._DB_PREFIX_.'product_custom_fields`
        WHERE id_product = '.$id_product.'
        ';

        return Db::getInstance()->executeS($sql);
    }
}

modify() => ajoute de nouveaux champs au FormBuilder
updateProduct() => Insère ou Update les infos en BDD

getProductInfo() => Récupère les datas, pour les afficher sur les champs.

Je remarque que l'attribut 'data' est celui qu'il faut cibler pour afficher ce qu'on veut dans les champs.

Mais, cet attribut ne prend qu'une string en compte, pas d'array.
Je voudrais donc savoir comment faire pour récupérer l'ID de la langue sélectionné, et afficher les donnés en fonction.

J'ai pensé à de l'Ajax, mais j'imagine que Prestashop nous permet ça sans passer par ce biais ? 

En gros je voudrais le même fonctionnement que les champs natifs description et récapitulatifs

Merci d'avance pour vos réponses ! 

Link to comment
Share on other sites

  • 4 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...