Yii2 Как скрыть пункты подменю от других пользователей

Я работаю над yii2, У меня есть меню с именем SIM Management в котором есть несколько подменю, как показано ниже.

введите описание изображения здесь

Есть 3 Roles добавлены в систему, которые

  1. Диспетчер SIM-карты с идентификатором роли 6
  2. Руководитель производства с идентификатором роли 7
  3. Тестер SIM-карты с идентификатором роли 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 } ?>

Любая помощь будет высоко оценена.

-2

Решение

Вам не нужно добавлять чек, но вы должны добавить запрос, чтобы использовать 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Надеюсь, это поможет вам.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]