Jump to content

Presta 1.7 - Admin menu (tabs) - Unauthorized access


Go to solution Solved by Maxence de Flotte,

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();
    }

Share this post


Link to post
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.

 

 

Share this post


Link to post
Share on other sites
  • Solution

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

 

Share this post


Link to post
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.

Share this post


Link to post
Share on other sites

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,

Share this post


Link to post
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

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More