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