Jump to content
BenAg

Ajout de champs sur la page d'admin d'un produit

Recommended Posts

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.

screen.jpg

Share this post


Link to post
Share on other sites

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ù :)

Share this post


Link to post
Share on other sites

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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More