Page 1 sur 1

Afficher seulement les menus pour lesquels on a les droits

MessagePublié: 01 Sep 2010, 18:49
par Marc
J'ai créé des administrateurs limités en droits.
Je cherche à modifier le menu de sorte qu'il n'affiche que les menus auxquels l'utilisateur a le droit d'accéder au moins en lecture.

Savez-vous où sont gérer les droits (dans quels fichiers) ?
Quel module doit-on charger dans le header pour disposer des infos dans le template header.tpl ?

Peut-être existe-t-il un topic français ou anglais qui en parle (je ne l'ai pas encore trouvé) ?

Merci de votre aide.

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 02 Sep 2010, 09:18
par snickers
Salut Marc,

Je peux pas vraiment t'aider je connais pas encore assez OpenCart mais voilà ce que j'ai trouvé vite fait.
Les utilisateurs sont gérés dans un fichier : /system/library/user.php

Tu y trouveras des fonctions telles que :
Code: Tout sélectionner
public function hasPermission($key, $value)

Mais je ne sais pas encore ce qu'il faut lui passer en paramètre et où récupérer $key et $value.

Code: Tout sélectionner
public function isLogged(),
public function getId()

Je pense qu'on les utilisent comme ça dans une class : $this->user->function ?? (je ne suis pas sur, corrige moi si je fais fausse route.)


De plus selon la base de donnée c'est dans la tabler user_group en corrélation avec la table user que se trouvent les permissions liées au groupe de ton utilisateur.

Ensuite je pense qu'il suffit de placer des if dans header.tpl encadrant les li concernés

Je reviens vers toi si je trouve quelque chose. De même si tu trouves n'hésite pas à le poster ça m'intéresse aussi.

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 02 Sep 2010, 12:16
par Marc
Bonjour,

J'ai effectué des recherches hier et trouvé une réponse. J'ai eu le même raisonnement que toi snickers ;)
Voici donc un bout de code qui fonctionne :
Code: Tout sélectionner
<?php if($this->user->hasPermission('access', 'setting/setting')) {?>
<li><a href="<?php echo $setting; ?>"><?php echo $text_setting; ?></a></li>
<?php } ?>

Bon c'est pas top car ça met beaucoup de code dans un template...
Aussi je ne comprend pas comment ça fonctionne car je n'ai vu nulle part où l'attribut user était initialisé dans la classe ControllerCommonHeader ou Controller...

Mais ça fonctionne parfaitement ! :D
Le bout de code est à multiplier sur chaque menu en précisant à chaque fois la bonne section.

L'ensemble des sections disponibles sont listées dans l'interface.
J'ai cru comprendre que les sections correspondaient aux dossiers présents dans admin/model/
ex : admin/model/setting/setting.php => "setting/setting"
=> A vérifier... :roll:

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 02 Sep 2010, 14:27
par snickers
Cool, merci beaucoup.

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 02 Sep 2010, 15:07
par Marc
C'est pas admin/model/ mais admin/controler/ ;)
=> admin/controler/setting/setting.php => "setting/setting"

C'est un peu long à faire aussi voici mon header.tpl : (attention certains menus ne sont pas en standard et la modification pour fonctionner en full CSS a été insérée)
*** Modification pour utilisateur averti ***
Code: Tout sélectionner
<?php echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" dir="<?php echo $direction; ?>" lang="<?php echo $lang; ?>" xml:lang="<?php echo $lang; ?>">

<head>

<title><?php echo $title; ?></title>

<base href="<?php echo $base; ?>" />

<?php foreach ($links as $link) { ?>

<link href="<?php echo $link['href']; ?>" rel="<?php echo $link['rel']; ?>" />

<?php } ?>

<link rel="stylesheet" type="text/css" href="view/stylesheet/stylesheet.css" />

<link rel="stylesheet" type="text/css" href="view/javascript/jquery/ui/themes/ui-lightness/ui.all.css" />

<?php foreach ($styles as $style) { ?>

<link rel="<?php echo $style['rel']; ?>" type="text/css" href="<?php echo $style['href']; ?>" media="<?php echo $style['media']; ?>" />

<?php } ?>

<script type="text/javascript" src="view/javascript/jquery/jquery-1.3.2.min.js"></script>

<script type="text/javascript" src="view/javascript/jquery/ui/ui.core.js"></script>

<script type="text/javascript" src="view/javascript/jquery/superfish/js/superfish.js"></script>

<script type="text/javascript" src="view/javascript/jquery/tab.js"></script>

<?php foreach ($scripts as $script) { ?>

<script type="text/javascript" src="<?php echo $script; ?>"></script>

<?php } ?>

<script type="text/javascript">

//-----------------------------------------

// Confirm Actions (delete, uninstall)

//-----------------------------------------

$(document).ready(function(){

   

    // Confirm Delete

    $('#form').submit(function(){

        if ($(this).attr('action').indexOf('delete',1) != -1) {

            if (!confirm ('<?php echo $text_confirm; ?>')) {

                return false;

            }

        }

    });

   

    // Confirm Uninstall

    $('a').click(function(){

        if ($(this).attr('href') != null && $(this).attr('href').indexOf('uninstall',1) != -1) {

            if (!confirm ('<?php echo $text_confirm; ?>')) {

                return false;

            }

        }

    });   

});

</script>

</head>

<body>

<div id="container">

<div id="header">

  <div class="div1"><img src="view/image/logo.png" title="<?php echo $heading_title; ?>" onclick="location = '<?php echo $home; ?>'" /></div>

  <?php if ($logged) { ?>

  <div class="div2"><img src="view/image/lock.png" alt="" style="position: relative; top: 3px;" />&nbsp;<?php echo $logged; ?></div>

  <?php } ?>

</div>

<?php if ($logged) { ?>

<div id="menu">

<!--

  <ul class="nav left" style="display: none;">

-->

   <ul id="navmenu-h">

    <li id="dashboard"><a href="<?php echo $home; ?>" class="top"><?php echo $text_dashboard; ?></a></li>

      <?php

      if( $this->user->hasPermission('access', 'catalog/category') ||

         $this->user->hasPermission('access', 'catalog/product') ||

         $this->user->hasPermission('access', 'catalog/manufacturer') ||

         $this->user->hasPermission('access', 'catalog/download') ||

         $this->user->hasPermission('access', 'catalog/review') ||

         $this->user->hasPermission('access', 'catalog/information')

      ) {

      ?>

    <li id="catalog"><a class="top"><?php echo $text_catalog; ?></a>

      <ul>

        <?php if($this->user->hasPermission('access', 'catalog/category')) {?>

        <li><a href="<?php echo $category; ?>"><?php echo $text_category; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'catalog/product')) {?>

        <li><a href="<?php echo $product; ?>"><?php echo $text_product; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'catalog/manufacturer')) {?>

        <li><a href="<?php echo $manufacturer; ?>"><?php echo $text_manufacturer; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'catalog/download')) {?>

        <li><a href="<?php echo $download; ?>"><?php echo $text_download; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'catalog/review')) {?>

        <li><a href="<?php echo $review; ?>"><?php echo $text_review; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'catalog/information')) {?>

        <li><a href="<?php echo $information; ?>"><?php echo $text_information; ?></a></li>

            <?php } ?>

      </ul>

    </li>

      <?php } ?>

    <?php

      if(

        $this->user->hasPermission('access', 'extension/module') ||

        $this->user->hasPermission('access', 'extension/shipping') ||

        $this->user->hasPermission('access', 'extension/payment') ||

        $this->user->hasPermission('access', 'extension/total') ||

        $this->user->hasPermission('access', 'extension/feed')

      ) {

      ?>

    <li id="extension"><a class="top"><?php echo $text_extension; ?></a>

      <ul>

        <?php if($this->user->hasPermission('access', 'extension/module')) {?>

        <li><a href="<?php echo $module; ?>"><?php echo $text_module; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'extension/shipping')) {?>

        <li><a href="<?php echo $shipping; ?>"><?php echo $text_shipping; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'extension/payment')) {?>

        <li><a href="<?php echo $payment; ?>"><?php echo $text_payment; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'extension/total')) {?>

        <li><a href="<?php echo $total; ?>"><?php echo $text_total; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'extension/feed')) {?>

        <li><a href="<?php echo $feed; ?>"><?php echo $text_feed; ?></a></li>

            <?php } ?>

      </ul>

    </li>

      <?php } ?>

    <?php

      if(

        $this->user->hasPermission('access', 'sale/order') ||

        $this->user->hasPermission('access', 'sale/customer') ||

        $this->user->hasPermission('access', 'sale/customer_group') ||

        $this->user->hasPermission('access', 'sale/coupon') ||

        $this->user->hasPermission('access', 'sale/contact')

      ) {

      ?>

    <li id="sale"><a class="top"><?php echo $text_sale; ?></a>

      <ul>

        <?php if($this->user->hasPermission('access', 'sale/order')) {?>

        <li><a href="<?php echo $order; ?>"><?php echo $text_order; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'sale/customer')) {?>

         <li><a href="<?php echo $customer; ?>"><?php echo $text_customer; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'sale/customer_group')) {?>

        <li><a href="<?php echo $customer_group; ?>"><?php echo $text_customer_group; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'sale/coupon')) {?>

        <li><a href="<?php echo $coupon; ?>"><?php echo $text_coupon; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'sale/contact')) {?>

        <li><a href="<?php echo $contact; ?>"><?php echo $text_contact; ?></a></li>

            <?php } ?>

      </ul>

    </li>

      <?php } ?>

    <?php

      if(

        $this->user->hasPermission('access', 'setting/setting') ||

              $this->user->hasPermission('access', 'user/user') ||

              $this->user->hasPermission('access', 'user/user_permission') ||



              $this->user->hasPermission('access', 'localisation/language') ||

              $this->user->hasPermission('access', 'localisation/currency') ||

              $this->user->hasPermission('access', 'localisation/stock_status') ||

              $this->user->hasPermission('access', 'localisation/order_status') ||

              $this->user->hasPermission('access', 'localisation/country') ||

              $this->user->hasPermission('access', 'localisation/zone') ||

              $this->user->hasPermission('access', 'localisation/geo_zone') ||

              $this->user->hasPermission('access', 'localisation/tax_class') ||

              $this->user->hasPermission('access', 'localisation/length_class') ||

              $this->user->hasPermission('access', 'localisation/weight_class') ||

        $this->user->hasPermission('access', 'tool/error_log') ||

        $this->user->hasPermission('access', 'tool/backup') ||

        $this->user->hasPermission('access', 'tool/export')

      ) {

      ?>

    <li id="system"><a class="top"><?php echo $text_system; ?></a>

      <ul>

        <?php if($this->user->hasPermission('access', 'setting/setting')) {?>

            <li><a href="<?php echo $setting; ?>"><?php echo $text_setting; ?></a></li>

            <?php } ?>

            <?php

            if(

                  $this->user->hasPermission('access', 'user/user') ||

                  $this->user->hasPermission('access', 'user/user_permission')

            ) {

            ?>

       <li><a class="parent"><?php echo $text_users; ?><span>&raquo;</span></a>

          <ul>

              <?php if($this->user->hasPermission('access', 'user/user')) {?>

            <li><a href="<?php echo $user; ?>"><?php echo $text_user; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'user/user_permission')) {?>

            <li><a href="<?php echo $user_group; ?>"><?php echo $text_user_group; ?></a></li>

                  <?php } ?>

          </ul>

        </li>

            <?php } ?>

            <?php

            if(

                  $this->user->hasPermission('access', 'localisation/language') ||

                  $this->user->hasPermission('access', 'localisation/currency') ||

                  $this->user->hasPermission('access', 'localisation/stock_status') ||

                  $this->user->hasPermission('access', 'localisation/order_status') ||

                  $this->user->hasPermission('access', 'localisation/country') ||

                  $this->user->hasPermission('access', 'localisation/zone') ||

                  $this->user->hasPermission('access', 'localisation/geo_zone') ||

                  $this->user->hasPermission('access', 'localisation/tax_class') ||

                  $this->user->hasPermission('access', 'localisation/length_class') ||

                  $this->user->hasPermission('access', 'localisation/weight_class')

            ) {

            ?>

        <li><a class="parent"><?php echo $text_localisation; ?><span>&raquo;</span></a>

          <ul>

              <?php if($this->user->hasPermission('access', 'localisation/language')) {?>

            <li><a href="<?php echo $language; ?>"><?php echo $text_language; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/currency')) {?>

            <li><a href="<?php echo $currency; ?>"><?php echo $text_currency; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/stock_status')) {?>

            <li><a href="<?php echo $stock_status; ?>"><?php echo $text_stock_status; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/order_status')) {?>

            <li><a href="<?php echo $order_status; ?>"><?php echo $text_order_status; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/country')) {?>

            <li><a href="<?php echo $country; ?>"><?php echo $text_country; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/zone')) {?>

            <li><a href="<?php echo $zone; ?>"><?php echo $text_zone; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/geo_zone')) {?>

            <li><a href="<?php echo $geo_zone; ?>"><?php echo $text_geo_zone; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/tax_class')) {?>

            <li><a href="<?php echo $tax_class; ?>"><?php echo $text_tax_class; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/length_class')) {?>

            <li><a href="<?php echo $length_class; ?>"><?php echo $text_length_class; ?></a></li>

                  <?php } ?>

              <?php if($this->user->hasPermission('access', 'localisation/weight_class')) {?>

            <li><a href="<?php echo $weight_class; ?>"><?php echo $text_weight_class; ?></a></li>

                  <?php } ?>

          </ul>

        </li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'tool/error_log')) {?>

        <li><a href="<?php echo $error_log; ?>"><?php echo $text_error_log; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'tool/backup')) {?>

        <li><a href="<?php echo $backup; ?>"><?php echo $text_backup; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'tool/export')) {?>

        <li><a href="<?php echo $export; ?>"><?php echo $text_export; ?></a></li>

            <?php } ?>

      </ul>

    </li>

      <?php } ?>

    <?php

      if(

        $this->user->hasPermission('access', 'report/sale') ||

        $this->user->hasPermission('access', 'report/viewed') ||

        $this->user->hasPermission('access', 'report/purchased')

      ) {

      ?>

      <li id="reports"><a class="top"><?php echo $text_reports; ?></a>

      <ul>

        <?php if($this->user->hasPermission('access', 'report/sale')) {?>

        <li><a href="<?php echo $report_sale; ?>"><?php echo $text_report_sale; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'report/viewed')) {?>

        <li><a href="<?php echo $report_viewed; ?>"><?php echo $text_report_viewed; ?></a></li>

            <?php } ?>

        <?php if($this->user->hasPermission('access', 'report/purchased')) {?>

        <li><a href="<?php echo $report_purchased; ?>"><?php echo $text_report_purchased; ?></a></li>

            <?php } ?>

      </ul>

    </li>

      <?php } ?>

    <li id="help"><a class="top"><?php echo $text_help; ?></a>

      <ul>

        <li><a onclick="window.open('http://www.opencart-france.com/index.php?route=documentation/introduction');"><?php echo $text_documentation; ?></a></li>

        <li><a target="_blanck" href="http://forum.opencart-france.com"><?php echo $text_support; ?></a></li>

        <li><a target="_blanck" href="http://www.opencart-france.com"><?php echo $text_opencart; ?></a></li>

      </ul>

    </li>

    <li id="store" style="float:right">

         <a class="top" href="<?php echo $logout; ?>"><?php echo $text_logout; ?></a>

      </li>

    <li id="store" style="float:right">

         <a onclick="window.open('<?php echo $store; ?>');" class="top"><?php echo $text_front; ?></a>

      <ul>

        <?php foreach ($stores as $stores) { ?>

        <li><a onclick="window.open('<?php echo $stores['href']; ?>');"><?php echo $stores['name']; ?></a></li>

        <?php } ?>

      </ul>

    </li>

  </ul>

</div>

<?php } ?>

<div id="content">

<?php if ($breadcrumbs) { ?>

<div class="breadcrumb">

  <?php foreach ($breadcrumbs as $breadcrumb) { ?>

  <?php echo $breadcrumb['separator']; ?><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a>

  <?php } ?>

</div>

<?php } ?>


Nb : je ne sais pour quelle raison, le forum s'est mis à me rajouter des lignes blanche entre chaque ligne de code... :?

Reste à gérer de même dans les extensions (payment, shipping, etc. )

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 02 Sep 2010, 15:41
par Marc
Et voilà :mrgreen:

Dans les listes d'extensions, afficher seulement celles pour lesquelles l'utilisateur a des droits :

Sur les fichiers :
  • admin/controller/extension/module.php
  • admin/controller/extension/payment.php
  • admin/controller/extension/shipping.php
  • admin/controller/extension/total.php
  • admin/controller/extension/feed.php

Autour des lignes 50, Après :
Code: Tout sélectionner
      if ($files) {
         foreach ($files as $file) {
            $extension = basename($file, '.php');

Avant :
Code: Tout sélectionner
$this->load->language('feed/' . $extension);

               $action = array();
            
               if (!in_array($extension, $extensions)) {

Ajouter la condition sur le droit d'accès :
Code: Tout sélectionner
if( $this->user->hasPermission('access', 'feed/'.$extension) )
            {


Puis après :
Code: Tout sélectionner
      'action' => $action
               );

Avant :
Code: Tout sélectionner
         }
      }
      
      $this->template = 'extension/feed.tpl';
      $this->children = array(
         'common/header',   
         'common/footer'   
      );


fermer la condition :
Code: Tout sélectionner
   }   


Attention à adapter l'exemple => remplacer "feed" par le non du type d'extension correspondant au fichier traité ! ;)

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 04 Juil 2012, 18:16
par Mangostine
Bonsoir Marc,

Merci pour cette explication :)
Lorsque je fais ce que tu dis, le menu module apparait toujours :
- Pour ceux qui ont la permissions : tous les modules ont disparu
- Pour ceux qui n'ont pas la permission : cela s'affiche à l'identique qu'auparavant c'est-à-dire : Permission refusée

En fait je cherche à rendre invisible les menus ou sous-menus pour la permission qui n'a pas la permission.
Ainsi elle ne sait pas que cela existe.

Pour ma part j'ai trouvé ce Vqmod :
http://www.opencart.com/index.php?route ... order=DESC

Il ne fonctionne pas :(
Mais à la rigueur, je me disais que s'il fonctionne avec admin/controller/extension/module.php, cela serait facile de le faire pour les autres pages :D

Qu'en penses-tu ?

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 05 Juil 2012, 13:57
par Marc
Bonjour Mangostine,

Cette astuce avait été donnée il y a bien longtemps avant l'existance des Vqmod et pour une autre version d'OC (1.4.8 de mémoire)... Utiliser ce système me parrait conseillé pour éviter de perdre ses modifications lors des mises à jour des modules...

Il ne fonctionne pas :(
Mais à la rigueur, je me disais que s'il fonctionne avec admin/controller/extension/module.php, cela serait facile de le faire pour les autres pages :D

Oui je pense que c'est une bonne approche.
Maintenant je n'ai pas encore créé de vqmod car mes demandes client n'ont pas été vers le e-commerce depuis plusieurs mois... Du coup, faudrait que je passe un certain temps dessus pour en faire un qui fonctionne avec la version 1.5.1.1_FR que tu utilises... Je ne dis pas non... Mais ça va pas être possible pour moi dans les prochaines semaines... :(

Ceci dit, je ne pense pas que tu sois très loin d'arriver à quelque chose car ce que tu me décrit ressemble à une inversion de test : il cache les menus à ceux qui y ont droit et les affiche pour les autres... Du coup, peut-être que tu peux inverser les tests pour voir, non ?

Donnes le résultat ici, ça pourra toujours servir... Et n'hésites pas à créer un nouveau sujet (en mettant le miens en référence éventuellement) pour que d'autres contributeurs le voit.

En espérant que cette piste t'aidera un peu...

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 05 Juil 2012, 18:41
par Mangostine
Bonsoir Marc,

Merci pour ta réponse :)
J'ai trouvé exactement ce qu'il fallait :
http://www.opencart.com/index.php?route=extension/extension/info&extension_id=5021&filter_username=giuseppe.davi&page=1

Si cela peut aider :)

En tout ça fonctionne NICKEL !!!!

Re: Afficher seulement les menus pour lesquels on a les droi

MessagePublié: 05 Juil 2012, 18:52
par Marc
Excellent !
Je penserai à repasser par là le jour où j'en aurai de nouveau besoin ;)