Загрузка части форм из сервера с валидацией
Загрузка части форм из сервера с валидацией
Добрый день! Есть большая ActiveForm форма (композитная), которая состоит из частей. Изначально отображаются только базовые поля, далее клиент может добавить дополнительные поля, которые загружаются из сервера. Как добиться того, что бы при загрузки части форм, загружались вместе со jquery скриптом для валидация?
Сейчас клиентская валидация работает только для базовых полей а для загруженных полей после сабмита если валидацию на сервере прошла после перезагрузки работает.
Сейчас клиентская валидация работает только для базовых полей а для загруженных полей после сабмита если валидацию на сервере прошла после перезагрузки работает.
Re: Загрузка части форм из сервера с валидацией
Пока временно решил, с помощью pjax: на фоне отправляет всю форму на сервер и если валидацию не прошла то полученный html заменяет. Не думаю, что это хорошее решение особенно, когда форма большая.
-
- Сообщения: 910
- Зарегистрирован: 2019.08.13, 01:49
Re: Загрузка части форм из сервера с валидацией
В экшине вместе с отрисованными полями передаете массив атрибутов для валидации. На клиенте ловите и в цикле добавляете через $("#my-form").yiiActiveForm("add", attribute);
Re: Загрузка части форм из сервера с валидацией
Как раз так и делаю, проблема в том, что выдает ошибку yii.validation is undefinedyiiliveext писал(а): ↑2019.09.06, 22:18 В экшине вместе с отрисованными полями передаете массив атрибутов для валидации. На клиенте ловите и в цикле добавляете через $("#my-form").yiiActiveForm("add", attribute);
Получаю такие аттрибуты
Код: Выделить всё
[
{
"id": "formexperience-0-post",
"name": "[0]post",
"container": ".field-formexperience-0-post",
"input": "#formexperience-0-post",
"error": ".invalid-feedback",
"validate": function(attribute, value, messages, deferred, $form)
{
yii.validation.required(value, messages,
{
"message": "Необходимо заполнить «Должность»."
});
yii.validation.string(value, messages,
{
"message": "Значение «Должность» должно быть строкой.",
"max": 255,
"tooLong": "Значение «Должность» должно содержать максимум 255 символов.",
"skipOnEmpty": 1
});
}
},
{
"id": "formexperience-0-company_name",
"name": "[0]company_name",
"container": ".field-formexperience-0-company_name",
"input": "#formexperience-0-company_name",
"error": ".invalid-feedback",
"validate": function(attribute, value, messages, deferred, $form)
{
yii.validation.required(value, messages,
{
"message": "Необходимо заполнить «Компания»."
});
yii.validation.string(value, messages,
{
"message": "Значение «Компания» должно быть строкой.",
"max": 255,
"tooLong": "Значение «Компания» должно содержать максимум 255 символов.",
"skipOnEmpty": 1
});
}
},
...
]
Код: Выделить всё
template.content = response.content;
template.attributes= eval(response.validation.attributes.replace(/\\"/g, ''));//.rules.replace(/'/g, '"')
template.params = response.validation.params;
Код: Выделить всё
for (let i = 0; i < template.attributes.length; i++) {
$('#form').yiiActiveForm('add', template.attributes[i]);
}
Re: Загрузка части форм из сервера с валидацией
аха, всё решил, подключил ValidationAsset::class и всё заработала.
Вообще считаю, может я еще не знаю, получить данные из ActiveForm::attributes не удобно, обязательно надо через каждое поле пройтись, а если тебе не нужна форма а просто аттрибуты? Лишние работы. Было бы проще если был метод из экшна типа $this->renderAttributes('_form', $model);
Вообще считаю, может я еще не знаю, получить данные из ActiveForm::attributes не удобно, обязательно надо через каждое поле пройтись, а если тебе не нужна форма а просто аттрибуты? Лишние работы. Было бы проще если был метод из экшна типа $this->renderAttributes('_form', $model);
-
- Сообщения: 910
- Зарегистрирован: 2019.08.13, 01:49
Re: Загрузка части форм из сервера с валидацией
Action для добавления дополнительных полей
some-form-fields.php
В основном представлении
Код: Выделить всё
public function actionAddFields()
{
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$someFormModel = new SomeFormModel();
$form = new \yii\widgets\ActiveForm(['id' => 'main-form']);
$fields = $this->renderPartial('some-form-fields', [ //если используете в полях виджеты, подгружающие js, то используйте renderAjax
'form' => $form,
'someFormModel' => $someFormModel
]);
$attributes = [];
foreach ($form->attributes as $attribute) {
$attributes[] = json_encode($attribute);
}
return ['fields' => $fields, 'attributes' => $attributes];
}
Код: Выделить всё
<?php
echo $form->field($someFormModel, 'field1')->textInput();
echo $form->field($someFormModel, 'field2')->textInput();
echo $form->field($someFormModel, 'field3')->textInput();
Код: Выделить всё
<?php
$js = '
function addFields() {
$.ajax({
url: "/yourcontroller/add-fields",
dataType: "json",
}).done(function(data) {
$("#form-extra-fields").append(data.fields);
$.each(data.attributes, function (key, value) {
var attribute = $.parseJSON(value);
attribute.validate = eval("(function(){return " + attribute.validate.expression + ";})();");
$("#main-form").yiiActiveForm("add", attribute);
});
});
}
';
$this->registerJs($js, \yii\web\View::POS_BEGIN);
Re: Загрузка части форм из сервера с валидацией
Примерно всё так и делаю, только я не каждый раз запрашиваю форму из сервера а только если в хранилище шаблонов нету данной формы и ее аттрибуты. Только ради этого пришлось написать метод, который переименовывает ключи, каждый раз, когда добавляется или удаляется форма.
Re: Загрузка части форм из сервера с валидацией
Возникла еще одна задача, ActiveForm::attributes получаю, а как подгружать зависимые скрипты и стили этой формы. Раньше решал вопрос $this->renderAjax, теперь всё отправляется через $this->asJson. Сейчас смотрю на содержание $this->view->js[] пытаюсь наколадвать, нужных скриптов каким то образом подключить в конец html кода.
-
- Сообщения: 910
- Зарегистрирован: 2019.08.13, 01:49
Re: Загрузка части форм из сервера с валидацией
Никак. asJson() не для этого предназначен.
Re: Загрузка части форм из сервера с валидацией
Не верится. Пока ищу способы. Должен же быть выход, как то передать в строке думаю можно.