Download the PHP package i-avatar777/yii2-service-form-ajax without Composer
On this page you can find all versions of the php package i-avatar777/yii2-service-form-ajax. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download i-avatar777/yii2-service-form-ajax
More information about i-avatar777/yii2-service-form-ajax
Files in i-avatar777/yii2-service-form-ajax
Package yii2-service-form-ajax
Short Description Сервис для yii2 для для валидации и исполнения формы по AJAX
License BSD-3-Clause
Informations about the package yii2-service-form-ajax
FormAjax
Сервис для yii2 для для валидации и исполнения формы по AJAX.
Делает вместро submit с обновлением страницы - ajax запрос и вызов JS метода success
.
Концепция
Чтобы форма передавалась по AJAX.
После возвращения выводились ошибки.
Исключение составляет в том что нельзя по AJAX передать файл, или сложно, поэтому применяется виджет для онлайн загрузки где по AJAX передается только файл.
\iAvatar777\services\FormAjax\ActiveRecord::attributeWidgets - здесь указываются виджеты и их настроки для вывода в форме
Так указывается форма на странице:
Если вы используете эту ActiveForm
то в виде модели для нее надо использовать эту модель ActiveRecord
или эту Model
. В них прописана функция возврата ошибки валидации getErrors102
.
Или вы можете использовать свои но скопировать эту функцию в свою модель.
В виде обработчика формы главным считается DefaultFormAjax
он прописывается в контроллере так:
Где model
- это модель формы, а add
- это идентификатор действия (Action::id
).
Чтобы форма отправляла проверку на этот обработчик, надо вформе прописать
Отличие от стандартной обработки по AJAX в YII2
Установка
Показывание WIDGET
В функции attributeWidgets
указывается соответствие поля и виджета. Этот виджет будет рисоваться автоматически если в форме указано:
<?= $form->field($model, 'image') ?>
Отключить кнопку
Если надо не показывать кнопку и внучную отработать то можно так:
``
Особенность
Событие submit на Enter вызывается два раза, причем только первый раз. Выяснить почему так выяснить не удалось. В связи с этим для того чтобы обойти поставил обход через установку параметра delta
= 1000 мс, в течение которого нельзя вызвать повторно событие мой submit
.
Использование в контроллере при добавлении или обновлении
Если модель класса \yii\db\ActiveRecord
или \yii\base\Model
то код для сохранения в контроллере такой:
Если модель класса \iAvatar777\services\FormAjax\ActiveRecord
или \iAvatar777\services\FormAjax\Model
то в них существует функция getErrors102()
и тогда код уменьшается и можно писать так:
Пример использования
Если сохранение вызывается в Model то parent:: будет вызывать onBeforeUpdate и onAfterUpdate
Стандартные действия
Для упрощения стандартных действий в библиотеке есть стандартный набор обработчиков действий:
\iAvatar777\services\FormAjax\DefaultFormAjax
- применяется для обработки AJAX обработки формы\iAvatar777\services\FormAjax\DefaultFormAdd
- применяется для рисования формы добавления на странице, на страницу передается переменная$model
\iAvatar777\services\FormAjax\DefaultFormEdit
- применяется для рисования формы редактирования на странице, на страницу передается переменная$model
. Идентификатор записи передается по методу GET в параметреid
.\iAvatar777\services\FormAjax\DefaultFormDelete
- применяется для удаления записи по AJAX. Идентификатор записи передается по методу POST в параметреid
.
Использование если на странице форма добавления
В контроллере прописываю в функции actions()
Параметр view
не обязателен, если не указан то используется идентификатор действия (action).
Событийная модель для \iAvatar777\services\FormAjax\ActiveRecord
Как они описываются и что туда епередается?
function onBeforeUpdate() {}
Модель запуска событий
Например delete
- attributeWidgets()
['events']['onBeforeDelete']
- Widget:onBeforeDelete
- \yii\db\ActiveRecord::delete()
- Widget:onAfterDelete
- attributeWidgets()
['events']['onAfterDelete']
То есть можно написать свой обработчик если надо и вместе с этим в самом виджете использовать дополнительные обработки.
Например это актуально если в форме выводятся значения в одном формате а хранятся в БД в другом формате тогда можно а обработчике виджета прописать приведение типа.
Или например это актуально если нужно удалить картинку по факту удаления записи.
три сценария показа формы
- Всего три сценария показа формы
Если в форме производится изменение формата хранения поля то нужно учитывать что на момент рисования формы в поле должно хранится один и тот же формат поля.
Если производится конвертация форматов то лучшей практикой будет такое:
Я могу сделать конвертацию в onAfterLoadDb
из YYYY-mm-dd в dd.mm.YYYY
а в событии onBeforeUpdate
из dd.mm.YYYY в YYYY-mm-dd
то при валидации в поле будет формат dd.mm.YYYY, при выводе формы будет dd.mm.YYYY
При загрузке формы значение будет загружено в формате dd.mm.YYYY поэтому ничего менять не нужно
Если я хочу сохранять (держать значение в формате DateTime
) то как должна быть конвертация? Как должна проводиться валидация? Как должно выводиться значение в форме в виджете?
Например:
Я могу сделать конвертацию в onAfterLoadDb
из YYYY-mm-dd в DateTime
в событии onAfterLoad
делается конвертация из dd.mm.YYYY в DateTime
валидировать нужно введенное значение от пользователя формата DateTime
.
в событии onBeforeUpdate
из DateTime
в YYYY-mm-dd
В виджете рисования будет из формата DateTime
Так как по факту сохранения формы действие заканчивается то после сохранения формы она уже не отрисовывается.
Виджеты
Базовый класс: \iAvatar777\services\FormAjax\Widget
Виджеты предназначены для того чтобы можно было в них вызывать события для обработки постуивших данных.
Например в виджете с датой указывается дата в формате dd.mm.yyyy для валидации она должна быть в формате dd.mm.yyyy, при сохранении она должна быть в виде yyyy-mm-dd
Пример функции в виджете
Инициализация формы после простой html выдачи
Иногда возникает необходимость обработать, навесить обработчики формы после выдачи простого HTML. Тогда чтобы форма работала, нужно вызвать функцию
Получение значений полей формы
Иногда возникает необходимость получить значение поля, но нестандартным способом. Например из редактора такста. Тогда в виджете задается функция получения значения поля
Если функции в виджете нет то значени поля будет выбираться по ID поля INPUT
.
Собираются только те поля которые перечислены полями (INPUT
) в форме.
Пример скрипта очистки значений из serrializeArray:
Пример скрипта для замены простого поля: