Powered by CodeIgniter

Формы

Большая часть времени разработки веб-приложения обычно уходит на создание и обработку форм. Мы решили оптимизировать процесс, сделав его максимально простым и приятным.
Структура формы задается в коде контроллера вместе со всеми дополнительными параметрами.
/* * Задаем форму. */ $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',...) ...

Результат автоматического перевода

Вы можете указать параметры «label» и «description» явным образом при необходимости.$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».