好吧,我可以使用access permissions
基于访问控制将用户behaviors
(即查看,创建,更新或删除)限制为表单或视图。
但我想知道如何限制特定用户修改表单中的某些字段,即允许某些用户使用read-only
和某些用户使用editable
。
我可以在模型中提供任何类型的访问规则,还是在_form.php
本身附加一些规则。
感谢。
答案 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]