Jump to content

Nouvelle colonne dans la liste des clients ou nouveau champ dans la fiche client


Recommended Posts

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:

form_customer.png.f4cef748c0d58d178d5b8f13666642a1.png

 

Je voudrais ajouter une nouvelle colonne à la liste des clients ou nouveau champ dans la fiche client

customer_list.thumb.png.d9c1338ee0b5751552ce25e362af1764.png

editionCustomer.png.7073e29d43fb435c4b56cdb0695a1f90.png

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 by jat (see edit history)
Link to comment
Share on other sites

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.

editionCustomer.png.7073e29d43fb435c4b56cdb0695a1f90.png

 

Vous avez des idées ou des pistes ? 😀

Edited by jat
change réponse, personne aide pas (see edit history)
Link to comment
Share on other sites

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 by Rpa37 (see edit history)
Link to comment
Share on other sites

  • 1 year later...

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

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 by Shapes (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...
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 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

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

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/

  • Like 1
Link to comment
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
×
×
  • Create New...