Документация

Начало работы

Модели (models)

Шаблоны (views) и маршрутизация (routes)

Формы

SQL запросы

Сессии и безопасность

Плагины

Не работает $form -> addRule для форм созданных из массива

Ответов: 6
Volaner
01.06.2018 04:01

Не получается изменить правило проверки поля, ни изменить регулярку, ни поменять только сообщение. Причём, если форму создаю из модели, то всё ок. А если из массива, такое впечатление, что метод addRule не делает вообще ничего, никаких ошибок, правила просто не добавляются, даже если в параметрах написать конкретный бред, не существующие имя поля, например, ошибок всё равно не будет, никаких.
Ниже написанный код работать не желает, ошибок никаких не высвечивается, просто проверка продолжает проводится на условие "6 и более цифр" и сообщение выводится соответствующие.

$form_fields = array(array("Имя", "char", "name", array('required' => true)),array("Телефон", "phone", "tel"));

$form = new Form($form_fields);

$form -> addRule('phone', 'format', '/(+7(d){10})/', 'Введите пожалуйста телефон в международном формате - +79012224455');

$test = array('name' => 'Anna', 'tel' => '22332');
$form -> getDataFromArray($test) -> validate();

Тэги: Формы

Прочтений: 47
Ответов: 6
Максим
01.06.2018 09:18

У вас не правильное имя поля в addRule(), там вместо phone должно быть tel, попробуйте так

$form -> addRule('tel', 'format',
Volaner
01.06.2018 19:15

Это я просто не оттуда скопировал. Уже масса экспериментов была, и так и эдак, толку ноль, из модели работает, из массива нет

Admin
01.06.2018 20:34

Скопируйте пожалуйста сюда именно тот код, который не работает. Мы у себя попробовали ваш пример, у нас получилось. И там еще с регулярным выражением может быть что-то. У нас тут обратные слэши не все отображаются, там в нашем примере перед + и перед d должен быть обратный слэш

$form_fields = array(
array("Имя", "char", "name", array('required' => true)), 
array("Телефон", "phone", "tel"));

$form = new Form($form_fields);
$form -> addRule('tel', 'format', '/^+7d{10}$/', 'Неверный формат телефона');

$test = array('name' => 'Anna', 'tel' => '111111');
$form -> getDataFromArray($test) -> validate();

//Если сделаете такой вывод там даже в объекте будет видно новый формат и ошибку
Debug :: pre($form);
Volaner
01.06.2018 21:17

Я нашёл проблему. Я исходил из того, что метод addRule заменяет стандартное правило, но нет, стандартное никуда не девается. Если я ввожу вместо телефона '123' то что бы не было добавлено с помощью addRule, в любом случае, будет выводится сообщение - "Минимальная длина поля «Контактный номер» должна составлять 6 символов". А вот если ввести 6 и более символов, вот тогда только будет проверяться правилом addRule. Т.е. с начала проверяется стандартным, и только если стандартная проверка пройдена, проверяется добавленным addRule. В документации этого нету, может стоит в описании метода addRule добавить, что стандартная проверка никуда не денется, лично мне бы это сэкономило большое кол-во часов. Можно конечно решить, что такое действие метода логично, исходя из его названия, но на мой взгляд, если разработчик решил изменить стандартное правило проверки на своё, зачем ему, чтоб сначала проверялось всё таки стандартным, а лишь затем его правилом.
Вопрос: как можно убрать стандартную проверку? $form -> removeRule('phone', 'format') перед addRule не работает. Это сообщение про 6 символов, ну вообще не в тему. Посетителя это смутить может, ну почему шесть то?

Admin
01.06.2018 21:36

Тут вот какое дело, стандартное правило, оно не по регулярному выражению проверяло, а по минимальной длине, она там по умолчанию стоит для телефона в 6 символов, если поле например char то такой проверки не будет. Вобщем в вашем случае нужно удалить проверку минимальной длины.
Надо будет добавить это сюда
http://mv-framework.ru/pravila-proverki-polei-formy/

$form -> removeRule('tel', 'min_length');
Volaner
01.06.2018 22:37

Спасибо. Теперь всё как надо

Ответить на вопрос
Ответить