Как стать автором
Обновить

Расширение класса Form_validation поддержкой значений полей по умолчанию

Время на прочтение3 мин
Количество просмотров1.6K
Однажды задал в комментариях такой вопрос. Недавно решил эту проблему, расширив класс Form_validation в CodeIgniter (отдаленно напоминает переделку, подсказанную мне в ответ на мой вопрос).
Вообще странно, что такого функционала в классе в валидации изначально нет — функции хелпера form для вывода значения поля, установки чекбокса, etc (set_value, set_checkbox) поддерживает значение поля по умолчанию, однако прописывать в отображениях везде в set_value дефолтные значения не очень удобно.

Поэтому было написано вот такое расширение класса валидации, позволяющее установить массив значений по умолчанию. Так же переопределены методы, которыми пользуется хелпер form.


<?php
class MY_Form_validation extends CI_Form_validation
{
    var 
$_default_fields = array();

    function 
set_default_values($default)
    {
        if (
is_array($default)) {
            
$this->_default_fields $default;
        }
    }

    function 
_get_default_field_value($field, &$default)
    {
        if (
!$default) {
            if (isset(
$this->_default_fields[$field]))  {
                
$default $this->_default_fields[$field];
            }
        }
    }

    function 
set_value($field ''$default '')
    {
        
$this->_get_default_field_value($field$default);
        return 
parent::set_value($field$default);
    }

    function 
set_checkbox($field ''$value ''$default FALSE)
    {
        
$this->_get_default_field_value($field$default);
        return 
parent::set_checkbox($field$value$default);
    }

    function 
set_radio($field ''$value ''$default FALSE)
    {
        
$this->_get_default_field_value($field$default);
        return 
parent::set_radio($field$value$default);
    }
    
    function 
set_select($field ''$value ''$default FALSE)
    {
        
$this->_get_default_field_value($field$default);
        return 
parent::set_select($field$value$default);
    }
}



Можно заметить, что все изменения методов set_* свелось к предварительному вызову метода _get_default_field_value, который проверяет переданный аргумент $default, и если он пуст (если строка, то пуст, если число, то равно 0, или просто FALSE), проверяет, есть ли для заданного поля значение по умолчанию в массиве, и если есть, присваивает это значение $default'у, а затем вызывается родительский метод set_*. Таким образом, если Вы задаете какое-либо значение по умолчанию в set_*, то будет использоваться в первую очередь оно. Т. е. это расширение не влияет на уже написанный и работаютщий на основе Form_validation/Form helper код.

Таким образом, можно в контроллере при выводе формы (первом) передавать в Form_validation массив полей, полученный, например, из БД, а при выводе формы уже после ее submit'а (в случае ошибки валидации) не передавать массив умолчальных значений, и все, будут использоваться значения из $_POST'а

Подозреваю, что опытные разработчики, пишущие под CI, давно себе такую штуку сделали, но мне было интересно использовать уже имеющийся в фреймворке функционал для более удобной работы с классом валидации.
Теги:
Хабы:
+4
Комментарии1

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн