Jump to content

Aide pour dev module, employee connection


Recommended Posts

Bonjour,

 

Je dois dans le cadre de mon stage développer un module pour prestashop dont le but est de traquer les connexion des employés.

 

Découvrant à peine aujourd'hui prestashop et ayant suivit le tutoriel présent à cette page :

http://doc.prestashop.com/pages/viewpage.action?pageId=3801216

 

J'ai créé mon premier module et j'ai à peu près compris comment ça fonctionne, par contre je n'ai trouvé nulle part dans la base de donnée (et notamment dans la table employee) une date de dernière connexion. J'ai donc naturellement décidé de créer une nouvelle table associant un id_employee à une date.

 

Je suis maintenant confronté aux problèmes suivants, si vous pouviez me filer un coup de main ça serait vraiment sympa :

 

- comment exécuter une fonction que j'aurai créé (qui aurait pour but de remplir la table créée) lors de la connexion d'un employé ?

 

- comment récupérer dans cette fonction l'id_employee de la personne connectée, est ce qu'il y a une sorte de variable globale gérant l'administrateur connecté en ce moment ou quelque chose y ressemblant ?

 

Merci d'avance :)

Link to comment
Share on other sites

Bonjour,

 

Malheureusement, il n'existe pas de hook lors de la connexion d'un employé.

 

Il existe éventuellement deux possibilités:

  • Premièrement: Ajout d'un override au sein du module qui surchargerait le controller AdminLogin et sa méthode processLogin() pour déclencher le traitement d'une nouvelle insertion en DB.
  • Deuxièmement: Le module se hook sur un hook générique tel que displayBackOfficeHeader et génère cette insertion en n'oubliant pas de créer un cookie spécifique pour ne pas faire un enregistrement à chaque chargement de page.

Me concernant, je prendrais la première option, mais tout dépend la demande.

 

Pour l'employé, on a le contexte qui permet de le récupérer:

$this->context->employee

Link to comment
Share on other sites

Salut et merci beaucoup pour ton aide =)

 

Finalement on m'a demandé aussi de stocker sur quelles pages l'employé est allé, du coup la deuxième solution semble être préférable. Par contre je n'ai pas super bien compris ce que tu as dis, à priori je suis allé dans le dossier admin et en modifiant l'index.php et en lui disant d'afficher un message il l'affiche à chaque changement de page donc à priori je peux intégrer mon code ici qui va rajouter une ligne dans la BdD non ?

Link to comment
Share on other sites

Tu pourrais, tout à fait. Mais tu perdrais la possibilité de faire une mise à jour ou plutôt tu perdrais ce développement si mise à jour il y a.

 

Le plus simple étant de faire en sorte que ton module se greffe au hook cité, et il est donc exécuté à chaque page (et te permet donc en prime de faire ce que tu souhaites).

 

Tu n'as donc pas besoin de cookie, vu que tu auras besoin de faire une insertion pour chaque page vue par l'employée, dans ton cas, finalement.

Link to comment
Share on other sites

Ca ressemblerait donc à ça ?

 

public function install()

{

if (parent::install() == false OR !$this->registerHook('displayBackOfficeHeader'))

return false;

return true;

}

 

public function displayBackOfficeHeader($params)

{

//code de ma fonction exécuté à chaque changement de page dans le back office uniquement

}

 

(pas sur pour ce qu'il y a dans la focntion registerHook)

 

Et avec ça il exécuterait la fonction à chaque changement de page ?

Link to comment
Share on other sites

ça y ressemblerait, oui. Si ce n'est que la méthode pour le hook serait celle-ci:

 

public function hookDisplayBackOfficeHeader($params)
{
//code de ma fonction exécuté à chaque changement de page dans le back office uniquement
}

 

;-)

Link to comment
Share on other sites

Est-ce que tu saurais si il y a un moyen de récupérer quelque chose permettant de savoir sur quelle page on est ? Par exemple le contenu de la balise <title> ? J'ai un peu cherché sur le net et ils proposent de faire un file_get_contents() sur l'url de la page, ce que j'ai fait sauf qu'il m'affiche le formulaire d'authentification vu qu'on est dans la partie back_office et qu'avec la fonction file_get_contents il n'est pas co :/

 

Peut-être une variable dans prestashop qui indiquerait où l'on est ?

Link to comment
Share on other sites

à priori dans $this->context->controller, il y a un attribut "toolbar_title" qui a l'air d'être un tableau représentant le chemin actuel (par exemple pour la page d'administration des employés on a dans le tableau "administration" et "employé" ça serait parfait si j'arriverais à le récupérer mais il est en protected et quand j'affiche son contenu ça ne marche pas du coup

Link to comment
Share on other sites

Il s'agit du breadcrumb, oui.

 

Cela dit, on peut récupérer le controller sur lequel on est et en connaitre son ID d'onglet ((int)Tab::getIdFromClassName($controller))) ; et de là le charger et en connaitre éventuellement son nom.

 

Bon, c'est un peu charabia et vu que je ne suis pas sur le PC direct, du mal à t'écrire le code ;-)

Link to comment
Share on other sites

De toute façon je dois stopper là pour rentrer chez moi ^^ Tu auras accès à ton PC ce soir ? Parce que là j'ai un peu de mal à voir, il suffirait de faire ça :

((int)Tab::getIdFromClassName($controller))) ;

 

Pour récupérer son id et ensuite pour connaitre son nom on fait comment ? ^^ Sinon on peut voir ça quand tu seras devant ton PC je dois quand même rentrer là

Link to comment
Share on other sites

Resalut :)

 

J'ai une nouvelle petite question qui me chagrine et dont je n'arrive pas à trouver la réponse ^^

 

Dans le tutoriel que j'ai suivi ils nous font créer dans le dossier /admin/tabs un fichier php avec une classe AdminTest qui contient une méthode Display qui va afficher donc afficher quelque chose lorsque l'on clique dans l'onglet qu'on a rajouté.

 

Mon problème est le suivant :

Sur cette page AdminTest je fais un tableau avec tous les employés et je voudrais faire un lien vers une nouvelle page sur laquelle je voudrais afficher l'historique de cet employé et je ne vois pas comment créer cette nouvelle page, un peu d'aide siouplait ^^

Link to comment
Share on other sites

De toute façon je dois stopper là pour rentrer chez moi ^^ Tu auras accès à ton PC ce soir ? Parce que là j'ai un peu de mal à voir, il suffirait de faire ça : ((int)Tab::getIdFromClassName($controller))) ; Pour récupérer son id et ensuite pour connaitre son nom on fait comment ? ^^ Sinon on peut voir ça quand tu seras devant ton PC je dois quand même rentrer là

 

Désolé, voici l'extrait de code ;-)

 

public function hookDisplayBackOfficeHeader($params)
{
 $tab = new Tab((int)Tab::getIdFromClassName(Tools::getValue('controller')));
 $tab_name = $tab->name[$this->context->language->id];
}

Link to comment
Share on other sites

Resalut :) J'ai une nouvelle petite question qui me chagrine et dont je n'arrive pas à trouver la réponse ^^ Dans le tutoriel que j'ai suivi ils nous font créer dans le dossier /admin/tabs un fichier php avec une classe AdminTest qui contient une méthode Display qui va afficher donc afficher quelque chose lorsque l'on clique dans l'onglet qu'on a rajouté. Mon problème est le suivant : Sur cette page AdminTest je fais un tableau avec tous les employés et je voudrais faire un lien vers une nouvelle page sur laquelle je voudrais afficher l'historique de cet employé et je ne vois pas comment créer cette nouvelle page, un peu d'aide siouplait ^^

 

Malheureusement, le tutoriel que tu as suivi est pour une version 1.4 et non 1.5, il n'existe plus d'AdminTab mais des AdminControllers et te concernant des ModuleAdminControllers.

 

Je te conseille de voir le module exemple/canvas que je fournis (https://github.com/PrestaEdit/Canvas-Module-Prestashop-15) pour te permettre d'y voir plus clair ou encore ce tuto plus axé 1.5 (http://www.prestarocket.com/blog/creer-module-mvc-prestashop-1-5/). :)

Link to comment
Share on other sites

Merci pour l'extrait de code, je testerais ça après ^^

 

Personnellement j'ai installé la version 1.5 et ce que j'ai créé avec l'adminTab fonctionne bien, enfin j'arrive à afficher des choses quoi, je pense qu'ils l'ont laissé pour une compatibilité avec d'autres modules. Du coup en attendant ta réponse je me suis dit que je n'avais pas forcément besoin d'une nouvelle page, que je pouvais faire ça sur une seule et même page via l'ajax.

 

Je peux rester comme ça avec l'arborescence de l'ancien tutoriel ou je dois tout changer ? :/

Link to comment
Share on other sites

Oui, c'est encore compatible.

 

Béh, écoutes... Si l'idée est un module à utilisation unique (donc pas pour revendre ailleurs) et que c'est fonctionnel, tu peux garder comme c'est ;-).

 

L'idée étant, aussi, que vu que tu effectues un stage d'apprendre et de faire en sorte que l'apprentissage soit le plus complet ;-)

Link to comment
Share on other sites

Ouaip bah je vais laisser comme ça pour le moment et une fois que j'aurais fini je l'adapterais avec ce que tu m'as passé je sais pas si ça va prendre beaucoup de temps ou pas l'adaptation ^^

 

Je vais tester le bout de code que tu m'as filé après manger je te tiens au courant, merci beaucoup pour ton aide à plus tard

Link to comment
Share on other sites

Resalut,

 

j'ai fait :

$controller_name = $this->context->controller->controller_name;

$tab = new Tab((int)Tab::getIdFromClassName(Tools::getValue($controller_name)));

$tab_name = $tab->name[$this->context->language->id];

 

le $controller_name affiche AdminProducts

par contre $tab_name n'affiche rien :/

Link to comment
Share on other sites

Ce qui est "logique".

 

Tu as utilisé une autre méthode (qui n'est pas mal, cela dit) pour le début et le code vient donc:

$controller_name = $this->context->controller->controller_name;
$tab = new Tab((int)Tab::getIdFromClassName($controller_name));
$tab_name = $tab->name[$this->context->language->id];

 

Et là, ça devrait aller ;-)

Link to comment
Share on other sites

ça marche parfaitement bien =) par contre mon maitre de stage vient de me dire qu'en fait il voudrait savoir où la personne gérant le style est allé pour par exemple voir si cette personne a modifié un module. Dans ce code on récupère donc le libellé de l'onglet, on affichera donc dans la BdD "Modules" si j'ai bien suivit. Je suppose que ça n'est pas possible de récupérer le module sur lequel il est (par exemple lorsqu'il clique sur configurer pour un module) ? :/

Link to comment
Share on other sites

Je vais tourner la question autrement: comment PrestaShop fait pour savoir quel module il doit afficher ?

 

Il le fait grâce au paramètre "configure" qui contient le nom du module affiché.

 

Et comment récupère-t-on une variable (en $_POST ou $_GET) dans PrestaShop ? Via l'utilisation de Tools::getValue().

 

Si tu m'as suivi, tu dois pouvoir trouver la réponse à ta question, donc ;-)

Link to comment
Share on other sites

Ouaip je t'ai bien suivi ^^ du coup je regarde si la variable Tools::getValue("configure") est définie (isset ?) et si c'est le cas je la concatène au nom précédemment trouvé et ça donnera un truc du style "Modules-Cheque" et bien du coup c'est parfait c'est exactement ce qu'il voulait je crois. Merci beaucoup je sais pas ce que j'aurais fait sans toi x)

Link to comment
Share on other sites

en fait j'ai besoin de savoir si elle est définie pour rajouter ou non un tiret juste avant, du coup j'ai fait ça :

 

if(isset($_GET["configure"])){

$chaine_a_inserer .= '-' . Tools::getValue("configure");

}

Link to comment
Share on other sites

Me revla (je sais je suis chiant x) )

 

Afin de faciliter le plus possible l'installation du module j'ai rajouté à l'installation (fonction install() ) du module :

-la création de la table dans la Base de données

-la création d'un sous-onglet dans l'onglet Administration

 

Et dans la fonction uninstall() :

-vidage de la table dans la BdD

-suppression de l'onglet rajouté dans Administration

 

Je voudrais savoir si il était possible de rendre encore plus l'installation facilitée et donc de rajouter son positionnement dans le footer (faire l'équivalent du menu Modules->Positions) et de l'enlever dans le cas de la fonction uninstall afin que l'utilisateur n'ait finalement plus rien à faire ^^ ?

Link to comment
Share on other sites

Salut J.Danse,

 

Ayant à peu près fini mon module je me suis intéressé à ton dépôt github pour avoir une version pleinement compatible 1.5.

J'ai téléchargé ton canevas et essayé d'adapter ce que j'avais à ton canevas, au final à priori j'avais pas grand chose à faire si ce n'est déplacer l'ancien fichier que j'avais dans admin/tabs vers le nouveau dossier modules/monmodule/controllers/admin et bien entendu en changeant le extends AdminTab en extends ModuleAdminController.

 

Malheureusement ça ne fonctionne pas j'ai du oublier un truc mais quand j'essaye d'accéder à ma page du back office il me met le message d'erreur suivant :

Le contrôleur adminnotfound est manquant ou non valable.

 

Autrement tout le reste semble fonctionner parfaitement, ma table dans la BdD se crée bien, l'onglet se rajoute au back-office et se positionne tout seul. Le seul soucis maintenant c'est de faire fonctionner le controller admin ^^

Link to comment
Share on other sites

Ouaip bah j'ai essayé un peu toute la journée j'ai même essayé de refaire le tuto à cette page :

http://www.prestarocket.com/blog/creer-module-mvc-prestashop-1-5/

(ou du moins la partie backoffice, vu que de mon côté je n'ai absolument rien du côté du front office)

Et je ne trouve pas de solution à mon problème si ce week-end tu as un peu de temps à me consacrer ça serait vraiment super gentil ^^ j'attend ta réponse avec impatience, merci encore pour ton aide =)

Link to comment
Share on other sites

Je suis rentré du boulot je vais prendre le train pour rentrer chez moi je regarderai ça ce soir ou au pire demain soir. Je te tiens au courant dès que j'ai testé ce que tu as dit, merci ^^

Link to comment
Share on other sites

Salut,

Hello,

 

Il faut voir comment se nomme le controller et, aussi, comment tu l'associes en BDD. Est-ce que tu utilises bien l'ajout dynamique d'un objet Tab comme dans le canvas ? :)

 

le controller est placé dans le dossier controllers/admin/ du dossier de mon module. il se nomme "AdminTrackEmployeeMedialta.php" et commence par la ligne suivante :

class AdminTrackEmployeeMedialta extends ModuleAdminController

 

Le "comment tu l'associes en BdD" je ne sais pas trop c'est quelle partie de ton canevas ça ? Ça se trouve c'est ça que j'ai pas fait qu'il manque :/

 

Et pour le "Est-ce que tu utilises bien l'ajout dynamique d'un objet Tab comme dans le canvas ?" je suppose que tu parles de l'ajout de l'onglet dans le menu d'administration ? J'ai pris le même fonction que j'avais avant qui fonctionnait, je le rajoute au parent ayant l'id 18 (Administration) et ça a l'air de fonctionner vu que l'onglet s'ajoute bien au menu et quand je clique sur l'onlglet et qu'il m'affiche le message d'erreur que je t'ai mis dans mon poste juste avant dans l'url il y a bien la variable GET suivante :

controller=AdminTrackEmployeeMedialta.

Je lui donne la classe AdminTrackEmployeeMedialta qui est la classe du controller, et dans le controller est présent la méthode display() qui affiche tout ce que doit afficher le module lorsque l'on clique sur l'onglet du module, c'est bien ça qu'il faut faire ?

Link to comment
Share on other sites

Il s'agit donc bien de la partie suivante dans le canvas:

$tab = new Tab();
// Need a foreach for the language
$tab->name[$this->context->language->id] = $this->l('Tab Example'-;
$tab->class_name = 'AdminExample';
$tab->id_parent = $parent_tab->id;
$tab->module = $this->name;
$tab->add();

 

La partie qui m’intéresse fortement dans notre cas, c'est ceci: $tab->module = $this->name;

 

Est-ce que l'onglet est bien associé au module ? ;-)

Link to comment
Share on other sites

Ok donc ça devait être ça surement je l'ai rajouté à la main et ça fonctionne bien. Par contre au niveau de l'installation il me dit que le module s'est mal installé, j'ai cette fonction que j'ai faite à partir de ton code : (je ne sais pas trop quoi faire au niveau du langage, je voudrais que le nom soit le même pour tous les langages, est ce que c'est ça qui merdouille ?)

 

public function setTab() {

$tab = new Tab();

// Need a foreach for the language

$tab->name[$this->context->language->id] = $this->l('Employee Tracker');

$tab->class_name = 'AdminTrackEmployeeMedialta';

$tab->id_parent = 18;

$tab->module = $this->name;

$tab->add();

}

Link to comment
Share on other sites

En attendant ta réponse je l'ai rajouté à la main pour voir si l'affichage fonctionnait bien et malheureusement j'ai un autre soucis, une fois que j'avais un affichage mon problème était que j'avais uniquement mon affichage (et donc plus l'interface de prestashop, les menus etc...)

En fait j'avais une méthode Display() dans mon controller qui me faisait tout l'affichage et en regardant les autres modules je me suis rendu compte qu'ils faisaient l'affichage dans le controller. Du coup j'ai copié collé le contenu de ma méthode display() dans mon constructeur et maintenant il m'affiche le contenu de mon module mais avant tout le reste au lieu de le mettre entre le header et le footer :/

Link to comment
Share on other sites

Là, il rajoute pour la langue courante de l'utilisateur en réalité. Il faudrait un foreach, pour remplir l'ensemble des langues existantes. A première vue, sur ce bout de code, je ne vois rien de bien particulier.

 

Oui, le display() retire l'ensemble du reste du contenu ;-)

 

Il faut le mettre dans le renderForm() par exemple ;-)

Link to comment
Share on other sites

Ok en fait pour l'onglet c'était une erreur toute bette, j'avais oublié de return true ou false dans ma fonction setTab();

 

En ce qui concerne ma méthode Display() je l'ai remplacé par un renderForm mais il ne m'affiche pas mon contenu, probablement parce que ce n'est pas un formulaire que je renvoie, en fait je me contente de faire des echo. J'ai essayé la méthode render() tout cours mais à priori ça ne fait rien, il n'y a pas une fonction pour simplement afficher ?

Link to comment
Share on other sites

Et sinon pour ce qui est du langage et de l'onglet je peux faire une requête sur la table ps_lang qui va récupérer tous les id des langues et ensuite pour tous ces id faire

 

$tab->name[id récupéré de la BdD] = $this->l('Employee Tracker');

 

C'est bien ça ? Mais du coup avec cette méthode si plus tard un pack de langage est installé ça ne vas pas planter ?

Link to comment
Share on other sites

Bon ben j'ai fait ce que j'ai dit plus haut pour les langues ça a l'air de fonctionner. Par contre du coup pour ma fonction permettant d'afficher du texte dans mon controller t'as une idée ? ^^

Link to comment
Share on other sites

SAlut,

 

Vraiment désolé de te déranger à nouveau mais est-ce que tu aurais une idée pour afficher du texte dans le controller à la manière du renderForm sauf que ça serait du texte et pas un formulaire (render tout court n'a pas l'air de fonctionner) ? Je stagne pour le moment et je ne trouve pas comment faire :s, il me reste juste ça ensuite mon module serait à priori terminé ^^

 

Merci d'avance

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...