Surcharge d'une entité dans Prestashop et affichage côté admin
J'ai du récemment surcharger une des classes de base de Prestashop, la classe Customer, pour y ajouter de nouveaux champs (du type "comment vous nous avez connu") Il fallait en plus que ces nouveaux champs soient visibles dans le backoffice.
Après beaucoup de tâtonnements, voilà comment j'ai procédé :
- mise à jour de la base de données avec les nouveaux champs - dans mon cas, j'ai modifié la table ps_customer
- surcharge de la classe Customer dans le dossier override/classes. Pour cela, créer une classe Customer qui étend la classe Customer de base (CustomerCore). On ajoute les champs manquants et la fonction construct. Dans cette fonction, pour chaque champ, on met la définition suivante : Customer::$definition['fiels']['nom_du_champ'] = array('type' => le_type_a_voir_dans_la_doc, ... ) Les ... dépendent du type de champ que vous ajoutez, il suffit de prendre modèle sur ceux de base. On n'oublie pas de finir le construct par un appel à la fonction du parent : parent::construct() . _Attention, écrivant mon texte en markdown, je n'ai pas respecté la syntaxe de PHP, il faut deux avant construct !__
- surcharge du contrôleur AuthController - sans trop entrer dans le détail, il faut mettre la fonction processSubmitAccount() (création d'un nouveau compte), recopier celle de Prestashop et bien penser à ajouter les champs que l'on a créé. Pour ma part, j'ai simplement récupéré les valeurs, récupéré une instance de la connexion à la base de données ($db = Db::getInstance()) et mis à jour le "customer" nouvellement créé avec les nouveaux champs.
- bien penser à créer le template de saisie :), soit dans le répertoire themes/mon_theme, modifier le fichier authentication.tpl pour y intégrer les nouveaux champs
- enfin, pour l'affichage dans le backoffice, il suffit de copier le fichier admin.../themes/default/template/helpers/list/list_content pour le coller dans le dossier override/controllers/admin/templates/customers/helpers/list_content. Ensuite, on modifie ce fichier pour y ajouter éventuellement l'affichage du champ. Dans mon cas, il s'agissait surtout d'afficher la valeur d'un "select" - j'enregistre en base de données un nombre qui correspond à une valeur textuelle (0 = étudiant, 1 = professeur par exemple). En testant sur l'identifiant du champ, je peux forcer l'affichage du texte correspondant à la valeur numérique de la base de données.
J'ai aussi fait d'autres manipulations plus simples, comme créer un nouveau contrôleur. Pour cela, il suffit de l'ajouter directement dans le dossier controller (front ou admin, tout dépend de ce que vous souhaitez faire)