BenAg Posted May 29, 2020 Share Posted May 29, 2020 Bonjour à tous, Je suis en train de développer un module dans lequel je souhaite afficher un champ de recherche avec autocomplete dans mes pages d'admin produits. Jusque là pas de soucis j'arrive correctement à ajouter mon champs et à faire fonctionner la recherche avec TypeAhead, grâce en partie à ce tuto : https://devdocs.prestashop.com/1.7/development/architecture/migration-guide/forms/crud-forms/#creating-a-form-data-handler Vous pouvez trouver un petit aperçu ci-joint. Maintenant je suis bloqué sur l'enregistrement de mes produits. En effet j'ai hooké mon module au hook "hookActionProductSave" dans lequel récupère mon formulaire via le container Symfony désormais accessible dans les modules. Là j'appelle : $form->handleRequest($request); puis la méthode handleFor de mon form handler. A partir de là mon formulaire n'est jamais valide, et quand je débug les erreurs je vois que cela provient du token CSRF qui n'est pas bon. Voici le code de mon hook : /** * @throws PrestaShopDatabaseException * @throws PrestaShopException */ public function hookActionProductSave() { /** @var Request $request */ $request = $this->get('request_stack')->getCurrentRequest(); $form_request_params = $request->request->get('form'); /** @var Form $form */ if (!empty($form_request_params['id_product'])) { $form = $this->get('prestashop.module.block_related_cms_pages.form_builder')->getFormFor($form_request_params['id_product']); } else { $form = $this->get('prestashop.module.block_related_cms_pages.form_builder')->getForm(); } $form->handleRequest($request); if (!empty($form_request_params['id_product'])) { $form_handler = $this->get('prestashop.core.form.identifiable_object.handler.contact_form_handler'); $result = $form_handler->handleFor($form_request_params['id_product'], $form); if ($result->isSubmitted() && $result->isValid()) { dump('IT WORKS!'); die; } } else { $form_handler = $this->get('prestashop.core.form.identifiable_object.handler.contact_form_handler'); $result = $form_handler->handle($form); if (null !== $result->getIdentifiableObjectId()) { } } $errors = $form->getErrors(); foreach ($errors as $index => $error) { dump($error->getMessage()); } dump($form->isSubmitted(), $form->isValid()); die; } J'ai tenté de désactiver la protection csrf en la désactivant au moment où je récupère mon formulaire comme ceci : $form = $this->get('prestashop.module.block_related_cms_pages.form_builder')->getFormFor($form_request_params['id_product'], [], ['csrf_protection' => false]); Et là lorsque je soumet mon formulaire j'ai une erreur 500 renvoyée, non loguée (je suis suis bien en mode débug). Je suis à 2 doigts de faire les choses le plus proprement possible je pense (sans override de classes Prestashop, laissant mon module totalement standalone) mais je bute sur ce dernier point (j'ai déjà fait une code "legacy" qui lui fonctionne (dans ce même hook) en utilisant Tools::getAllValues(); mais je souhaitais réutiliser le système des formulaires Symfony. Si quelqu'un à une idée je suis preneur, je suis bloqué depuis des heures là dessus. Par avance merci. Link to comment Share on other sites More sharing options...
BenAg Posted May 30, 2020 Author Share Posted May 30, 2020 Bon et bien à toute fin utile pour quelqu'un, je pense que Prestashop redirige les erreurs, donc pour voir d'où venait mon erreur j'ai ajouté un try catch dans mon hook, en catchant ltoutes les exceptions (Throwable). Je me suis vite rendu compte du soucis... Je ne chargeais pas le FormHandler défini dans mes services : $form_handler = $this->get('prestashop.core.form.identifiable_object.handler.contact_form_handler'); En remplacant par : $form_handler = $this->get('prestashop.module.block_related_cms_pages.form_handler'); Ca va tout de suite mieux ! Si ça peut aider quelqu'un au cas où 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