【问题标题】:Yii2 How to hide sub-menu items from other usersYii2 如何对其他用户隐藏子菜单项
【发布时间】:2018-08-01 03:02:51
【问题描述】:

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

系统中新增了3个Roles

  1. 角色 ID 6 的 SIM 管理员
  2. 生产经理,角色 ID 7
  3. 角色 ID 8 的 SIM 测试员

SIM Manager 拥有对该模块的所有访问权限。现在我想给其他用户访问子菜单。

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

系统中有多个模块,根据用户角色进行处理。这种处理是通过数据库完成的。下面是表格截图

在这里您可以看到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 } ?>

任何帮助都将受到高度赞赏。

【问题讨论】:

  • UserMenu::mainItems() 这个函数只返回你的主菜单项,比如这个例子中的 SIM 管理?您如何获取子菜单项,例如 SIM 列表、SIM 问题、代码在哪里?
  • @IrfanAshraf 请查看我更新的问题
  • 看起来您的$menu-&gt;getSubMenuItems() 正在返回所有子菜单,而不管allow_access 的值如何。您必须添加与 mainItems 方法中类似的 where 条件,即 $query-&gt;andWhere("(FIND_IN_SET(". Yii::$app-&gt;user-&gt;identity-&gt;user_role.",allow_access)) &lt;&gt; 0 ");
  • 没错,你需要添加getSubMenuItems()功能代码我会相应地更新我的答案
  • @MuhammadOmerAslam 好的,我会等着 :)

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


【解决方案1】:

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

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,可以在NavMenuSideMenu 小部件中使用由Yii2提供,希望对您有所帮助。

【讨论】:

  • 我会应用它并告诉你:)
  • 一定要慢慢来。
  • 试过了,它给了我Illegal string offset ':qp1' in E:\xampp\htdocs\inventory-web\vendor\yiisoft\yii2\db\QueryBuilder.php $params[$phname] = $value
  • 哎呀等一个错误:D
  • $query-&gt;addParams(':user_role',Yii::$app-&gt;user-&gt;identity-&gt;user_role); 它给了我method call uses 2 parameters, but signature uses 1 parameters
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 2012-12-13
  • 2017-06-30
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多