Yii2 admin RBAC:从数据库获取角色,并在注册/用户注册时显示为Dropdownlist

Yii2 admin RBAC:从数据库获取角色,并在注册/用户注册时显示为Dropdownlist,yii2,rbac,Yii2,Rbac,我正在寻找一种方法,使管理员能够在从后端注册用户后为他们分配角色。我已经在Yi2 advanced中配置了Yi2 admin,并且已经在数据库表中设置了角色 但是,我希望在用户注册表单上以下拉列表的形式获取角色,管理员应该能够选择角色并分配给用户。下拉列表上的角色应低于管理员的角色或与其相当的角色…即,如果有一个系统管理员角色是超级用户,管理员应无法将该角色作为选项之一,因为分配该角色意味着该用户将高于其角色 我在网上搜索过,但只得到了Yii 1.1的代码,我试图自定义该代码,但根本不起作用。代

我正在寻找一种方法,使管理员能够在从后端注册用户后为他们分配角色。我已经在Yi2 advanced中配置了Yi2 admin,并且已经在数据库表中设置了角色

但是,我希望在用户注册表单上以下拉列表的形式获取角色,管理员应该能够选择角色并分配给用户。下拉列表上的角色应低于管理员的角色或与其相当的角色…即,如果有一个系统管理员角色是超级用户,管理员应无法将该角色作为选项之一,因为分配该角色意味着该用户将高于其角色

我在网上搜索过,但只得到了Yii 1.1的代码,我试图自定义该代码,但根本不起作用。代码如下所示:

表单上的下拉列表:

<?php
if (Yii::app()->user->isSuperuser) {
       $all_roles=new RAuthItemDataProvider('roles', array( 
    'type'=>2,
    ));
      $data=$all_roles->fetchData();
?>
    <div>
        <label for="type_id">Type</label>
        <?php echo CHtml::dropDownList("Type",'',CHtml::listData($data,'name','name'));?    > 
    </div>
<?php
}
?>
有人知道如何将其转换为Yii2吗?请协助;我在这个问题上纠缠了一段时间


谢谢。

我在我的应用程序中使用了以下格式的代码

获取加载用户id和所有名称

您只能在查询中更改条件

$users= ArrayHelper::map(app\models\User::find()->orderBy('username')->asArray()->all(), 'id', 'username');
$item=  ArrayHelper::map(app\models\Authitem::find()->orderBy('name')->asArray()->all(), 'name', 'name');
    echo $form->field($model, 'item_name')->widget(Select2::classname(), [
        'data' => $item,
        'options' => [
            'placeholder' => 'انتخاب کنید...',
          ],
        'pluginOptions' => [
            'allowClear' => true,
        ],
    ]);
    ?>

    <?php
    echo $form->field($model, 'user_id')->widget(Select2::classname(), [
        'data' => $users,
        'options' => [
            'placeholder' => 'انتخاب کنید...',
          ],
        'pluginOptions' => [
            'allowClear' => true,
        ],
    ]);
    ?>
$users=ArrayHelper::map(app\models\User::find()->orderBy('username')->asArray()->all(),'id','username');
$item=ArrayHelper::map(app\models\Authitem::find()->orderBy('name')->asArray()->all(),'name','name');
echo$form->field($model,'item_name')->widget(Select2::classname()[
“数据”=>$item,
“选项”=>[
“占位符”=>“占位符”,
],
“插件操作”=>[
“allowClear”=>正确,
],
]);
?>

以下是一个关于如何进行此操作的想法。设置了yii2 admin之后,设置必要的dbTables,并将authManager设置添加到您的配置部分,如下所示

$config = [
    ...
    'components' => [
        ...
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
        ],
    ],
    'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            'site/*',
            //'admin/*',
            //'gii/*',
        ]
    ],
];
您可以访问authManager组件

在控制器中,您可以像这样获得当前用户的角色

$current_user_roles = Yii::$app->authManager->getRolesByUser(Yii::$app->user->id);
接下来,您可以得到一个您定义的所有角色的列表

$available_roles = Yii::$app->authManager->getRoles();
从这里开始,您必须应用您的角色层次结构逻辑来定义此用户可以分配的角色(您应该得到此用户无法分配的角色列表,比如说
$problemed\u roles
)。一旦有了这两个列表,您就可以使用一个简单的
foreach()
语句从$available roles数组中删除$probled\u角色,例如:

foreach($forbidden_roles as $role){
    if(in_array($role,$available_role)){
        $index = array_search($role,$available_role);
        \yii\helpers\ArrayHelper::remove($available_roles,$index);
    }
}
现在您有了一个包含用户可以分配的角色的数组。将此数组传递给视图,然后再传递给下拉元素,就可以进行设置了

我还没有亲自尝试过,但让我知道它是否适合你。希望这有帮助

foreach($forbidden_roles as $role){
    if(in_array($role,$available_role)){
        $index = array_search($role,$available_role);
        \yii\helpers\ArrayHelper::remove($available_roles,$index);
    }
}