Нужно создать форму, в которой имеются поля
<form action="#"
<input type="text" name="name">
<input type="text" name="email">
</form>
Для этой формы я должен создать модель с правилами валидации, вроде этого:
class CallbackSend extends Model {
public $name;
public $email;
public function formName()
{
return 'callback';
}
public function rules()
{
return [
[['name', 'email'], 'required'],
[['name'], 'string', 'max' => 255],
[['email'], 'email'],
[['name', 'email''], 'safe'],
];
}
...
}
И дальше через средства Yii2 сформировать форму с полями через вышесозданную модель.
Но проблема в том, что мне нужна форма, в которой таких полей может быть несколько. Например, регистрируются два человека одновременно, и для каждого мне надо собрать его имя и email. И тогда получится так:
<form action="#"
<input type="text" name="name[]">
<input type="text" name="email[]">
<input type="text" name="name[]">
<input type="text" name="email[]">
<input type="submit">
</form>
И как тогда здесь быть? В моей модели только одно свойство name, и только одно свойство email, я не могу заранее знать сколько человек будут регистрироваться.
Валидация форм с неопределенным количеством input-ов
-
- Сообщения: 57
- Зарегистрирован: 2016.10.16, 00:15
Re: Валидация форм с неопределенным количеством input-ов
Если массивами собираетесь передавать и сохранять в одно действие, то при помощи 'each'
Если прям отдельными инпутами, то и ваш валидатор подойдёт (кроме строки с safe), но тогда готовтесь применять скажем Model::loadMultiple(), чтобы распихать данные из POST по отдельным моделям.
Код: Выделить всё
[['name'], 'each', 'rule' => [ ...
-
- Сообщения: 57
- Зарегистрирован: 2016.10.16, 00:15
Re: Валидация форм с неопределенным количеством input-ов
Окей, спасибо, не знал про each.
А можно по подробней? Я понял, что так:
Мне надо на клиенте выводить как <input type="text" name="name[]">. Чтобы на сервере принимать как массив
$name[0]="Maksat";
$name[1]="Leonid";
Потом в контроллере создаю экземпляр класса своей формы
$form = Yii::createObject($formname);
$form->load(Yii::$app->request->post());
$errors = ActiveForm::validate($form);
И тогда мой валидатор как должен выглядеть, чтобы он провалидировал массив имен $name[] ?
Пока что мой валидатор который не умеет обрабатывать массив свойств имеет вид такой:
public function rules()
{
return [
[['name', 'email'], 'required'],
[['name'], 'string', 'max' => 255],
[['email'], 'email'],
[['name', 'email''], 'safe'],
];
}