Jump to content

Champs personnalisés stores : "Une erreur s'est produite pendant la mise à jour de l'objet. <b>store</b> (Unknown column 'wysiwyg1' in 'field list') "


Recommended Posts

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

image.thumb.png.57f165121b4406c6be8c0a358827d07e.png

 

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

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.

  • Like 1
Link to comment
Share on other sites

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

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 by PrestashopUser03 (see edit history)
Link to comment
Share on other sites

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 ?

  • Like 1
Link to comment
Share on other sites

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 by PrestashopUser03 (see edit history)
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...