Yii2 如何对其他用户隐藏子菜单项
Yii2 How to hide sub-menu items from other users
我正在研究 yii2
。我有一个名为 SIM Management
的菜单,其中有一些子菜单,如下所示。
系统中添加了3个Roles
,分别是
- 角色 ID 为
6
的 SIM 管理员
- 生产经理,角色 ID
7
- 角色 ID 为
8
的 SIM 卡测试员
SIM 管理器拥有模块的所有访问权限。现在我想给其他用户访问子菜单。
生产经理只会查看 SIM Return
和 Meter To SIM Mapping
。 SIM 测试器只会查看 SIM Return
.
系统中有多个模块,根据用户角色进行处理。这种处理是通过数据库完成的。下面是 table
的截图
在这里您可以看到有 SIM Management
,在 allow access
中我添加了 4 个角色 ID,而 1
是管理员。同样在SIM Return
和Mapping
前面定义了角色。但是由于所有模块的父 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
模型调用 subMenuItems()
的单独函数中使用 FIND_IN_SET
,如下所示。
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();
}
这将 return 您允许当前用户需要的菜单项。您只需要显示它,无需添加更多检查。
虽然这不是您使用的传统方法,但您应该创建一个 MenuHelper
应该 return 菜单项 array
可以在 [= Yii2
提供的 16=]、Menu
或 SideMenu
小部件,希望对您有所帮助。
我正在研究 yii2
。我有一个名为 SIM Management
的菜单,其中有一些子菜单,如下所示。
系统中添加了3个Roles
,分别是
- 角色 ID 为
6
的 SIM 管理员
- 生产经理,角色 ID
7
- 角色 ID 为
8
的 SIM 卡测试员
SIM 管理器拥有模块的所有访问权限。现在我想给其他用户访问子菜单。
生产经理只会查看 SIM Return
和 Meter To SIM Mapping
。 SIM 测试器只会查看 SIM Return
.
系统中有多个模块,根据用户角色进行处理。这种处理是通过数据库完成的。下面是 table
的截图在这里您可以看到有 SIM Management
,在 allow access
中我添加了 4 个角色 ID,而 1
是管理员。同样在SIM Return
和Mapping
前面定义了角色。但是由于所有模块的父 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
模型调用 subMenuItems()
的单独函数中使用 FIND_IN_SET
,如下所示。
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();
}
这将 return 您允许当前用户需要的菜单项。您只需要显示它,无需添加更多检查。
虽然这不是您使用的传统方法,但您应该创建一个 MenuHelper
应该 return 菜单项 array
可以在 [= Yii2
提供的 16=]、Menu
或 SideMenu
小部件,希望对您有所帮助。