Paul Serrano Posted January 10 Share Posted January 10 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" : et ici avec EN : 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 More sharing options...
Paul Serrano Posted January 15 Author Share Posted January 15 Hello, j'up le sujet, si jamais quelqu'un a une petite idée ! Merci ! Link to comment Share on other sites More sharing options...
LauraDo Posted February 7 Share Posted February 7 Salut ! Je rencontre un problème similaire au niveau de l'enregistrement en base de donnée de mon champs custom. Est-ce que tu as trouvé une solution ? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now