Yii2: как использовать функцию пользовательской проверки для активной формы?
В моей модели формы у меня есть пользовательская функция проверки для поля, определенного таким образом.
...
class SignupForm extends Model
{
public function rules()
{
return [
['birth_date', 'checkDateFormat'],
// other rules
];
}
public function checkDateFormat($attribute, $params)
{
// no real check at the moment to be sure that the error is triggered
$this->addError($attribute, Yii::t('user', 'You entered an invalid date format.'));
}
}
Сообщение об ошибке не отображается под полем формы, когда я нажимаю кнопку отправки, в то время как другие правила, такие как требуемый адрес электронной почты и пароль, отображаются.
Я работаю над собственной формой регистрации, поэтому, чтобы убедиться, что это не проблема, я установил правило
['username', 'checkDateFormat']
и удалили все другие правила, связанные с полем имени пользователя, но сообщение не появляется ни для него.
Я пробовал передавать ничего как параметры checkDateFormat
, я попытался явно передать имя поля addError()
$this->addError('username', '....');
но ничего не появляется.
Каков правильный способ настройки пользовательской функции проверки?
Ответы
Ответ 1
Вы читали документацию?
В соответствии с вышеприведенными шагами проверки атрибут будет проверяется, если и только если это активный атрибут, объявленный в сценарии() и связаны с одним или несколькими активными правилами объявлено в правилах().
Итак, ваш код должен выглядеть так:
class SignupForm extends Model
{
public function rules()
{
return [
['birth_date', 'checkDateFormat'],
// other rules
];
}
public function scenarios()
{
$scenarios = [
'some_scenario' => ['birth_date'],
];
return array_merge(parent::scenarios(), $scenarios);
}
public function checkDateFormat($attribute, $params)
{
// no real check at the moment to be sure that the error is triggered
$this->addError($attribute, Yii::t('user', 'You entered an invalid date format.'));
}
}
И в сценарии набора контроллеров, например:
$signupForm = new SignupForm(['scenario' => 'some_scenario']);
Ответ 2
Вам нужно вызвать $model->validate()
где-нибудь, если вы расширяетесь из класса Model.
Ответ 3
Попробуйте включить проверку в пустое поле
['birth_date', 'checkDateFormat', 'skipOnEmpty' => false, 'skipOnError' => false],
Кроме того, убедитесь, что вы не присваиваете id своему полю birth_date
в своем представлении.
Если у вас есть идентификатор для birth_date
, вам нужно указать selectors
<?= $form->field($model, 'birth_date', ['selectors' => ['input' => '#myBirthDate']])->textInput(['id' => 'myBirthDate']) ?>
Ответ 4
Чтобы выполнить пользовательские проверки в yii 2, вы можете написать пользовательскую функцию в модели и назначить эту функцию в правиле.
например. Я должен применить критерии пароля в поле password
, тогда я буду писать вот так в модели.
public function rules()
{
return [
['new_password','passwordCriteria'],
];
}
public function passwordCriteria()
{
if(!empty($this->new_password)){
if(strlen($this->new_password)<8){
$this->addError('new_password','Password must contains eight letters one digit and one character.');
}
else{
if(!preg_match('/[0-9]/',$this->new_password)){
$this->addError('new_password','Password must contain one digit.');
}
if(!preg_match('/[a-zA-Z]/', $this->new_password)){
$this->addError('new_password','Password must contain one character.');
}
}
}
}
Ссылки: - проверка формы в yii 2
Ответ 5
Вам нужно отобразить модель у контроллера. Без инициализации рассматриваемой модели. И в контроллере вам нужно вызвать функцию проверки
Ответ 6
Вы уверены, что первый параметр addError
не должен быть таким
$this->addError(**'attribute'**, Yii::t('user', 'You entered an invalid date format.'));
Ответ 7
У меня была общая проблема.
В вашей функции проверки:
public function checkDateFormat($attribute, $params)
{
// no real check at the moment to be sure that the error is triggered
$this->addError($attribute, Yii::t('user', 'You entered an invalid date format.'));
}
$params ничего не получает. Он фактически всегда равен Null. Вы должны проверить свое значение атрибута в функции:
public function checkDateFormat($attribute, $params)
{
if($this->birth_date == False)
{
$this->addError($attribute, Yii::t('user', 'You entered an invalid date format.'));
}
}
вот как это сработало для меня.
Ответ 8
Я наткнулся на это при использовании генератора CRUD. Сгенерированная функция actionCreate() не включает в себя запрос проверки модели, так что пользовательские валидаторы никогда не будут вызваны. Кроме того, _form не включает и сводка ошибок.
Итак, добавьте сводку ошибок в _form.
<?= $form->errorSummary($model); ?>
... и добавить вызов проверки - $model- > validate() - к действию контроллера
public function actionCreate()
{
$model = new YourModel();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {...
Ответ 9
Если вы не используете сценарии для своей модели, вы должны пометить свой атрибут как "безопасный":
['birth_date','safe'],
['birth_date', 'checkDateFormat'],
И, с другой стороны, вы можете использовать это для проверки даты:
['birth_date','safe'],
[['birth_date'],'date', 'format'=>'php:Y-m-d'],
Вы можете изменить формат по своему усмотрению.
Ответ 10
Вы случайно используете проверку на стороне клиента? Если вы это сделаете, вам нужно написать функцию javascript, которая будет проверять ввод. Вы можете видеть, как они это делают:
http://www.yiiframework.com/doc-2.0/guide-input-validation.html#conditional-validation
Другим решением было бы отключить проверку клиента, использовать проверку ajax, которая также должна вернуть ошибку.
Также убедитесь, что вы не перезаписали шаблон ввода, то есть убедитесь, что у вас все еще есть {error}, если вы перезаписали его.
Ответ 11
Ваш синтаксис правил должен быть чем-то вроде этого человека,
[['birth_date'], 'checkDateFormat']
не этот
['birth_date', 'checkDateFormat']
Итак, в вашем случае это должно выглядеть ниже
...
class SignupForm extends Model
{
public function rules()
{
// Notice the different with your previous code here
return [
[['birth_date'], 'checkDateFormat'],
// other rules
];
}
public function checkDateFormat($attribute, $params)
{
// no real check at the moment to be sure that the error is triggered
$this->addError($attribute, Yii::t('user', 'You entered an invalid date format.'));
}
}