AJAX валидация формы в OctoberCMS

У нас есть простая форма, которую нам надо валидировать:

<form>
    <input name="name" />
    <input name="email" />
</form>

Как это сделать правильно? Очень просто.

Расширяем форму:

<form data-request="onSubmit" data-request-validate>

    <input name="name" />
    <span data-validate-for="name"></span>

    <input name="email" />
    <span data-validate-for="email"></span>

</form>

data-request="onSubmit" — это AJAX обработчик. Простыми словами, метод onSubmit будет обрабатывать отправку формы с помощью AJAX без перезагрузки страницы.

data-request-validate как раз и отвечает за валидацию формы с помощью AJAX.

span добавляем для того, чтобы вывести внутрь него(span) ошибки.

Теперь можем приступить к написанию правил валидации. Например, в классе компонента:

use October\Rain\Exception\ValidationException;
use Validator;

class MyComponent extends ComponentBase
{
    public function componentDetails()
    {
        return [
            'name' => 'ComponentName',
            'description' => 'Super Component',
        ];
    }

    // функция, которую мы указали в data-request="onSubmit"
    public function onSubmit()
    {
        // пишем правила валидации
        $rules = [
            'name' => 'required';
            'email' => 'required|email'; // можно использовать несколько правил
        ];

        // запускаем валидатор
        $validator = Validator::make(post(), $rules);

        // если нашли ошибки, то создаём исключение
        if ($validator->fails()) {
            throw new ValidationException($validator);
        } else {
            // ошибок нет, можно что-то сделать с формой, например отправить
        }
    }
}

Я же говорил, что просто 🙂

Остался ещё один важный штрих, без которого не добиться идеальной валидации — добавим к input классы ошибок.

Чуть-чуть расширим форму, добавив классы к каждому input’у:

<form data-request="onSubmit" data-request-validate>

    <input name="name" class="form-control" />
    <span data-validate-for="name"></span>

    <input name="email" class="form-control" />
    <span data-validate-for="email"></span>

</form>

И финальный штрих, добавим функцию в .js-файл, который подключаем в нашей теме:

# main.js

$(window).on('ajaxInvalidField', function(event, fieldElement, fieldName, errorMsg, isFirst) {
    var $field = $(fieldElement).closest('.form-control') // укажем класс input'а

    if (!$field.length) {
        return
    }

    event.preventDefault()

    $field.addClass('has-error') // какой класс добавим в случае ошибки

    $(window).one('ajaxErrorMessage', function(event, message){
        event.preventDefault()
    })
})

// удаляем класс ошибки
$(document).on('ajaxPromise', '[data-request]', function() {
    var $form = $(this).closest('form')

    if (!$form.length)
        return

    $('.form-control.has-error', $form).removeClass('has-error')
})

Не забудь подключить .js-скрипт где-нибудь в <header> или <footer>:

<script src="{{ 'assets/js/main.js'|theme }}"></script>


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *