Валидация форм с неопределенным количеством input-ов

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Maksat1991
Сообщения: 57
Зарегистрирован: 2016.10.16, 00:15

Валидация форм с неопределенным количеством input-ов

Сообщение Maksat1991 »

Нужно создать форму, в которой имеются поля
<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, я не могу заранее знать сколько человек будут регистрироваться.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Валидация форм с неопределенным количеством input-ов

Сообщение Alexum »

Если массивами собираетесь передавать и сохранять в одно действие, то при помощи 'each'

Код: Выделить всё

[['name'], 'each', 'rule' => [ ...
Если прям отдельными инпутами, то и ваш валидатор подойдёт (кроме строки с safe), но тогда готовтесь применять скажем Model::loadMultiple(), чтобы распихать данные из POST по отдельным моделям.
Maksat1991
Сообщения: 57
Зарегистрирован: 2016.10.16, 00:15

Re: Валидация форм с неопределенным количеством input-ов

Сообщение Maksat1991 »

Alexum писал(а): 2017.03.28, 16:30 Если массивами собираетесь передавать и сохранять в одно дейс а
Окей, спасибо, не знал про 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'],
];
}
Ответить