Jump to content

[RESOLU] override de Customer et AdminCustomersController


Recommended Posts

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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)

Share this post


Link to post
Share on other sites

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 by misterpatate (see edit history)
  • Like 2

Share this post


Link to post
Share on other sites

  • 10 months later...
  • 1 year later...
  • 4 months later...
  • 1 month later...

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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?

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
 Share

×
×
  • Create New...

Important Information

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