Формы
Большая часть времени разработки веб-приложения обычно уходит на создание и обработку форм. Мы решили оптимизировать процесс, сделав его максимально простым и приятным.
Структура формы задается в коде контроллера вместе со всеми дополнительными параметрами.
Рассмотрим более интересный вариант, когда одна и та же форма отвечает не только за добавление новых данных, но и за редактирование предыдущих.
Если существует языковая переменная с таким же названием и суффиксом "_description", она будет использована для описание элемента формы.
Если в текущем разделе перевода такой переменной нет, будет произведен поиск по разделу «edit», который отвечает за любые действия, связанные с обработкой информации.
Проверка может осуществляться на стороне сервера и клиента.
Структура формы задается в коде контроллера вместе со всеми дополнительными параметрами.
/*
* Задаем форму.
*/
$this->form->set('user/register')
->input('name',
array(
'validation'=>'required|min_length[3]',
'js_validation'=>'required|length[3,-1]',
...
)
)
->password('password',
array(
'validation'=>'required',
'js_validation'=>'required',
'md5'=>TRUE,
'via_cookies'=>TRUE
...
)
)
->password('confirm_password',
array(
'validation'=>'required|matches[password]',
'js_validation'=>'required|confirm[password]',
'md5'=>TRUE,
'via_cookies'=>TRUE,
''
...
)
)
->buttons('send');
/*
* По-умолчанию данные отправляются по этому же адресу.
* Принимаем данные, если они проходят проверку.
*/
if($result = $this->form->result()){
// Данная функция покажет нам оповещение, если операция пройдет успешно.
$this->form->save('user',$result);
redirect('/users/show/'.$this->form->insert_id);
}
/*
* Если данные не прошли проверку, под соответствующими элементами
* появятся сообщения об ошибках.
* Если данные не были отправлены -- отображаем форму.
*/
$this->form->compile();
Обратите внимание, что по-умолчанию данные отправляются по этому же адресу, что позволяет избежать написания повторного кода структуры формы.Рассмотрим более интересный вариант, когда одна и та же форма отвечает не только за добавление новых данных, но и за редактирование предыдущих.
class Index extends Controller{
...
function createdit($id = FALSE){
$this->form->set('nodes/createdit')
->input('name',array(...))
->input('url_name',array(...))
->textarea('body')
->buttons('save');
if($id && $node = $this->db->get_where('nodes',array('id'=>$id))->row()){
// Устанавливаем значения для элементов формы
$this->form->set_values($node);
}
if($result = $this->form->result()){
// Режим редактирования -- обновляем информацию
if($id !== FALSE && isset($node)){
$this->form->update('nodes',$result,array('id'=>$node->id));
redirect('/nodes/'.$node->id);
}
else {
$this->form->save('nodes',$result);
redirect('/nodes/'.$this->form->insert_id);
}
}
$this->form->compile();
}
...
Интернационализация форм
При компиляции формы модель смотрит в текущий раздел таблицы перевода на предмет совпадения названия переменных с названиями элементов формы. Если названия совпали — перевод переменной используется как label элемента.Если существует языковая переменная с таким же названием и суффиксом "_description", она будет использована для описание элемента формы.
Если в текущем разделе перевода такой переменной нет, будет произведен поиск по разделу «edit», который отвечает за любые действия, связанные с обработкой информации.
/*
* [node]
* name = "Заголовок материала"
* name_description = "Отражает суть всего материала."
*/
$this->form->set('nodes/createdit')
->input('name',...)
...

$this->form->input('name',array('label'=>t('!node name'),'description'=>t('!node name_description')));
Проверка форм
Модель осуществляет проверку формы автоматически, требуется только указать ряд правил для каждого из элементов, который должен быть проверен.Проверка может осуществляться на стороне сервера и клиента.
- Проверка на стороне сервера выполняется при помощи стандартной для CodeIgniter библиотеки Form Validation.
- Проверка на стороне клиента выполняется при помощи JavaScript библиотеки MooTools.Floor FormCheck.
$this->form->set('user/register')
->input('name',
array(
// Проверка на стороне сервера
'validation'=>'required|min_length[3]',
// Проверка на стороне клиента
'js_validation'=>'required|length[3,-1]',
...
)
)
Кнопки
Определяются единожды после определения всех элементов формы. По-умолчанию кнопка принимает тип «submit», если не указано иного.
$this->form->set('nodes/createdit')
...
/*
* Предопределенным названиями простых submit являются
* save, create, update, send, submit, create
*/
...
->buttons('save');
/*
* Если в форме присутствует элемент textarea для ввода html-кода,
* Можно сделать предпросмотр результата ввода при помощи кнопки preview.
*/
...
->buttons('preview','save');
/*
* Кнопка delete автоматически спросит JavaScript-подтверждение (confirm) при нажатии.
*/
...
->buttons('preview','save','delete');
/*
* Данный вид записи аналогичен следующему.
*/
...
->buttons(array('preview','save','delete'));
/*
* Можно явно указать свойства кнопки.
*/
->buttons(array(
'preview'=>array('value'=>t('!edit preview'),'type'=>'button','onclick'=>'preview()'),
'save'=>array('value'=>t('save'),'type'=>'submit'),
'reset'=>array('type'=>'reset')
));
Перевод названий кнопок хранится в разделе интернационализации «edit».