Yii2如何隐藏其他用户的子菜单项

时间:2018-02-21 13:42:41

标签: php activerecord yii2 yii2-basic-app user-management

我正在研究yii2。我有一个名为SIM Management的菜单,其中有一些子菜单,如下所示。

enter image description here

系统中添加了3 Roles

  1. 角色ID为6
  2. 的SIM卡管理员
  3. 角色ID为7
  4. 的生产经理
  5. 角色ID 8
  6. 的SIM卡测试程序

    SIM管理员可以访问该模块。现在我想让其他用户访问子菜单。

    生产经理只会查看SIM ReturnMeter To SIM Mapping。 SIM Tester只会查看SIM Return

    系统中有多个模块根据用户角色进行处理。此处理通过数据库完成。下面是表格的快照

    enter image description here

    在这里,您可以看到有SIM Managementallow access我添加了4个角色ID,而1是管理员。同样在SIM ReturnMapping前面,定义了角色。但由于父ID 62对所有人都是相同的,因此所有模块对其他人都可见。

    在我的main.php我正在调用一个名为menuItems的函数。

    <?php
      $menu_items = \app\models\UserMenu::mainItems();
    
    ?>
    

    功能细节是

    public static function mainItems(){
        $query =  UserMenu::find();
        $query->where(['parent_id' => 0]);
    
        if(!Yii::$app->user->isGuest) {          
                $query->andWhere("(FIND_IN_SET(". Yii::$app->user->identity->user_role.",allow_access)) <> 0 ");
                $query->orderBy('display_order desc');
    
        }
    
        return $query->all();
    }
    

    角色在Roles Model

    中定义
    const ROLE_SUPER_ADMIN = 1;
    const ROLE_ADMIN = 2;
    const ROLE_TEAM_LEAD = 3;
    const ROLE_FIELD_WORKER = 4;
    const ROLE_INVENTORY_MANAGEMENT = 5;
    const ROLE_SIM_MANAGER = 6;
    const ROLE_PRODUCTION_MANAGER = 7;
    const ROLE_SIM_TESTER = 8;
    

    现在,我想设置一个查询以检查用户角色,并从该用户角色中查看菜单

    在上述功能中,可以进行如下检查

    if (Yii::$app->user->identity->user_role == Roles::ROLE_PRODUCTION_MANAGER) 
    {
         // here I want to set a query that will only send the specific menu Items.
    } 
    

    更新1

    以下是我的main.php代码。这里所有的菜单和子菜单都在

    <?php
    
            $_a = "/" . Yii::$app->controller->id . "/" . Yii::$app->controller->action->id;
            ?>
            <?php
            $menu_items = \app\models\UserMenu::mainItems();
    
            ?>
    
            <!-- Sidebar Menu -->
            <ul class="sidebar-menu">
    
    
                <li><a href="<?= Yii::$app->request->baseUrl ?>"><i class="fa fa-dashboard"></i><span> Dashboard</span></a>
                </li>
                <li class="header">SURVEY</li>
                <?php if(!Yii::$app->user->isGuest){ ?>
                <?php foreach ($menu_items as $menu) {
                    $arr = explode("/",$menu->link);
    
                   if(!Rbac::allowAccess($arr[1], $arr[2])){
    
                       continue;
    
                   }
    
                    ?>
                    <li class="<?= $menu->isMainActive(Yii::$app->controller->id) ? 'active' : '' ?>"><a href="#">
                            <i class="<?= $menu->fa_icon ?>"></i> <span><?= $menu->title ?></span>
                            <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i>
    
                        </a><?php if ($menu->getHasSubMenu()) { ?>
                            <ul class="treeview-menu">
                                <?php foreach ($menu->getSubMenuItems() as $sub) {
                                    $arrs = explode("/", $sub->link);
                                    if (!Rbac::allowAccess($arrs[1], $arr[2])) {
                                      //  continue;
                                    }
                                    ?>
                                    <li class="<?= $sub->isSubActive($_a) ? 'active' : '' ?>"><a
                                            href="<?= Yii::$app->request->baseUrl ?><?= $sub->link ?>"><?= $sub->title ?></a>
                                    </li>
                                <?php } ?>
                            </ul>
                        <?php } ?>
                    </li>
                    <?php if($menu->break==1) {?>
                        <li class="header">INSTALLATION</li>
                        <?php } ?>
                 <?php } ?>
                <?php } ?>
    

    任何帮助都会得到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您无需添加支票,但必须在FIND_IN_SET模型中调用subMenuItems()的单独函数中添加查询以使用UserMenu,如下所示。

public function subMenuItems(){
    $query =  self::find();
    $query->where(['=','parent_id', $this->id]);

    if(!Yii::$app->user->isGuest) {          
        $query->andWhere(new \yii\db\Expression('FIND_IN_SET(:user_role,allow_access)<>0'));
        $query->addParams([':user_role'=>Yii::$app->user->identity->user_role]);
        $query->orderBy('display_order desc');
    }

    return $query->all();
}

这将返回允许当前用户所需的菜单项。你只需要显示它就不再需要添加检查。

虽然这不是您使用过的传统方法,但您应该创建一个MenuHelper,它应该返回可以在array Nav内使用的菜单项Menu SideMenuYii2提供的1}}或{{1}}小部件,但希望它可以帮助您。