Однажды задал в комментариях такой вопрос. Недавно решил эту проблему, расширив класс Form_validation в CodeIgniter (отдаленно напоминает переделку, подсказанную мне в ответ на мой вопрос).
Вообще странно, что такого функционала в классе в валидации изначально нет — функции хелпера form для вывода значения поля, установки чекбокса, etc (set_value, set_checkbox) поддерживает значение поля по умолчанию, однако прописывать в отображениях везде в set_value дефолтные значения не очень удобно.
Поэтому было написано вот такое расширение класса валидации, позволяющее установить массив значений по умолчанию. Так же переопределены методы, которыми пользуется хелпер form.
Можно заметить, что все изменения методов set_* свелось к предварительному вызову метода _get_default_field_value, который проверяет переданный аргумент $default, и если он пуст (если строка, то пуст, если число, то равно 0, или просто FALSE), проверяет, есть ли для заданного поля значение по умолчанию в массиве, и если есть, присваивает это значение $default'у, а затем вызывается родительский метод set_*. Таким образом, если Вы задаете какое-либо значение по умолчанию в set_*, то будет использоваться в первую очередь оно. Т. е. это расширение не влияет на уже написанный и работаютщий на основе Form_validation/Form helper код.
Таким образом, можно в контроллере при выводе формы (первом) передавать в Form_validation массив полей, полученный, например, из БД, а при выводе формы уже после ее submit'а (в случае ошибки валидации) не передавать массив умолчальных значений, и все, будут использоваться значения из $_POST'а
Подозреваю, что опытные разработчики, пишущие под CI, давно себе такую штуку сделали, но мне было интересно использовать уже имеющийся в фреймворке функционал для более удобной работы с классом валидации.
Вообще странно, что такого функционала в классе в валидации изначально нет — функции хелпера 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, давно себе такую штуку сделали, но мне было интересно использовать уже имеющийся в фреймворке функционал для более удобной работы с классом валидации.