bdesprez Posted July 19, 2017 Share Posted July 19, 2017 English version (by a french guy … be nice ) I made a module for PrestaShop 1.6 and I would like to test it on PrestaShop 1.7. In this module I add menu elements in back-office. Tabs are in admin module, but when I try to go to the pages (by clicking on the menu item), I have an unauthorized access error … User is a SuperAdmin user … I don't have any problem in PrestaShop 1.6 … Bellow, you'll see my installTabs method in my module class. Any idea ? Version française : J'ai réalisé un module pour PrestaShop 1.6 et j'aurais aimé le tester sur PrestaShop 1.7. Dans ce module, j'ajoute des éléments de menu dans le back-office. Ces nouveaux éléments apparaissent bien dans le back-office, mais quand j'essai d'y accéder, j'ai un message d'erreur : «Accès interdit». L'utilisateur a les privilèges SuperAdmin… Je n'ai aucun soucis avec PrestaShop 1.6 … Ci-dessous, vous trouverez ma méthode «installTabs» présente dans la classe de mon module. Une idée ? /** * Install tabs * @return boolean */ public function installTabs() { // Invalidate the cache unlink(_PS_ROOT_DIR_ . '/cache/class_index.php'); $startLang = Context::getContext()->language; $tabXLPos = new Tab(); $tabXLPos->module = $this->name; $tabXLPos->active = 1; $tabXLPos->class_name = 'AdminXLPos'; foreach (Language::getLanguages(true) as $lang) { Context::getContext()->language = new Language($lang['id_lang']); $tabXLPos->name[$lang['id_lang']] = $this->l('XLPos'); } $tabXLPos->add(); $tabInfos = new Tab(); $tabInfos->module = $this->name; $tabInfos->active = 1; $tabInfos->class_name = 'AdminXLPosInfos'; $tabInfos->id_parent = $tabXLPos->id; foreach (Language::getLanguages(true) as $lang) { Context::getContext()->language = new Language($lang['id_lang']); $tabInfos->name[$lang['id_lang']] = $this->l('Informations'); } $tabModel = new Tab(); $tabModel->module = $this->name; $tabModel->active = 1; $tabModel->class_name = 'AdminXLPosOrder'; $tabModel->id_parent = $tabXLPos->id; foreach (Language::getLanguages(true) as $lang) { Context::getContext()->language = new Language($lang['id_lang']); $tabModel->name[$lang['id_lang']] = $this->l('Orders'); } $tabActions = new Tab(); $tabActions->module = $this->name; $tabActions->active = 1; $tabActions->class_name = 'AdminXLPosAction'; $tabActions->id_parent = $tabXLPos->id; foreach (Language::getLanguages(true) as $lang) { Context::getContext()->language = new Language($lang['id_lang']); $tabActions->name[$lang['id_lang']] = $this->l('Actions'); } Context::getContext()->language = $startLang; return $tabInfos->add() && $tabModel->add() && $tabActions->add(); } Link to comment Share on other sites More sharing options...
Maxence de Flotte Posted October 22, 2017 Share Posted October 22, 2017 Bonjour, Je ne sais pas si vous avez eu une réponse. Dans la version 1.7, il faut déclarer la variable tabs dans le constructeur. Exemple : 46 $this->tabs = array( 47 array( 48 'name' => $this->l('My Module'), 49 'class_name' => 'AdminMyModule', 50 'ParentClassName' => 'DEFAULT', 51 ), Par contre, je ne sais pas comment PrestaShop gère les mise à jours. Link to comment Share on other sites More sharing options...
Maxence de Flotte Posted October 23, 2017 Share Posted October 23, 2017 Bonjour, Pour information, sur les mises à jours de module je procède comme pour la 1.6 (donc avec le new tab). Donc pour faire simple : 1.7 Installation, il faut utiliser this->tabs 1.6 Installation, il faut utiliser new Tab 1.6 & 1.7 Mise à jour, il faut utiliser new Tab. C'est dommage que PrestaShop ne procède pas au diff (du moins je n'ai pas trouvé comment faire). Link to comment Share on other sites More sharing options...
bdesprez Posted October 24, 2017 Author Share Posted October 24, 2017 Depuis le temps que j'avais ouvert ce topic, je commençais à désespérer … Merci à toi (oui je suis insolent, je tutoie les gens que je ne connais pas ) Maxence. Mais j'ai encore un soucis , en effet, en BDD, les tabs «AdminXLPosInfos», «AdminPaymentMethods», «AdminXLPosOrder», «AdminXLPosAction», «AdminXLPosBoutique» sont bien présents, mais n'ont pas d'id parent. Et le tab «AdminXLPos» n'existe tout simplement pas. En ajoutant le tab «AdminXLPos» à la main dans la BDD, en le rattachant au tab «CONFIGURE» et en rattachant les autres tabs à celui fraîchement créé, ça fonctionne. Je me demande donc si j'ai loupé un truc, si j'ai le droit de rajouter des sous éléments dans «CONFIGURE» … Voici l'implémentation de $this->tabs : Je tiens à préciser qu'il n'existe aucun contrôleur pour «AdminXLPos», car en cliquant dessus il prend le contrôleur du premier sous élément («AdminXLPosInfos») ce qui est le fonctionnement souhaité. $this->tabs = [ [ 'name' => $this->l('XLPos'), 'class_name' => 'AdminXLPos', 'ParentClassName' => 'CONFIGURE' ], [ 'name' => $this->l('Informations'), 'class_name' => 'AdminXLPosInfos', 'ParentClassName' => 'AdminXLPos' ], [ 'name' => $this->l('Payment methods'), 'class_name' => 'AdminPaymentMethods', 'ParentClassName' => 'AdminXLPos' ], [ 'name' => $this->l('Orders'), 'class_name' => 'AdminXLPosOrder', 'ParentClassName' => 'AdminXLPos' ], [ 'name' => $this->l('Actions'), 'class_name' => 'AdminXLPosAction', 'ParentClassName' => 'AdminXLPos' ], [ 'name' => $this->l('Shops'), 'class_name' => 'AdminXLPosBoutique', 'ParentClassName' => 'AdminXLPos' ], ]; Encore merci d'avoir pris la peine de me répondre. Link to comment Share on other sites More sharing options...
Maxence de Flotte Posted October 24, 2017 Share Posted October 24, 2017 De mon coté j'ai créé le contrôleur parent (ici AdminXLPos). Sans cela ça ne marchait pas. J'ai donc créé un contrôleur vide. Dans tout les cas le clic sur le menu ramène dans le premier onglet et non sur le contrôleur courant. Cordialement, Link to comment Share on other sites More sharing options...
bdesprez Posted October 24, 2017 Author Share Posted October 24, 2017 Merci beaucoup. Je trouve étonnant l'obligation de créer un contrôleur vide mais l'important dans le cas présent, c'est que ta solution fonctionne. Link to comment Share on other sites More sharing options...
Maxence de Flotte Posted October 24, 2017 Share Posted October 24, 2017 Moi aussi, mais c'est la seule solution que j'ai trouvée. Et sans documentation c'est difficile d'avoir une réponse officielle. Link to comment Share on other sites More sharing options...
DD_DD2 Posted January 17, 2018 Share Posted January 17, 2018 Bonjour, En m'inspirant de la doc Prestashop, et en décorticant le code de Prestashop 1.7.2.0, j'arrive bien à avoir une ligne vers mon module dans le menu Admin, section Configure. Voici comment en procédant en deux étapes. 1. Dans modules/mymodule/mymodule.php, fonction __construct(), je déclare $this->tabs: class MyModule extends Module { ... public function __construct() { /*--Admin Menu--*/ if (version_compare(_PS_VERSION_, '1.7.1', '>=')) { $this->tabs = array( array( 'name' => 'Nom du Module', 'class_name' => 'AdminMyModule', 'parent_class_name' => 'CONFIGURE', 'visible' => true, )); } 2. Dans le répertoire modules/mymodule/controllers/admin, je créé un fichier AdminMyModuleController.php avec le contenu : if (!defined('_PS_VERSION_')) exit; class AdminMyModuleController extends ModuleAdminController { public function __construct() { parent::__construct(); if(!Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=nom_du_module_$this->name_dans__contruct')) { return false; } return true; } } Ainsi on a bien la ligne dans le menu, section Configure qui renvoie vers le controller AdminMyModule qui mène au module en lui même. J'espère que cela vous sera utile ... Denis 1 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