Генератор форм для новой версии CodeIgniter

Думаю, все кто работает с CodeIgniter в курсе – на этой недели вышла его очередная версия (1.7).
Изменения довольно интересные и существенные (на русском здесь). Самое главное – добавлена новая библиотека для проверки форм (Form Validation).
Предыдущая версия поддерживается, но использовать её не рекомендуется. Насколько я понял, разработчики не гарантируют, что она останется в будущих версиях фреймворка.
То же самое касается и моего генератора форм. Работать со старой версией можно, но код будет совместим только с версиями 1.6 и более ранними.
Т.к. отставать от развития не правильно, я написал новую версию генератора.
Старый вариант полностью поддерживается, но использовать его имеет смысл, только если вы не собираетесь переходить на новую версию фреймворка.
Внешний вид генератора не изменился. С помощью кнопки «Добавить» создаете нужное количество полей. Выбираете их тип и указываете имена, атрибуты и правила проверки.
Нажимаете кнопку «Генерировать код». После этого на вкладках «Контроллер», «Представление» и «CSS» появится созданный код.
Подробнее об этом вы сможете почитать в предыдущей статье.
Теперь кратко расскажу об основных изменениях в новой библиотеке.
Поддержка старой версии
Тут все просто. Файл новой библиотеки называется form_validation, а старой – validation. Т.е.
-
$this->load->library('validation');
загрузит старую версию, а
-
$this->load->library('form_validation');
новую.
На практике это означает, что если вы обновите CodeIgniter, то проверка форм будет работать также как и раньше, т.к. автоматически будет использоваться старый класс.
Добавление правил проверки и названий полей.
В старой версии для этого нужно было вызвать методы set_rules и set_fields
-
$fields['textfield'] = 'textfield';
-
$rules['textfield'] = 'required';
-
$this->validation->set_rules($rules);
-
$this->validation->set_fields($fields);
Новый вариант проще.
-
$this->form_validation->set_rules('textfield', 'lang:textfield', 'required');
Метод set_rules позволяет задавать одновременно имя (второй параметр) и правила проверки (третий параметр). Первый параметр должен совпадать с атрибутом name поля.
Обратите внимание на приставку lang: во втором параметре. Если вы напишите файл с переводами имен полей, то библиотека автоматически будет его использовать.
Кроме того, появилась возможность задавать правила проверки в конфигурационном файле. Для этого нужно просто создать в этом файле массив с параметрами полей.
Восстановление данных в форме (re-populating).
Эта функция используется для автоматического заполнения формы после перезагрузки страницы (обычно это делается, если часть полей была заполнена неправильно).
В старой версии это делалось так:
-
<input type="text" name="textfield" id="textfield" value="<?php if (isset($this->validation->textfield)) {echo $this->validation->textfield;} ?>" />
Теперь можно использовать более элегантное решение:
-
<input type="text" name="textfield" id="textfield" value="<?php echo set_value('textfield'); ?>" />
Как видите, не нужно делать проверку существования переменной.
Тоже самое касается вывода сообщений об ошибках.
Старый вариант:
-
<?php if (isset($this->validation->textfield_error)) {
-
echo $this->validation->textfield_error;
-
} ?>
Новый:
-
<?php echo form_error('textfield'); ?>
Как видите, изменения интересные и в основном направлены на сокращение вашего кода. Подробное описание библиотеки находится здесь.
До встречи!
P.S. Если вы заметили ошибки в работе генератора или у вас есть другие замечания, пожалуйста, напишите мне об этом. Буду исправлять
.
UPD. По просьбе Sam'а даю ссылки на архивы с исходниками:
Генератор форм для CodeIgniter 1.7
Генератор форм для CodeIgniter 1.6 и предыдущих
Код, выполняющий основную работу находится в файле lib/mainscripts.js
Понравилась статья? Подписывайтесь на продолжение
!
Опубликовано в CodeIgniter, PHP, Web разработка Комментарии (11) »
Комментарии (11)
Вы можете отслеживать обсуждение записи с помощью RSS 2.0 ![]()
Вы также можете оставить комментарий, или трекбек с Вашего сайта.









Похвально. Сделано хорошо. Единственный момент что не понравился, если не вводить поля id, value то в представлении они все равно отображаются только как id=". Я бы просто убрал этот код.
Убрать код, конечно, не сложно, но тут есть нюанс. Значение в столбце
name (id)используется для атрибутовnameиid. Без атрибута name создавать форму смысла не имеет. Поэтому нужно либо вообще не создавать id (а тогда не удобно задавать CSS стили), либо в генераторе добавлять еще один столбец и задавать name и id отдельно.С атрибутом value все проще, я просто добавлю проверку.
Спасибо за совет
Захотелось исходник, чтобы изготовить из него CLI-генератор, как в CakePHP/Symfony.
Выложил (в конце этого поста).
Честно говоря, выкладывать его я не планировал, поэтому комментариев там по минимуму. Если нужна будет помощь, пиши или сюда, или на мыло, или в аську
Основной код в lib/mainscripts.js
Для работы build.xml нужны две дополнительные задачи для Phing (подробнее здесь, ссылка на архив в конце поста)
P.S. Я практически не работал ни с CakePHP, ни с Symfony, поэтому взглянуть на результат будет очень интересно
Ага, я в этом тоже не особо силён, жду результатов.
У меня возникла проблема с библиотекой валидации версии фреймворка 1.7.1. Суть проблемы в следующем:
В своем проекте мне необходимо реализовать форму с неопределенным количеством полей вида:
[code][/code]
количество полей определяет сам пользователь, для этого средствами jQuery реализовано их "клонирование".
[i](для ясности поясню: на сайте можно указать неограниченное количество имен людей, при этом новые поля формы появляются после нажатия кнопки "+ДОБАВИТЬ")[/i]
Так как полей может быть много, то соответственно пришедшие значения должны быть массивом, как того требует логика, следовательно поля:
[code][/code]
[b]Сложность вот в чем:[/b] как производить независимую валидацию этих полей?
Чтобы ошибка в одном из них не привадила к показу ошибки всех полей с тем же именем массива.
Приведу код, который полностью соответствует документации:
[code]
Контроллер
$this->load->helper('form');
$this->load->library('form_validation');
$this->form_validation->set_rules('Pname[]', 'lang:Имя', 'required');
if ($this->form_validation->run() === FALSE) { //плохо //выводим отображение еще раз}
else { echo "OK!";}
Отображение
...
<input type="text" name="Pname[]" id="Pname" value="" />
<input type="text" name="Pname[]" id="Pname" value="" />
<input type="text" name="Pname[]" id="Pname" value="" />
...
...
[/code]
Ошибка в любом из полей приводит к показу ошибке у всех. К тому же, set_value('Pname[]') подставляет Array в поля ввода каждый раз при отправке.
Если кто-то решал подобную задачу, либо решал похожую проблему, просьба помочь! За мной не заржавеет!
Очень интересный вопрос, раньше не обращал на этот момент внимания.
Полностью решить проблему не получилось, но кое-что установить удалось.
1) данные для автоматического заполнения формы находятся в массиве.
array
0 => string 'wffds' (length=5)
1 => string 'sfa' (length=3)
2 => string " (length=0)
Т.е., судя по всему, разработчики CI предполагают, что выводить такие поля вы будете в цикле вроде:
foreach ($fields as $key => $field) {
echo '<input … value="<set_value('Pname[$key]');>">'…;
}
2) Сообщение об ошибке создается одно для всей группы полей. Логика тоже понятна, раз поля однотипные, то и правила одинаковые. Конечно, при таком подходе установить где именно возникла ошибка невозможно. Явная недоработка с их стороны.
3) Аттрибут id должен быть уникальным для всей страницы.
Интересно А, тяжело "достроить" этот генератор до вида, подобного http://www.phpform.org/ И чтобы кнопочки можно было выбирать: "Отправить", "Искать", "Редактировать", …
)
"Как мед, так и ложкой"
Достроить можно до чего угодно
Но! Free HTML Form Builder создает форму полностью, т.е. с оформлением, а тут стояла другая задача – сделать каркас для форму, который можно вставить в существующее приложение и подогнать под общий дизайн.
я имел ввиду функциональную реализацию.
Дизайн "вынесем за скобки".
Благодарю за внимание.
Спасибо за информацию