Juda Posted July 15, 2013 Share Posted July 15, 2013 (edited) Bonjour, je me tourne vers ou en ce jour funeste car ni la "doc" (noté les guillemets), ni google n'ont été en mesure de me donner une réponse (Ou du moins un début d'élément de réponse) plaisante :x . Je travaille en ce moment sur des modules en 1.5.4.1. Pour me faciliter la vie, je voudrai rajouter une catégorie de menu en plus, avec peut-être des sous-menu, ou directement les modules. Un exemple un peu plus concret : - nouvel onglet/menu : Le juda'bricot menu - Au passage de la souris plusieurs onglets/sous-menu : * Custom module Header * Custom module Footer * etc - Et dans les sous-menus : "un raccourci pour la page configuration du module" Les documents les plus intéressants et pertinants que j'ai pu trouvé à ce sujet sortent de la doc 1.5, et mes interrogations se tournent vers l'input "Class". Je regarde comment dans quel état sont les menus déjà existants, et on leur à affecté pour la plupart une classe "AdminParentXXXX". Bon déjà je suis déconcerté, je m'attendais à soit trouver une classe existante, soit un controller existant... Ou bien pour les menus/onglets, on leur associe juste une classe fictive et basta ? Bon ensuite pour les modules en eux même, c'est déjà plus cohérent. L'input class pour le controller, et l'input module dans le cas où le controller se situe dans un module . Donc premier constat, j'ai pas l'impression que l'on peut créer un système de sous-menu. Créer un raccourci pour son module étouféfésableuh, malgrès le manque de doc ou d'API à ce sujet. Le point qui me géne est donc cette classe fictive que j'ai mis pour créer mon nouvel onglet/menu... Et bien entendu, tout est fait à la main... Je n'ai pas encore pigé si on pouvait l'ajouter nous même à l'installation du module (A fouiller du côté de la méthode ObjectModel::add). Qu'en pensez-vous ? Bien cordialement, Juda. Edited July 15, 2013 by Juda (see edit history) Link to comment Share on other sites More sharing options...
Prestaspirit Posted July 15, 2013 Share Posted July 15, 2013 Bonjour, Rien de plus simple que de créer un onglet parent ou non du coté admin, ça na pas grandement changé depuis la 1.4 Regarde du coté de la classe Tab, tu devrait trouver ton bonheur. Franck Link to comment Share on other sites More sharing options...
Juda Posted July 17, 2013 Author Share Posted July 17, 2013 (edited) Bonjour, Rien de plus simple ? Depuis la 1.4, c'est à dire ? Si je regarde la doc 1.4 je remaque qu'il demandé de créer une nouvelle table dans la BD, puis de créer deux nouveau fichier directement dans les dossier "Core" de prestashop... Peut-être suis-je dans un quiproquo et ne fais-tu que confirmer mes dires à propos de cette foutue classe fictive pour un onglet parent ? Je t'avou que je n'ai pas pris le temps d'analyser la classe Tab (Juste vu en diagonale 2, 3 méthodes intéréssantes), et que pour l'instant je suis encore à l'aprentissage de la création d'onglet via l'interface du backoffice. Pour reformulez la question : Pourquoi c'est écris "AdminParentXXX" (eg. AdminParentModule pour le menu modules), est-ce vraiment des classes fictives ? Edited July 17, 2013 by Juda (see edit history) Link to comment Share on other sites More sharing options...
J. Danse Posted July 17, 2013 Share Posted July 17, 2013 Bonsoir Juda, Il y a bien une classe fictive pour les onglets principaux. Et ce n'est pas spécialement gênant, puisqu'il n'est d'ailleurs pas possible de cliquer sur ce même onglet. Concernant les sous-menus, tu dois faire référence à une classe réelle. Voici l'exemple que je donne personnellement: // Install Tabs $parent_tab = new Tab(); // Need a foreach for the language $parent_tab->name[$this->context->language->id] = $this->l('Main Tab Example'); $parent_tab->class_name = 'AdminMainExample'; $parent_tab->id_parent = 0; // Home tab $parent_tab->module = $this->name; $parent_tab->add(); $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(); Et ceci se fait dans la méthode install() du module ;-) 1 Link to comment Share on other sites More sharing options...
Juda Posted July 20, 2013 Author Share Posted July 20, 2013 (edited) Edit : @JDanse, c'est môche quand même cette histoire de classe fictive Yop du coup, j'ai eu un peu de temps ce matin. Je poste 2 petites méthodes (Private ) tester sur prestashop 1.5.4.1 La première pour installer un nouvel onglet (par défaut dans le menu catalogue) et la deuxième pour la désinstaller. tabClass correspond au controller admin (e.g. /controller/admin/adminCustom.php). /** * * @param string $tabClass * @param string $tabName * @param integer $idTabParent * @return boolean */ private function installModuleTab($tabClass, $tabName, $idTabParent = 9) { $tab = new Tab(); foreach (Language::getLanguages(false) as $lang) $tab->name[$lang['id_lang']] = $this->l($tabName); $tab->class_name = $tabClass; $tab->id_parent = $idTabParent; $tab->module = $this->name; return $tab->add(); } /** * * @param string $tabClass * @return boolean */ private function uninstallModuleTab($tabClass) { $idTab = Tab::getIdFromClassName($tabClass); if($idTab){ $tab = new Tab($idTab); return $tab->delete();; } return false; } Edited July 20, 2013 by Juda (see edit history) Link to comment Share on other sites More sharing options...
Juda Posted August 1, 2013 Author Share Posted August 1, 2013 Hmm j'étais aussi en train de me demander s'il existait un moyen de créer un onglet mais que le lien soit dirigé vers autres choses que le controllerAdmin ? Un lien externe ou interne, comme l'accès rapide en faite mais dans les onglets ?... Oui en gros y'a longtemps j'ai codé un module 1.4 pour un ami, ça marche et tout, il peut accéder aux divers config' grâce au lien configuration dans les listes des modules. Et maintenant il aimerai juste pouvoir accéder au config' via un onglet. C'est un fainéant... Mais moi aussi, j'ai aucune envie de me replonger dans mon code moche de l'époque (sans commentaires :3), ni envie de lui coder une classe admin. Du coup j'ai rusé un peu : Quand je créé un nouveau menu, dans le champ classe j'ai glissé "AdminModules&configure=sliderdelamortquitue"... Et ça marche o/... Enfin je suis bel et bien redirigé vers le le lien de configuration excepté que j'ai un message "clé de sécurité non valable" du coup ^^' Link to comment Share on other sites More sharing options...
Juda Posted August 2, 2013 Author Share Posted August 2, 2013 Hmmpf j'ai rien trouvé de très sensible sur ce problème... Et vu que je suis en pleine pause repas, j'ai opté pour la solution la plus simple qui me soit venu à l'esprit (ya 30 secondes). L'utilisation d'un header() o/ ! Dans mon controller Admin public function __construct() { /* Redirection vers une page différente du même dossier */ $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'index.php?controller=AdminModules&token=xxxx&configure=sliderdelamortquitue'; header("Location: http://$host$uri/$extra"); exit; } $extra est juste un copié/collé du lien configuration du module. Link to comment Share on other sites More sharing options...
Eolia Posted March 1, 2014 Share Posted March 1, 2014 (edited) Hmm j'étais aussi en train de me demander s'il existait un moyen de créer un onglet mais que le lien soit dirigé vers autres choses que le controllerAdmin ? Du coup j'ai rusé un peu : Quand je créé un nouveau menu, dans le champ classe j'ai glissé "AdminModules&configure=sliderdelamortquitue"... Et ça marche o/... Enfin je suis bel et bien redirigé vers le le lien de configuration excepté que j'ai un message "clé de sécurité non valable" du coup ^^' Je déterre un vieux sujet pour poster une astuce. Vous pouvez créer un onglet ou sous-onglet pour rediriger vers l'équivalent de "configurer" pour un module. Cela évite de cliquer sur "modules", chercher le module correspondant puis cliquer sur "configurer". Dans votre fichier principal mon_module.php utilisez la méthode suivante: public function install() { if (!parent::install() OR !$this->_blablabla)//dépend de votre install perso return false; //Installation de l'onglet: $tab = new Tab(); $tab->class_name = 'AdminMonModule'; //la classe à créer $tab->id_parent = Tab::getIdFromClassName('AdminCatalog');//par exemple $tab->module = $this->name; $tab->name[(int)(Configuration::get('PS_LANG_DEFAULT'))] = $this->l('MonModule'); if(!$tab->add()) return false; Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=faq&tab_module=content_management&module_name=faq'); return true; } puis vous créez un petit fichier dans le répertoire controllers -> admin de votre module qui s'appelera AdminMonModule.php qui contiendra uniquement: <?php if (!defined('_PS_VERSION_')) exit; class AdminFaqController extends AdminController { public function __construct() { parent::__construct(); $this->lang = false; $this->context = Context::getContext(); if(!Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=mon_module&tab_module=content_management&module_name=mon_module')) return false; return true; } } ?> Une simple direction, en fait Mais qui permet de conserver les avantages de la classe AdminController (autorisations, positions, etc....) Edited March 1, 2014 by Eolia (see edit history) Link to comment Share on other sites More sharing options...
julianbaros Posted June 24, 2019 Share Posted June 24, 2019 On 3/1/2014 at 11:09 AM, Eolia said: Je déterre un vieux sujet pour poster une astuce. Vous pouvez créer un onglet ou sous-onglet pour rediriger vers l'équivalent de "configurer" pour un module. Cela évite de cliquer sur "modules", chercher le module correspondant puis cliquer sur "configurer". Dans votre fichier principal mon_module.php utilisez la méthode suivante: public function install() { if (!parent::install() OR !$this->_blablabla)//dépend de votre install perso return false; //Installation de l'onglet: $tab = new Tab(); $tab->class_name = 'AdminMonModule'; //la classe à créer $tab->id_parent = Tab::getIdFromClassName('AdminCatalog');//par exemple $tab->module = $this->name; $tab->name[(int)(Configuration::get('PS_LANG_DEFAULT'))] = $this->l('MonModule'); if(!$tab->add()) return false; Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=faq&tab_module=content_management&module_name=faq'); return true; } puis vous créez un petit fichier dans le répertoire controllers -> admin de votre module qui s'appelera AdminMonModule.php qui contiendra uniquement: <?php if (!defined('_PS_VERSION_')) exit; class AdminFaqController extends AdminController { public function __construct() { parent::__construct(); $this->lang = false; $this->context = Context::getContext(); if(!Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=mon_module&tab_module=content_management&module_name=mon_module')) return false; return true; } } ?> Une simple direction, en fait Mais qui permet de conserver les avantages de la classe AdminController (autorisations, positions, etc....) Bonjour, Est-ce que l'on peut faire cela sur une module déjà existant ? Link to comment Share on other sites More sharing options...
Eolia Posted June 24, 2019 Share Posted June 24, 2019 oui mais il faudra réinitialiser le module une fois la modification effectuée (risque de perte de données) ou créer le tab à la mano dans l'admin Link to comment Share on other sites More sharing options...
julianbaros Posted June 24, 2019 Share Posted June 24, 2019 2 hours ago, Eolia said: oui mais il faudra réinitialiser le module une fois la modification effectuée (risque de perte de données) ou créer le tab à la mano dans l'admin Merci pour la réponse. Dans le code, quand vous dites : if (!parent::install() OR !$this->_blablabla)//dépend de votre install perso return false; Est-ce qu'il faut remplacer le blablabla par quelque chose ? Sinon en ajoutant dans Menus dans le backoffice ça peut fonctionner ? Link to comment Share on other sites More sharing options...
Eolia Posted June 24, 2019 Share Posted June 24, 2019 le blabla correspon au code existant de la fonction install() ^^ Link to comment Share on other sites More sharing options...
julianbaros Posted June 25, 2019 Share Posted June 25, 2019 19 hours ago, Eolia said: le blabla correspon au code existant de la fonction install() ^^ D'accord, je vais faire le test sur mon module existant sur ma boutique test pour ne pas perdre toutes les données. En attendant sur ma boutique en ligne j'ai mis un raccourci dans les accès rapides. C'est plus clair comme ça. Merci 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