Jump to content

Enregistrement d'un formulaire sous onglet produit


Recommended Posts

Bonsoir à tous

 

Je suis actuellement en train de développer des modules pour Prestashop 1.6.1.7. Mon premier module est simple, il doit pouvoir permettre de saisir 3 textarea pour compléter la fiche produit classique.

 

Jusqu'ici tout va bien, je prépare donc ma fonction d'installation de la sorte :

public function install()
    {
        if (Shop::isFeatureActive())
            Shop::setContext(Shop::CONTEXT_ALL);
 
 
        Db::getInstance()->Execute('CREATE TABLE '._DB_PREFIX_.'presentation(
        `id_product` INT UNSIGNED NOT NULL,
        `description` TEXT NOT NULL,
        `experience` VARCHAR(500) NULL,
        `speciality` VARCHAR(500) NULL,
        `reference` VARCHAR(500) NULL,
        `date_create` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)
        ENGINE = InnoDB');
 
        return parent::install() &&
        $this->registerHook('displayProductButtons') &&
        $this->registerHook('header') &&
        $this->registerHook('displayAdminProductsExtra') &&
        $this->registerHook('actionProductUpdate') &&
        Configuration::updateValue('BESPRODUCTTHREEQUESTIONS_NAME', 'BesProductThreeQuestions');
    }

Tout se passe bien, les hooks s'enregistrent bien. Je sépare chaque controller de hook, et je prépare mon formulaire grâce au HelperForm :

helper = new HelperForm();
        $helper->table = 'besproductthreequestions';
        $helper->default_form_language = (int)Configuration::get('PS_LANG_DEFAULT');
        $helper->allow_employee_form_lang = (int) Configuration::get("PS_BO_ALLOW_EMPLOYEE_FORM_LANG");
        $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)."&configure=".$this->module->name.'&tab_module='.$this->module->tab.'&module_name='.$this->module->name;
        $helper->token = Tools::getAdminTokenLite('AdminModules');
 
        $helper->submit_action = 'submit_besproductthreequestions_form';
        //$helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->module->name;
        $helper->currentIndex = $this->context->link->getAdminLink('AdminProducts', false)."&configure=".$this->module->name.'&tab_module='.$this->module->tab.'&module_name='.$this->module->name;
 
        $helper->token = Tools::getAdminTokenLite('AdminProducts');
        $helper->tpl_vars = array(
          'fields_value' => array(
              'experience' => $threeQuestions[0]["experience"],
              'speciality' => $threeQuestions[0]["speciality"],
              'reference' => $threeQuestions[0]["reference"],
          )
        );

La structure du formulaire est la suivante :

$field_form = array(
            'form' => array(
                'legend' => array(
                    'title' => $this->module->l('3 questions à ...'),
                    'icon'  => 'icon-param'
                ),
                'input' => array(
                    array(
                        'type' => 'textarea',
                        'label' => $this->module->l('Quelle est votre experience ?'),
                        'name'  => 'experience',
                        'rows'   => 4,
                    ),
                    array(
                        'type' => 'textarea',
                        'label' => $this->module->l('Quelle est votre spécialité ?'),
                        'name'  => 'speciality',
                        'rows'   => 4,
                    ),
                    array(
                        'type' => 'textarea',
                        'label' => $this->module->l('Quelle sont vos références ?'),
                        'name'  => 'reference',
                        'rows'   => 4,
                    )
                ),
                'submit' => array(
                    'title' => $this->module->l('Enregistrer')
                ),
                'reset' => array(
                    'title' => $this->module->l('Annuler'),
                    'icon' => 'process-icon-cancel'
                )
            )
        );

Je prépare le reste de mon controller afin de récupérer les données insérées en base manuellement, tout se passe bien. Arrive l'étape d'enregistrement du formulaire. Et là je m'arrache les cheveux.

 

J'ai le hook suivant qui semble ne jamais être appelé (pourtant bien enregistré dans la base et associé à mon module, et bien fixé dans les hooks):

public function hookActionProductUpdate($params)
   {
       $arrayData = array (
           "id_product"    => (int)Tools::getValue('id_product'),
           "experience"    => pSQL(Tools::getValue('experience')),
           "reference"     => pSQL(Tools::getValue('reference')),
           "speciality"    => pSQL(Tools::getValue('speciality')),
       );
 
       $threeQuestions = Db::getInstance()->executeS('SELECT * FROM '._DB_PREFIX_.'presentation WHERE id_product = '.(int)Tools::getValue('id_product'));
 
       if(count($threeQuestions) > 0) {
           var_dump("existant");
           $whereClause = "id_product = ".(int)Tools::getValue('id_product');
           Db::getInstance()->insert(_DB_PREFIX_.'presentation', $arrayData);
 
       } else{
           var_dump("nouveau");
           Db::getInstance()->insert(_DB_PREFIX_.'presentation', $arrayData);
       }
 
       var_dump("hook update");
   }

J'ai tenté d'appeler une fonction directement dans le controller displayAdminProductExtra de la manière suivante :

private function processForm() {
 
        if(Tools::isSubmit('submit_besproductthreequestions_form')) {
 
            $arrayData = array (
                "id_product"    => (int)Tools::getValue('id_product'),
                "experience"    => pSQL(Tools::getValue('experience')),
                "reference"     => pSQL(Tools::getValue('reference')),
                "speciality"    => pSQL(Tools::getValue('speciality')),
            );
 
            $threeQuestions = Db::getInstance()->executeS('SELECT * FROM '.$this->tableName.' WHERE id_product = '.(int)Tools::getValue('id_product'));
 
            if(count($threeQuestions) > 0) {
                error_log("existant");
                $whereClause = "id_product = ".(int)Tools::getValue('id_product');
                Db::getInstance()->insert($this->tableName, $arrayData);
 
            } else{
                error_log("nouveau");
                Db::getInstance()->insert($this->tableName, $arrayData);
            }
            die();
        }else{
            error_log("Form not send",0);
        }
 
 
    }
 
public function run() {
        $this->assign();
        $this->processForm();
        $html =  $this->module->display($this->file, 'views/templates/hook/displayAdminProductsExtra.tpl');
        $html_form = $this->renderForm();
 
        return $html.$html_form;
    }

Nada. Cependant, mon analyseur de réseau dans fire bug m'indique que le formulaire envoie bien de la donnée en POST à une url qui répond 200 OK, mais impossible de savoir ou partent mes données.

 

Je joins à ce post une image illustrant la structure actuelle de mon module

post-1334834-0-46177500-1478456287_thumb.png

 

Je suis ouvert à toutes suggestion. Merci à la communautés

Link to comment
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...