Pull to refresh

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

Reading time3 min
Views1.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, давно себе такую штуку сделали, но мне было интересно использовать уже имеющийся в фреймворке функционал для более удобной работы с классом валидации.
Tags:
Hubs:
Total votes 4: ↑4 and ↓0+4
Comments1

Articles