Jump to content

Presta 1.7 - Admin menu (tabs) - Unauthorized access


Recommended Posts

English version (by a french guy … be nice  :P )

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

  • 3 months later...

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

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

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 :P)  Maxence.

Mais j'ai encore un soucis :(, en effet, en BDD, les tabs «AdminXLPosInfos», «AdminPaymentMethods», «AdminXLPosOrder», «AdminXLPosAction», «AdminXLPosBoutique» sont bien présents:D, mais n'ont pas d'id parent<_<. Et le tab «AdminXLPos» n'existe tout simplement pas:blink:.
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» …:blush:

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

  • 2 months later...

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

  • Like 1
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...