misterpatate Posted April 30, 2013 Share Posted April 30, 2013 (edited) Bonjour à tous, j'essais de créer un nouveau champs dans mon profil utilisateur et pour cela je souhaiterais surcharger la classe Customer et modifier cette nouvelle variable dans l'interface d'admin. Je précise que je suis sous prestashop 1.5.4.0 voila comment j'ai procédé : J'ai créer une classe Customer.php dans /prestashop/override/classes/Customer.php class Customer extends CustomerCore { public $new_variable; public function __construct() { Customer::$definition['fields']['new_variable'] = array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'); parent::__construct(); } } et le fichier : AdminCustomersController.php dans /prestashop/override/controllers/admin/AdminCustomersController.php class AdminCustomersController extends AdminCustomersControllerCore { public function __construct() { parent::__construct(); $this->fields_list['new_variable'] = array( 'title' => $this->l('ma nouvelle variable'), 'align' => 'center', 'width' => 20 ); } public function renderForm() { parent::renderForm(); $this->fields_form['input'][] = array( 'type' => 'text', 'label' => $this->l('ma nouvelle variable'), 'name' => 'new_variable', 'required' => false ); } } J'ai créer manuelement le champs dans la table customer lorsque je vais sur la liste des clients j'ai bien ma nouvelle variable dans le tableau mais lorsque je sélectionne un client j'ai le cadre rouge avec l'erreur "Objet impossible à charger (introuvable)" mais je ne sais pas trop de quel objet il s'agit. J'avous tourner en rond depuis un moment et je bloque un peu Edited May 2, 2013 by misterpatate (see edit history) Link to comment Share on other sites More sharing options...
misterpatate Posted April 30, 2013 Author Share Posted April 30, 2013 Bon j'ai avancé sur le problème mais pas encore entièrement le code du Customer.php n'étais pas entièrement exact ca à l'air de mieux fonctionner avec ceci : class Customer extends CustomerCore { public $new_variable; public function __construct($id = null) { Customer::$definition['fields']['new_variable'] = array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'); parent::__construct($id); } } et avec le code suivent dans AdminCustomersController.php j'arrive à voir uniquement mon nouveau champs dans l'edition d'un client (ce qui n'est pas très pratique vous en conviendrez...) class AdminCustomersController extends AdminCustomersControllerCore { public function __construct() { parent::__construct(); $this->fields_list['new_variable'] = array( 'title' => $this->l('ma nouvelle variable'), 'align' => 'center', 'width' => 20 ); } public function renderForm() { $this->fields_form['input'][] = array( 'type' => 'text', 'label' => $this->l('ma nouvelle variable'), 'name' => 'new_variable', 'required' => false, 'size' => 20 ); return AdminControllerCore::renderForm(); } } Il doit y avoir une technique pour ajouter le champs input de ma nouvelle variable dans le tableau fields_form mais je ne la trouve pas. Sachant que j'essais d'éviter dans la mesure du possible de recopier tout le code de la fonction renderForm() de la classe AdminCustomersControllerCore pour éviter les mauvaises surprises en cas de mise à jour. Link to comment Share on other sites More sharing options...
misterpatate Posted May 2, 2013 Author Share Posted May 2, 2013 Bon j'ai finis par craquer et résolus mon problème avec une solution que je trouve un peu crade, mais je ne vois pas vraiment d'autre solution : class AdminCustomersController extends AdminCustomersControllerCore { public function __construct() { parent::__construct(); $this->fields_list['new_variable'] = array( 'title' => $this->l('ma nouvelle variable'), 'align' => 'center', 'width' => 20 ); } public function renderForm() { /* copie de tout le code de la fonction AdminCustomersControllerCore::renderForm() */ /*...... */ // return parent::renderForm(); /* ajout de la nouvelle variable */ $this->fields_form['input'][] = array( 'type' => 'text', 'label' => $this->l('ma nouvelle variable'), 'name' => 'new_variable', 'required' => false, 'size' => 20 ); return AdminController::renderForm(); } } Si quelqu'un connais une meilleure solution qui ne mette pas en péril le site à chaque mise à jour je suis preneur. Link to comment Share on other sites More sharing options...
coeos.pro Posted May 2, 2013 Share Posted May 2, 2013 As tu essayé d'utiliser parent::renderForm(): pour récupérer $this->fields_form existant ? Link to comment Share on other sites More sharing options...
misterpatate Posted May 2, 2013 Author Share Posted May 2, 2013 As tu essayé d'utiliser parent::renderForm(): pour récupérer $this->fields_form existant ? Oui et de mémoire le problème étais que le tableau est bien créé mais à la fin de la fonction elle retourne le résultat au template sans rendre la main à la fonction surchargée à cause du " return parent::renderForm();" du coup ca affiche la page sans qu'on ai la possibilité de rajouter quoi que ce soit. J'ai aussi éssayé de mettre la fonction après avoir initialisé mes données dans $this->fields_form mais elles sembles être écrasés. Link to comment Share on other sites More sharing options...
Samy_R Posted May 2, 2013 Share Posted May 2, 2013 Et si tu essaies un AdminController::renderForm() au lieu de faire parent::renderForm ? (tout ça en repompant le code de renderForm() du controleur que tu overrides) Link to comment Share on other sites More sharing options...
misterpatate Posted May 2, 2013 Author Share Posted May 2, 2013 (edited) merci Samy, ton message m'a permis de mettre la tête dans la classe AdminController qui contient un tout petit commentaire qui résout tout par magie donc la réponse exacte et propre est la suivante : class AdminCustomersController extends AdminCustomersControllerCore { public function __construct() { parent::__construct(); $this->fields_list['new_variable'] = array( 'title' => $this->l('Ma nouvelle variable'), 'align' => 'center', 'width' => 20 ); } public function renderForm() { $this->fields_form_override = array( 'type' => 'text', 'label' => $this->l('Ma nouvelle variable'), 'name' => 'new_variable', 'required' => false, 'size' => 20 ); return parent::renderForm(); } } le tableau fields_form_override est juste ajouté à fields_form par la fonction renderForm() de la classe AdminControler. Edited May 2, 2013 by misterpatate (see edit history) 2 Link to comment Share on other sites More sharing options...
Cyril_Foxlab Posted March 10, 2014 Share Posted March 10, 2014 Grand merci a toi misterpapttate ça faisait un moment que je me mangeait le cerveau pour savoir comment implémenter ce array ! Link to comment Share on other sites More sharing options...
Toinou_74 Posted January 21, 2016 Share Posted January 21, 2016 Bonjour, J'ai fais exactement la meme chose, mais impossible d'inscrire la valeur tapé en Db, auriez vous une idée? Merci Link to comment Share on other sites More sharing options...
JoeSatriani Posted May 26, 2016 Share Posted May 26, 2016 Misterpatate je t'aime, merci beaucoup pour ta solution, j'étais au bout de ma vie... Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 Salut à tous, cette solution fonctionne-t-elle sous Prestashop 1.6.1.5? J'ai suivi à la lettre le tuto mais ça a l'air de pas fonctionner, merci pour toute réponse. Link to comment Share on other sites More sharing options...
Toinou_74 Posted July 2, 2016 Share Posted July 2, 2016 Bonjour, je peux t'aider, tu cherches a faire quoi? Antoine http://atelier-abz.fr Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 Je cherche à rajouter un champ dans le back et le front office, j'ai rajouté le champ en baes de données jusque là pas de problème, ce champ rajouté est un booléen, j'aurai pu toucher le Core de Prestashop là tout marche, mais cette fois je veux le faire proprement. Je veux rajouter ce champ surtout important dans le backoffice pour permettre aux commerciaux d'activer ou pas un type de profil sur le site, l'activation est toujours manuelle pour la première fois, mais ce champ doit être également visible dans le front en readonly, j'ai customizé la classe Product en overridant sans problème tout marche, mais là je suis tombé sur ce tuto pour faire pareil avec la classe Customer mais je vois pas le champ que j'ai rajouté. Merci en core pour toute aide. Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 Ah si le champ est rajouté en backoffice sur la liste du render_form, c'est juste au niveau du constructeur où ça coince. J'ai oublié quelque chose? Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 J'ai dit une bétise c'est dans le renderForm() qu'il l'affiche pas.Merci Link to comment Share on other sites More sharing options...
Toinou_74 Posted July 2, 2016 Share Posted July 2, 2016 Salut, Oui effectivement, moi j'ai le meme probleme, donc j'ai overridé AdminCustomer, sauf le constructeur... Impossible.. et pourant j'ai fais un enorme boulot sur prestashop. Une gestion Commercial si ca t'interesse d'ailleur, mais impossble d'overrider correctement AdminCustomer. le mieux je pense, pour toi, c'est de copier coller tout adminCustomer dans l'override et de le modifier comme tu veux... Ps: tu peux me contacter par telephone mon numero est sur mon site. Antoine http://atelier-abz.fr Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 Merci Antoine, je prends AdminCustomersController et je recrée une autre classe de cette manière dans l'override : class AdminCustomersController extends AdminCustomersControllerCore C'est bien ça? Merci pour toute réponse comme ça je passe cette étape. Link to comment Share on other sites More sharing options...
Toinou_74 Posted July 2, 2016 Share Posted July 2, 2016 class AdminCustomersControllerCore extends AdminController et apres tu ajouts ce que tu veux comme modifs Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 Merci pour tout, je vais le faire Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 J'ai réussi ça marche, également j'ai modifié le constructeur. Merci encore, en tout cas je le vois sur le back office. Reste à savoir si y a pas de soucis. Link to comment Share on other sites More sharing options...
Toinou_74 Posted July 2, 2016 Share Posted July 2, 2016 Super... N"hésite pas, meme pour autre question.... Antoine http://atelier-abz.fr Link to comment Share on other sites More sharing options...
2mdee Posted July 2, 2016 Share Posted July 2, 2016 Salut Antoine, tu as eu à tester le module All in one rewards, j'aimerai récupérer le code client qu'il génère car il n'est pas stocké , il est calculé, comment faire? 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