jat Posted October 1, 2020 Share Posted October 1, 2020 (edited) Bonjour à toutes et à tous, J'ai modifié mon formulaire de inscription de client, pour déterminer le type de client, professionnel ou particulier. J'ai créé la colonne status_customer dans la table ps_customer. J'ai également créé un override de classes/Customer.php et classes/form/CustomerFormatter.php. Enregistrez et modifiez correctement dans le Frontend. Résultat: Je voudrais ajouter une nouvelle colonne à la liste des clients ou nouveau champ dans la fiche client J'ai consulté différents guides, mais je n'arrive pas. Guides: https://devdocs.prestashop.com/1.7/modules/sample-modules/grid-and-identifiable-object-form-hooks-usage/#adding-new-column-to-customers-grid https://www.h-hennes.fr/blog/2018/04/13/prestashop-modifier-les-listings-dans-ladministration/ Quelqu'un d'autre a-t-il fait la même chose ou avez-vous une idée ? Merci beaucoup. PS Version 1.7.6.7 Edited October 2, 2020 by jat (see edit history) Link to comment Share on other sites More sharing options...
jat Posted October 5, 2020 Author Share Posted October 5, 2020 (edited) Coucou 😄 J'ai créé un module, qui ajoute cette colonne et les filtres correspondants lien : CQRS dans Prestashop et https://devdocs.prestashop.com/1.7/development/architecture/domain/cqrs/ Je dois encore modifier l'édition client dans le back-office, pour pouvoir modifier le status_customer. Vous avez des idées ou des pistes ? 😀 Edited October 6, 2020 by jat change réponse, personne aide pas (see edit history) Link to comment Share on other sites More sharing options...
Rpa37 Posted October 6, 2020 Share Posted October 6, 2020 (edited) Bonjour, Je suis un peu dans la même situation : J'ai réussi avec des champs TypeText en m'inspirant du code du module: ps_customercedula (mise à jour de Customer, de CustomerFormatter et ajout du module ps_customercedula) mais j'ai des difficultés pour gérer une liste de choix dans le formulaire d'inscription PS1.7.6 Si quelqu'un a une idée, merci par avance Cordialement Edited October 6, 2020 by Rpa37 (see edit history) Link to comment Share on other sites More sharing options...
Shapes Posted May 4, 2022 Share Posted May 4, 2022 Bonjour, Je suis un peu dans la même situation. J'ai créé un module pour un ajouter extra field au client. Le formulaire côté client fonctionne bien, le formulaire admin aussi. Je coince quand il s'agit d'afficher le résultat dans la liste des clients : public function hookActionCustomerGridDefinitionModifier(array $params) { $definition = $params['definition']; $definition ->getColumns() ->addAfter( 'email', (new DataColumn('referrer')) ->setName($this->trans('Referrer', [], 'Modules.Mymodule.Admin')) ->setOptions([ 'field' => 'referrer', ]) ); } Pour tester j'ai essayé avec : public function hookActionCustomerGridDefinitionModifier(array $params) { $definition = $params['definition']; $definition ->getColumns() ->addAfter( 'email', (new DataColumn('referrer')) ->setName($this->trans('Referrer', [], 'Modules.Mymodule.Admin')) ->setOptions([ 'field' => 'lastname', ]) ); } Et là ça fonctionne bien. Peut-être une erreur dans mon override de Customer.php.. ? <?php class Customer extends CustomerCore { public $referrer; public function __construct($id = null) { self::$definition['fields']['referrer'] = array('type' => self::TYPE_STRING, 'validate' => 'isGenericName'); parent::__construct($id); } } Toute idée serait la bienvenue ici, merci.. Link to comment Share on other sites More sharing options...
Shapes Posted May 4, 2022 Share Posted May 4, 2022 (edited) OK, au cas où ça pourrait aider quelqu'un, j'avais tout simplement oublié d'ajouter la fonction pour récupérer la data : public function hookActionCustomerGridQueryBuilderModifier(array $params) { $searchQueryBuilder = $params['search_query_builder']; $searchQueryBuilder->addSelect( 'c.`referrer`' ); } C'est OK maintenant. Et si je complète cette fonction : public function hookActionCustomerGridQueryBuilderModifier(array $params) { $searchQueryBuilder = $params['search_query_builder']; $searchCriteria = $params['search_criteria']; $searchQueryBuilder->addSelect( 'c.`referrer`' ); if ('referrer' === $searchCriteria->getOrderBy()) { $searchQueryBuilder->orderBy('c.`referrer`', $searchCriteria->getOrderWay()); } foreach ($searchCriteria->getFilters() as $filterName => $filterValue) { if ('referrer' === $searchCriteria->getOrderBy()) { $searchQueryBuilder->orderBy('c.`referrer`', $searchCriteria->getOrderWay()); } if ($filterName === 'referrer') { $searchQueryBuilder->andWhere("c.`referrer` = :referrer"); $searchQueryBuilder->setParameter('referrer', $filterValue); } } } La recherche fonctionne aussi ! Edited May 4, 2022 by Shapes (see edit history) 1 Link to comment Share on other sites More sharing options...
Shonen Posted May 17, 2022 Share Posted May 17, 2022 (edited) On 5/4/2022 at 5:35 PM, Shapes said: OK, au cas où ça pourrait aider quelqu'un, j'avais tout simplement oublié d'ajouter la fonction pour récupérer la data : public function hookActionCustomerGridQueryBuilderModifier(array $params) { $searchQueryBuilder = $params['search_query_builder']; $searchQueryBuilder->addSelect( 'c.`referrer`' ); } C'est OK maintenant. Et si je complète cette fonction : public function hookActionCustomerGridQueryBuilderModifier(array $params) { $searchQueryBuilder = $params['search_query_builder']; $searchCriteria = $params['search_criteria']; $searchQueryBuilder->addSelect( 'c.`referrer`' ); if ('referrer' === $searchCriteria->getOrderBy()) { $searchQueryBuilder->orderBy('c.`referrer`', $searchCriteria->getOrderWay()); } foreach ($searchCriteria->getFilters() as $filterName => $filterValue) { if ('referrer' === $searchCriteria->getOrderBy()) { $searchQueryBuilder->orderBy('c.`referrer`', $searchCriteria->getOrderWay()); } if ($filterName === 'referrer') { $searchQueryBuilder->andWhere("c.`referrer` = :referrer"); $searchQueryBuilder->setParameter('referrer', $filterValue); } } } La recherche fonctionne aussi ! Merci c'est ce qu'il me manquait aussi ! J'ai comme toi créé une nouvelle variable pour mon Customer. J'ai l'override de la classe, la modif de la Grid, et l'update qui fonctionne. J'ai toutefois un souci dont tu auras probablement la solution ! Je n'arrive pas à afficher la valeur de mon objet sur la fiche Customer, alors que ça fonctionne sur la Grille. L'édition fonctionne aussi, il me manque seulement l'affichage de la valeur actuelle (si non vide). Ci-après ma fonction qui incrémente la ficher Customer public function hookActionCustomerFormBuilderModifier(array $params) { //Récupération du form builder /** @var \Symfony\Component\Form\FormBuilder $formBuilder */ $formBuilder = $params['form_builder']; //Ajout de notre champ spécifique $formBuilder->add('new_value', //Cf génériques symonfy https://symfony.com/doc/current/reference/forms/types.html // et spécificiques prestashop https://devdocs.prestashop.com/1.7/development/components/form/types-reference/ \Symfony\Component\Form\Extension\Core\Type\TextType::class, [ 'label' => $this->l('New Value'), //Label du champ 'required' => false, //Requis ou non 'constraints' => [ //Contraintes du champs //cf. génériques symfony : https://symfony.com/doc/current/reference/constraints.html // Ou vous pouvez écrire la votre cf. https://symfony.com/doc/current/validation/custom_constraint.html new \Symfony\Component\Validator\Constraints\Length([ 'max' => 50, 'maxMessage' => $this->l('Max characters allowed : 50'), ]), ], // Texte d'aide 'help' => $this->l('My new value') ] ); //Ou surchargée ici // $params['data']['new_value'] = $params['data']['new_value']; //Il faut bien penser à mettre cette ligne pour mettre à jour les données au formulaire $formBuilder->setData($params['data']); } Edited May 17, 2022 by Shonen Souci de filtre résolu https://webkul.com/blog/adding-a-new-column-in-prestashop-new-symfony-admin-controller-grid-page-with-module/ (see edit history) Link to comment Share on other sites More sharing options...
Shonen Posted May 18, 2022 Share Posted May 18, 2022 Je me répond à moi même et aux autres qui auraient besoin. J'ai résolu mon problème en créant un getter pour ma nouvelle variable, et en instanciant mon champs avec ce getter. Et surtout récupérer l'ID en cours avec $params['id']. private function getNewvalue($customerId) { $db = \Db::getInstance(); $request = "SELECT `new_value` FROM `". _DB_PREFIX_ ."customer` where `id_customer` = ".$customerId; return $db->getValue($request); } public function hookActionCustomerFormBuilderModifier(array $params) { //Récupération du form builder /** @var \Symfony\Component\Form\FormBuilder $formBuilder */ $formBuilder = $params['form_builder']; $customerId = $params['id']; //Ajout de notre champ spécifique $formBuilder->add('new_value', //Cf génériques symonfy https://symfony.com/doc/current/reference/forms/types.html // et spécificiques prestashop https://devdocs.prestashop.com/1.7/development/components/form/types-reference/ \Symfony\Component\Form\Extension\Core\Type\TextType::class, [ 'label' => $this->l('New Value'), //Label du champ 'required' => false, //Requis ou non 'constraints' => [ //Contraintes du champs //cf. génériques symfony : https://symfony.com/doc/current/reference/constraints.html // Ou vous pouvez écrire la votre cf. https://symfony.com/doc/current/validation/custom_constraint.html new \Symfony\Component\Validator\Constraints\Length([ 'max' => 50, 'maxMessage' => $this->l('Max characters allowed : 50'), ]), ], // Texte d'aide 'help' => $this->l('My new value') ] ); //Ou surchargée ici $params['data']['new_value'] = $this->getNewvalue($customerId); //Il faut bien penser à mettre cette ligne pour mettre à jour les données au formulaire $formBuilder->setData($params['data']); } Link to comment Share on other sites More sharing options...
Janett Posted May 18, 2022 Share Posted May 18, 2022 14 minutes ago, Shonen said: private function getNewvalue($customerId) { $db = \Db::getInstance(); $request = "SELECT `new_value` FROM `". _DB_PREFIX_ ."customer` where `id_customer` = ".$customerId; return $db->getValue($request); } Ce n’est pas recommandé d’ajouter de nouveaux champs dans les tables natives de la base de données, il vaut mieux créer une table additionnel pour stocker tes données avec une clé étrangère id_customer. https://devdocs.prestashop.com/1.7/modules/creation/good-practices/ 1 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