Yii2:基于角色可编辑的特定表单字段

时间:2015-02-15 21:18:33

标签: php acl yii2

好吧,我可以使用access permissions基于访问控制将用户behaviors(即查看,创建,更新或删除)限制为表单或视图。

但我想知道如何限制特定用户修改表单中的某些字段,即允许某些用户使用read-only和某些用户使用editable

我可以在模型中提供任何类型的访问规则,还是在_form.php本身附加一些规则。

感谢。

4 个答案:

答案 0 :(得分:3)

试试这个。

if(\Yii::$app->user->can('admin')) {
    $form->field($model,'field')->textInput();
}

在这种情况下,输入字段仅在条件匹配时才会出现。

答案 1 :(得分:2)

对于这种情况,我创建了自己的类ActiveForm。使用下面的代码,可以为一个或多个角色的特定字段添加规则。我在表单中使用它:

<?= $form->field($model, 'foo', [], [AccessUtil::USER_ROLE => RoleBasedActiveForm::INVISIBLE]) ?>

当您不添加任何规则时,基于角色的活动表格将显示正常的输入字段。如果你说它对角色不可见,它也不会显示任何内容,它也支持只读(UNEDITABLE)。

class RoleBasedActiveForm extends ActiveForm {

    const VISIBLE = 0;
    const INVISIBLE = 1;
    const UNEDITABLE = 2;

    public function field($model, $attribute, $options = [], $rules = []) {
        $case = empty($rules) ? self::VISIBLE : $this->_validateRules($rules);

        switch ($case) {
            case self::VISIBLE:
                return parent::field($model, $attribute, $options);
            case self::INVISIBLE:
                return;
            case self::UNEDITABLE:
                return parent::field($model, $attribute, array_merge($options, [
                            'template' => '{label}' . $model->$attribute,
                ]));
        }
    }

    private function _validateRules($rules) {
        // validate and return a const
    }
}

这将做表单部分。在发布课程值后,您还必须进行一些验证,以确保有人未修改表单。 (将只读更改为可使用检查员或其他内容编辑)

答案 2 :(得分:1)

是的,只要涉及到您的要求,就可以轻松完成,而无需使用任何实用程序。

试试这段代码:

$form->field($model,'field')->textInput(['disabled' => !\Yii::$app->user->can('admin')]);

您需要将您的字段名称和admin替换为您的用户角色。在上面的示例中,只有admin可以编辑此字段,对于其他用户,它将显示为已禁用或只读。

就是这样。

答案 3 :(得分:0)

这是一个更好的答案。您可以将其作为内联或单独的函数进行验证。

[[ 'input-name' ],
    function ($attribute, $params) {
        $user_role_array = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());
        if( !array_key_exists( "Role Name", $user_role_array ) ) {
            $myOldA = ( $this->getOldAttribute( $attribute ) );
            if( $this->{$attribute} !== (string) $myOldA ) {
                $this->addError($attribute, "Please contact XXXXX to modify this option. The field has been reset.  You may now resubmit the form" );
                $this->{$attribute} = $myOldA;
            } //End of if attribute equals old attribute
        } //End of if array key exists
    }, 'skipOnEmpty' => false, 'skipOnError' => false ],
[Next Rule if inline validation]