Я работаю над yii2
, У меня есть меню с именем SIM Management
в котором есть несколько подменю, как показано ниже.
Есть 3 Roles
добавлены в систему, которые
6
7
8
SIM Manager имеет полный доступ к модулю. Теперь я хочу предоставить доступ к подменю другим пользователям.
Менеджер производства будет просто просматривать SIM Return
а также Meter To SIM Mapping
, SIM-тестер будет просто просматривать SIM Return
,
В системе имеется несколько модулей, которые обрабатываются в соответствии с ролью пользователя. Эта обработка осуществляется через базы данных. Ниже снимок стола
Здесь вы можете увидеть, что есть SIM Management
И в allow access
я добавил 4 идентификатора ролей 1
это админ. Также перед SIM Return
а также Mapping
, роли определены. Но как идентификатор родителя 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 } ?>
Любая помощь будет высоко оценена.
Вам не нужно добавлять чек, но вы должны добавить запрос, чтобы использовать 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
или же SideMenu
виджет предоставлен Yii2
Надеюсь, это поможет вам.
Других решений пока нет …