NicoJa Posted June 6, 2011 Share Posted June 6, 2011 Bonjour,depuis la nouvelle version de prestashop 1.4.2.5, j'ai un blocage sur l'installation d'un module.Ce module installe dans le backoffice un Tab et des sous-tab à celui-ci.Mon problème :J'utilise une méthode largement répandu sur les blogs et forums permettant d'installer un Tab dans l'administration. private function installModuleTab($tabClass, $tabName, $idTabParent = 0) { $tab = new Tab(); $tab->name = $tabName; $tab->class_name = $tabClass; $tab->module = $this->name; $tab->id_parent = $idTabParent; if(!$tab->save()) return false; return true; } Après avoir appelé cette méthode qui installe correctement mon Tab, j'appelle la méthode : Tab::getIdFromClassName('MonTab'); pour récupérer son id.Mais là, pas d'id, celui-ci vaut 0.Ce problème se produit depuis la version 1.4.2Si dans la méthode installModuleTab, je trace $tab->id, là l'id est correcte.Je n'ose pas le remonter en bug, ne sachant si c'est une mauvaise implémentation de ma part ou pasMerci pour vos retours Link to comment Share on other sites More sharing options...
olea Posted June 6, 2011 Share Posted June 6, 2011 C'est bien un bug sur la 1.4.2.J'ai ouvert le report suivant:http://forge.prestashop.com/browse/PSCFI-2162Pour le corriger, il faut aller dans le fichier classes/Tab.php, remplacer la ligne 193 suivante : return (isset(self::$_getIdFromClassName[$class_name]) ? (int)self::$_getIdFromClassName[$class_name] : false); Par return (isset(self::$_getIdFromClassName[$class_name]) ? (int)self::$_getIdFromClassName[$class_name]['id'] : false); Il manque un ['id'] dans la ligne. Link to comment Share on other sites More sharing options...
olea Posted June 6, 2011 Share Posted June 6, 2011 Ooupps,Après relecture du code et tests, il n'y a de problème dans la 1.4.2.5.L'appel Tab::getIdByClassName('AdminOrders') retourne bien 3.En essayant Tab::getIdByClassName('AdminMonTab') ?Votre Tab-save() retourn-t-il true ou false ? Link to comment Share on other sites More sharing options...
NicoJa Posted June 6, 2011 Author Share Posted June 6, 2011 Merci de votre réponse.Le retour est bien à true. Je vais retester from scratch (dans la soirée ou demain).Si, effectivement, j'appelle cette méthode dans un script de test sur un tab déjà existant cela fonctionne.La particularité c'est que l'appel à getIdFromClassName est réalisé juste après une création de Tab. Link to comment Share on other sites More sharing options...
NicoJa Posted June 6, 2011 Author Share Posted June 6, 2011 OK, je n'ai pas refais le test mais j'ai oublié de mentionner que j'avais modifié la fonction installModuleTab comme suit : private function installModuleTab($tabClass, $tabName, $idTabParent = 0) { $tab = new Tab(); $tab->name = $tabName; $tab->class_name = $tabClass; $tab->module = $this->name; $tab->id_parent = $idTabParent; if(!$tab->save()) return false; return $tab->id; } Cela me permet de ne pas utiliser la méthode static getIdFromClassName.Avant, le code dans la fonction install de notre module ressemblait à : [...] if(parent::install() == false || !$this->installModuleTab('MonAdminTab', array(1=>'Tab', 2=>'Tab')) return false; [...] maintenant il ressemble à : [...] if(parent::install() == false) return false; $idTab = $this->installModuleTab('MonAdminTab', array(1=>'CL', 2=>'CL')); if ($idTab == false) return false; [...] Certes, cela fonctionne correctement mais n'explique pas ce changement de comportement depuis la version 1.4.5.2Malheureusement, je n'ai pas réellement le temps de creuser ce sujet plus en avant, je ne passerais donc pas le POST en résolu (en attendant de pouvoir creuser plus en avant le sujet ou qu'un master prestageek nous fournisse la solution).Merci Olea d'avoir pris le temps de vous pencher sur cette question.Bonne soirée Link to comment Share on other sites More sharing options...
NicoJa Posted June 7, 2011 Author Share Posted June 7, 2011 j'ai rajouté un commentaire dans le bug que vous avez ouvert. Link to comment Share on other sites More sharing options...
olea Posted June 7, 2011 Share Posted June 7, 2011 Quand vous appelez la méthode Tab::getIdByClassName(), est-ce bien le nom de la classe gérant l'onglet que vous donner en paramètre ?Dans votre exemple, ca doit être le nom que vous passez dans le paramètre $tabClass de votre installAdminTab() Link to comment Share on other sites More sharing options...
Broceliande Posted June 7, 2011 Share Posted June 7, 2011 Salut,à mon avis , en faisant : private function installModuleTab($tabClass, $tabName, $idTabParent = 0) { $tab = new Tab(); $tab->name = $tabName; $tab->class_name = $tabClass; $tab->module = $this->name; $tab->id_parent = $idTabParent; return $tab->add(); } tu as tout en un.la methode add retourne false en cas d'erreur et l'id en cas de succès ...Je pense que ton problème avec getIdFromClassName est du à l'utilisation de save() au lieu de add() .La méthode save est héritée de ObjectModel, alors que la methode add() est elle , bien implémentée dans la classe Tab . Link to comment Share on other sites More sharing options...
NicoJa Posted June 8, 2011 Author Share Posted June 8, 2011 Bonjour,merci pour vos retours.\@Olea : oui, c'est bien le nom de la classe\@ Broceliande : Effectivement, la méthode add de Tab surcharge celle de ObjectModel. Et la méthode save n'appelle (dans mon cas) que la méthode add de ObjectModel. Le comportement vient certainement de là. Je dois faire une réinstall de ce module je vous tiendrais au courant, je n'ai toujours pas eu le temps de travailler sur ce sujet plus en avant :/ Quoi qu'il en soit la méthode de Brocéliande apparaît comme plus élégante.Etant donné le nombre de forum, blog qui reprennent la méthode installModuleTab initialement proposée par JB (si je ne m'abuse) je suis étonné du peu de retour sur ce thread.Prochain post, promis je le passe en résolu Link to comment Share on other sites More sharing options...
Pietaya Posted June 30, 2011 Share Posted June 30, 2011 Bonjour,Puis-je savoir ou en est ce post? Est il résolu?En utilisant $tab->add(), le nouvel onglet est il ajouté correctement et dan toutes les langues?Merci d'avance, Link to comment Share on other sites More sharing options...
NicoJa Posted June 30, 2011 Author Share Posted June 30, 2011 Bonjour Coro84,toutes les modifications décrites dans ce post son opérationnelles jusqu'à la dernière release 1.4.3Pour la gestion des langues (pas testé) je pense que cela est fonctionnelle car la problématique résidait uniquement dans la récupération de l'id du Tab après son insertion en base de donnée durant la procédure d'installation. Par rapport à la problématique initiale de ce post il est clair que c'est résolu.Au passage, la suggestion de Brocéliande est à suivre. Link to comment Share on other sites More sharing options...
Broceliande Posted July 1, 2011 Share Posted July 1, 2011 Bonjour,Puis-je savoir ou en est ce post? Est il résolu?En utilisant $tab->add(), le nouvel onglet est il ajouté correctement et dan toutes les langues?Merci d'avance, Bonjour , $tab->add() ajoute le tab .En effet le nom du tab ($tab->name) est ajouté automatiquement à toutes les langues (mais reste identique cependant)Pour que le champ name soit enregistré dans des langues différentes , il doit être prérenseigné sous la forme d'un tableau :$this->name[id_lang1]='Nom'; $this->name[id_lang2]='Name'; .... 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