Для этого случая я создал свой собственный класс, который расширяет ActiveForm
. С помощью приведенного ниже кода можно добавить правила в определенное поле для одной или нескольких ролей. Я использую его, как это в моих формах:
<?= $form->field($model, 'foo', [], [AccessUtil::USER_ROLE => RoleBasedActiveForm::INVISIBLE]) ?>
Роль На основе Active Form будет отображаться нормальное поле ввода, когда вы не добавляете никаких правил. Он ничего не отобразит, если вы скажете, что он должен быть невидим для ролей, а также поддерживает только чтение (UNITED).
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
}
}
Это займет часть формы. Вы также должны будете сделать некоторую проверку после публикации значений, конечно, чтобы убедиться, что кто-то не изменил форму. (изменено только на редактирование с помощью инспектора или что-то в этом роде)
Работает отлично. Спасибо – Pawan
Это работает, но это небезопасно делает его глупым, как ад. Ничто не мешает пользователю публиковать информацию в форме. Любой может легко редактировать HTML, сделать этот вход не отключенным и опубликовать форму, тем самым изменив значение.Если вам нужен безопасный способ сделать это, вы должны использовать это с правилами модели, которые теперь позволят пользователю изменить эту часть модели. Также любой ответ, который говорит вам скрывать ввод, глупо. –
@MihaiP. - Можете ли вы показать мне, как реализовать в правилах модели. Благодарю. – Joshi