PrestashopUser03 Posted August 29, 2019 Share Posted August 29, 2019 Bonjour à tous, J'ai créé des champs personnalisés dans les pages magasins, ils s'affichent en back office et même en front office (j'ai enregistré les valeurs directement en base de données). Le problème que j'ai est que lorsque j'enregistre, je ne sais pas pourquoi je reçois l'erreur du titre (Une erreur s'est produite pendant la mise à jour de l'objet. <b>store</b> (Unknown column 'wysiwyg1' in 'field list') ). Voici mon code dans le fichier store.php (je ne suis pas passé par un override parce qu'il ne fonctionne pas) : public $wysiwyg1; public $wysiwyg2; public $payments; public $url_rewrite; //dans $definition = array( 'wysiwyg1'=>array('type'=>self::TYPE_HTML, 'validate'=>'isCleanHtml'), 'wysiwyg2'=>array('type'=>self::TYPE_HTML, 'validate'=>'isCleanHtml'), 'payments'=>array('type'=>self::TYPE_STRING, 'validate'=>'isCleanHtml'), 'url_rewrite'=>array('type'=>self::TYPE_STRING, 'validate'=>'isCleanHtml'), Voici mon code dans AdminStoresController.php dans $this->field_form=array( array( 'type' => 'textarea', 'label' => $this->trans('wysiwyg1', array(), 'Admin.Global'), 'name' => 'wysiwyg1', 'lang' => true, ), array( 'type' => 'textarea', 'label' => $this->trans('wysiwyg2', array(), 'Admin.Global'), 'name' => 'payments', 'lang' => true, ), array( 'type' => 'text', 'label' => $this->trans('payments', array(), 'Admin.Global'), 'name' => 'payments', 'lang' => true, ), array( 'type' => 'text', 'label' => $this->trans('url_rewrite', array(), 'Admin.Global'), 'name' => 'url_rewrite', 'lang' => true, ), Pour la bdd, c'est correct aussi il me semble mais voici une photo des quatre champs custom dans ps_store_lang Précision : dans les champs wysiwyg1... du backoffice les infos s'affichent correctement, pareil pour les pages magasins. Je ne peux juste pas enregistrer. Link to comment Share on other sites More sharing options...
PrestashopUser03 Posted August 30, 2019 Author Share Posted August 30, 2019 Personne n'a d'idée? Link to comment Share on other sites More sharing options...
Traineau Posted August 30, 2019 Share Posted August 30, 2019 Bonjour, vous êtes sous quelle version de PrestaShop ? Première chose que j'essayerai : Vu que vous tentez d'enregistrer des champs langs, pensez a ajouter 'lang' => true pour chacunes de vos définition : 'wysiwyg1'=>array('type'=>self::TYPE_HTML, 'validate'=>'isCleanHtml', 'lang' => true) , Ensuite avez vous bien récupérés ces infos dans la fonction PostProcess de AdminStoresController.php ? C'est lui qui récupère les infos puis utilise votre modèle pour se sauvegarder. Vous pouvez rajouter cela dans un foreEach qui boucle sur toutes vos langues (je crois qu'on peut procéder comme ça) : foreach ($languages as $lang) { $wysiwyg1[$lang['id_lang']] = Tools::getValue('wysiwyg1_'.$lang['id_lang']); etc... } Et cela pour tous vos champs. Après pour debugger ça je vous conseillerai de faire des var_dump de votre formulaire à différents endroits, pour être sûr que les données sont bien envoyées, vous pouvez commencer dans justement cette fonction postProcess, en affichant ce que vous êtes sensés récupérer. 1 Link to comment Share on other sites More sharing options...
PrestashopUser03 Posted September 2, 2019 Author Share Posted September 2, 2019 Bonjour et merci beaucoup pour votre réponse, Je n'avais pas du tout touché à la fonction postProcess, j'ai fait un var_dump de $_POST, et tous mes champs personnalisés y sont par langages (wysiwyg1_1 à wysiwyg1_7). Il y a bien une variable déjà existante $langs mais elle correspond à ça : $langs = Language::getLanguages(false) donc à quoi correspond la variable $languages dans votre bout de code? Link to comment Share on other sites More sharing options...
Traineau Posted September 2, 2019 Share Posted September 2, 2019 Bonjour, ma variable languages correspondait bien à cela, vous pouvez modifier le for each pour boucler sur votre variable $langs, je l'avais juste nommé différemment Link to comment Share on other sites More sharing options...
PrestashopUser03 Posted September 2, 2019 Author Share Posted September 2, 2019 (edited) La variable $langs ne récupère quasi aucune information, id_lang, name, active, iso_code, language_code, locale, date_format_lite, date_format_full, is_rtl, id_shop, shops. Aucune des informations du type hours, note ou autre champ (personnalisé ou non) n'apparait. Toutes les informations apparaissent dans $_POST par contre. J'ai bien ajouté 'lang'=true dans la class ($definition) et dans le controller (function renderform fields_form). Edited September 2, 2019 by PrestashopUser03 (see edit history) Link to comment Share on other sites More sharing options...
Traineau Posted September 2, 2019 Share Posted September 2, 2019 Oui elle récupère bien id_lang, c'est normalement de ça dont vous avez pour récupérer les champs multilingues. Si votre champ wysiwyg est sensé contenir 7 valeurs pour 7 langues différentes, il vous faut bien les récupérer, d'ou le fait de boucler sur $langs pour stocker toutes vos valeurs en fonction de id_lang comme je l'ai fait dans mon code plus haut, pour obtenir au final quelque chose du style : $wysiwyg1[$lang['1']] = "Une valeur" $wysiwyg1[$lang['2']] = "Une autre valeur" etc.. C'est personnellement comme ça que je procède, mais si vous récupérez déjà toutes vos valeurs dans POST, le problème doit venir d'ailleurs et je ne vois pas trop où 😕. Vous avez bien mis lang => true dans les définitions de vos données ? 1 Link to comment Share on other sites More sharing options...
PrestashopUser03 Posted September 2, 2019 Author Share Posted September 2, 2019 (edited) Oui tout à fait, voilà ce que j'ai fait : 'wysiwyg1'=>array('type'=>self::TYPE_HTML, 'validate'=>'isString', 'lang'=>true), 'wysiwyg2'=>array('type'=>self::TYPE_HTML, 'validate'=>'isString', 'lang'=>true), 'payments'=>array('type'=>self::TYPE_STRING, 'validate'=>'isString', 'lang'=>true), 'url_rewrite'=>array('type'=>self::TYPE_STRING, 'validate'=>'isString', 'lang'=>true), et dans le AdminStoreController: array( 'type' => 'textarea', 'label' => $this->trans('wysiwyg1', array(), 'Admin.Global'), 'name' => 'wysiwyg1', 'lang' => true, 'autoload_rte'=>true, ), array( 'type' => 'textarea', 'label' => $this->trans('wysiwyg2', array(), 'Admin.Global'), 'name' => 'wysiwyg2', 'lang' => true, 'autoload_rte'=>true, ), array( 'type' => 'text', 'label' => $this->trans('payments', array(), 'Admin.Global'), 'name' => 'payments', 'lang' => true, ), array( 'type' => 'text', 'label' => $this->trans('url_rewrite', array(), 'Admin.Global'), 'name' => 'url_rewrite', 'lang' => true, ), Savez-vous pourquoi ça n'apparaît pas dans $lang (note n'apparait pas non plus dedans d'ailleurs). Edited September 2, 2019 by PrestashopUser03 (see edit history) Link to comment Share on other sites More sharing options...
PrestashopUser03 Posted September 2, 2019 Author Share Posted September 2, 2019 Finalement, ça marche, j'ai créé une variable $languages = Language::getLanguages(); (la précédente était $langs=Language::getLanguages(false)) Tout fonctionne parfaitement du coup. Merci beaucoup pour votre aide. Link to comment Share on other sites More sharing options...
Traineau Posted September 2, 2019 Share Posted September 2, 2019 Super ! N'hésite pas à mettre en résolu et à liker la réponse qui t'as aidé, bonne continuation ! 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