Jump to content

[Résolu] Comment obtenir id_customer en override ?


cybermad
 Share

Recommended Posts

Bonjour,

J'ai fait un override classique "la classe AdminCustomersController étend AdminCustomersControllerCore" qui ajoute n'importe quelle colonne, qui contient un lien. Le lien a besoin de l'id_customer pour fonctionner mais je ne sais pas comment l'obtenir. J'ai tourner le truc dans tous les sens depuis hier ...

L'élément "contexte" ne fonctionne pas. C'est tout ce dont j'ai besoin. Juste récupérer customer_id ...



    



     
    
 
             
                  
                  
                  
                  
                     
                  
            
        
           

        
    

Prestashop 1.7.3

Merci de votre aide.

Edited by cybermad (see edit history)

Share this post


Link to post
Share on other sites

Salut,

Dans ton field list tu fais un callback

$this->fields_list = array_merge($this->fields_list, array(
            'abonnement' => array(
                'title' => $this->trans('Abonnement', array(), 'Admin.Global'),
                'maxlength' => 30,
                'orderby' => false,
                'search' => false,
                'callback' => 'printLink',
            )
        )
        );

ensuite tu ajoutes une fonction printLink exemple (a modifier pour ton cas)

public function printLink($value, $tr)
    {
        return '<a href="' . $this->context->link->getAdminLink('AdminCustomers') . '&id_customer=' .
            $tr['id_customer'] . '&viewcustomer">' . $value . '</a>';
    }

cdt

Edited by Alexandre Carette (see edit history)
  • Like 1

Share this post


Link to post
Share on other sites

 Bonjour @cybermad,

De ce que j'ai compris, vous avez installé un module d'abonnement ou vous en avez créé un puisque AdminMemberPlanDetail n'est pas un controlleur natif de PrestaShop.
Je vais supposer que le module fonctionne bien et que la requête SQL respecte le schéma de la table ps_member_plan_detail.

En effet, il n'est pas possible de prendre directement l'id du customer pour la mettre dans l’attribut prefix.
Les valeurs des colonnes sont remplies automatiquement par PrestaShop qui se sert du résultat de la requête SQL.

Mais j'ai un peu cherché et il existe un moyen de se servir des valeurs des autres colonnes, ici de la colonne ID : c'est l'attribut callback.
Voici le code pour la fields_list :

        $this->fields_list = array_merge($this->fields_list, array(
            'abonnement' => array(
                'title' => $this->trans('Abonnement', array(), 'Admin.Global'),
                'orderby' => false,
                'search' => false,
                'callback' => 'getMemberPlanLink'
            )
        ));

Et voilà le code pour la fonction getMemberPlanLink qui va remplir la colonne abonnement :

    public function getMemberPlanLink($value, $row)
    {
        $link = $this->context->link->getAdminLink('AdminMemberPlanDetail').'&id_customer='.(int)$row['id_customer'];
        return '<a href="'.$link.'">' . $value . '</a>';
    }

Source : https://stackoverflow.com/questions/41523298/prestashop-add-column-with-link-to-an-order-in-backoffice

Notez que j'ai supprimé l'attribut max_length.
En effet, mettre un lien n'est pas vraiment prévu par le système, donc quand on dépasse le nombre de caractères maximal, on obtient ceci dans le HTML de la colonne :

<span title="<a href=" http:="" localhost="" prestashop1710="" adminbo="" index.php?controller="AdminMemberPlanDetail&amp;token=61eef3148aeb68ef1e95201c8ea04663&amp;id_customer=2&quot;">3"&gt;
  <a...< span="">
  </a...<>
</span>

En gros, le système englobe la colonne d'un span avec sa valeur dans l'attribut title. Donc avec du HTML, ça fait vite n'importe quoi...

 

Pour aller plus loin...

• Je ne doute pas du fait que vous avez fait des recherches pour résoudre votre problème, mais n'hésitez pas à les pousser au maximum.
Il y a beaucoup de ressources pour la programmation, sûrement plus que dans n'importe quel domaine.
Pour résoudre votre problème, j'ai cherché : add link to column prestashop

• Plutôt que d'utiliser le mécanisme d'override, je vous conseille de créer un module.
Voici la documentation officielle : https://devdocs.prestashop.com/1.7/modules/
Et pour résoudre votre situation dans un module : https://webkul.com/blog/how-to-modify-fields-list-in-prestashop/ (en utilisant par-dessus l'attribut callback)

 

Bonne programmation !
Kaudaj.

 

EDIT : Trop lent, @Alexandre Carette a tout bon ! A part peut-être le maxlength du coup :P

Edited by Kaudaj (see edit history)
  • Like 1

Share this post


Link to post
Share on other sites

Merci beaucoup à vous deux et surtout à toi, Alexandre, et surtout à toi Kaudaj !!!

J'ai vraiment passé plus de 5h juste sur comment résoudre ce problème mais je ne suis pas un pro de prestashop et encore moins la 1.7

J'ai fait beaucoup d'intervention sur un site mais là j'ai complètement séché et je n'ai passé du tout pensé à "printLink" sur callback. Dans mon idée je pouvais récupérer la variable context jusque je suis en override de l'admin qui affiche les clients.

Pour compléter vos excellents liens je me permets d'en ajouter un qui m'a permis également d'avancer sur le début du problème (non cité car résolu):
https://www.h-hennes.fr/blog/2018/04/13/prestashop-modifier-les-listings-dans-ladministration/
(je ne connais pas spécialement ce site ni l'auteur, mais l'affichage en ex des groupes m'a bien aidé).

Merci à vous tous pour votre précieuse aide.

  • Like 1

Share this post


Link to post
Share on other sites

19 hours ago, cybermad said:

Dans mon idée je pouvais récupérer la variable context jusque je suis en override de l'admin qui affiche les clients.

Je pense qu'il y a une erreur de compréhension.
Enfaite, la classe Context contient toutes les informations du contexte actuel. Il contient par exemple l'utilisateur connecté, son panier actuel, sa langue, le controller courant, etc. Donc rien à voir avec la liste des clients !

19 hours ago, cybermad said:

Pour compléter vos excellents liens je me permets d'en ajouter un qui m'a permis également d'avancer sur le début du problème (non cité car résolu):
https://www.h-hennes.fr/blog/2018/04/13/prestashop-modifier-les-listings-dans-ladministration/
(je ne connais pas spécialement ce site ni l'auteur, mais l'affichage en ex des groupes m'a bien aidé).

Très bonne source !
Je ne connais pas personnellement l'auteur, mais beaucoup de ses tutos m'ont aidé aussi. Tu noteras qu'il passe par un module comme je te l'ai conseillé. 😉
Bon, après si c'est pour une seule boutique, l'override ça se vaut. Mais, sans faire la morale, faut juste garder en tête que c'est pas très propre et qu'il y a mieux pour le jour où tu voudras le réutiliser. Allez, un dernier lien pour la route 😁 : https://devdocs.prestashop.com/1.7/modules/concepts/overrides/

Content d'avoir pu aidé en tout cas, à bientôt !
Kaudaj.

Share this post


Link to post
Share on other sites

Merci pour les compléments Kaudaj.
Oui je suis sur que je manque d'information au sujet de context. Mais comme elle est présente dans AdminCustomersController.php qui établi bien la liste des clients...:

image.png.37dbf6ea091bbf207fa5f33265e1a8f4.png

Notamment "gender", etc... et que justement id_customer est présent, je pensais qu'on pouvait le récupérer.

+1 pour le module aussi. Je sais que tu as raison mais ce n'est QUE pour 1 site.

En tout cas mon problème a été résolu grâce à vos réponses conjointes,  merci et bonne année 😉

  • Like 1

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