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

Владимир | | CodeIgniter, PHP, Web разработка.

codeigniter form generator 1.7

Думаю, все кто работает с 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

  • Taral

    Похвально. Сделано хорошо. Единственный момент что не понравился, если не вводить поля id, value то в представлении они все равно отображаются только как id=». Я бы просто убрал этот код.

    • Убрать код, конечно, не сложно, но тут есть нюанс. Значение в столбце name (id) используется для атрибутов name и id. Без атрибута name создавать форму смысла не имеет. Поэтому нужно либо вообще не создавать id (а тогда не удобно задавать CSS стили), либо в генераторе добавлять еще один столбец и задавать name и id отдельно.

      С атрибутом value все проще, я просто добавлю проверку.

      Спасибо за совет 🙂

  • Taral

    Похвально. Сделано хорошо. Единственный момент что не понравился, если не вводить поля id, value то в представлении они все равно отображаются только как id=». Я бы просто убрал этот код.

    • Убрать код, конечно, не сложно, но тут есть нюанс. Значение в столбце name (id) используется для атрибутов name и id. Без атрибута name создавать форму смысла не имеет. Поэтому нужно либо вообще не создавать id (а тогда не удобно задавать CSS стили), либо в генераторе добавлять еще один столбец и задавать name и id отдельно.

      С атрибутом value все проще, я просто добавлю проверку.

      Спасибо за совет 🙂

  • Sam

    Захотелось исходник, чтобы изготовить из него CLI-генератор, как в CakePHP/Symfony.

    • Выложил (в конце этого поста).
      Честно говоря, выкладывать его я не планировал, поэтому комментариев там по минимуму. Если нужна будет помощь, пиши или сюда, или на мыло, или в аську 😉
      Основной код в lib/mainscripts.js
      Для работы build.xml нужны две дополнительные задачи для Phing (подробнее здесь, ссылка на архив в конце поста)

      P.S. Я практически не работал ни с CakePHP, ни с Symfony, поэтому взглянуть на результат будет очень интересно 😉

  • Sam

    Захотелось исходник, чтобы изготовить из него CLI-генератор, как в CakePHP/Symfony.

    • Выложил (в конце этого поста).
      Честно говоря, выкладывать его я не планировал, поэтому комментариев там по минимуму. Если нужна будет помощь, пиши или сюда, или на мыло, или в аську 😉
      Основной код в lib/mainscripts.js
      Для работы build.xml нужны две дополнительные задачи для Phing (подробнее здесь, ссылка на архив в конце поста)

      P.S. Я практически не работал ни с CakePHP, ни с Symfony, поэтому взглянуть на результат будет очень интересно 😉

  • Ага, я в этом тоже не особо силён, жду результатов.

  • Ага, я в этом тоже не особо силён, жду результатов.

  • Chuuuvi

    У меня возникла проблема с библиотекой валидации версии фреймворка 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 должен быть уникальным для всей страницы.

  • Chuuuvi

    У меня возникла проблема с библиотекой валидации версии фреймворка 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 должен быть уникальным для всей страницы.

  • zanuda

    Интересно А, тяжело «достроить» этот генератор до вида, подобного http://www.phpform.org/ И чтобы кнопочки можно было выбирать: «Отправить», «Искать», «Редактировать», …
    «Как мед, так и ложкой» :))

    • Достроить можно до чего угодно 🙂
      Но! Free HTML Form Builder создает форму полностью, т.е. с оформлением, а тут стояла другая задача — сделать каркас для форму, который можно вставить в существующее приложение и подогнать под общий дизайн.

      • zanuda

        я имел ввиду функциональную реализацию.
        Дизайн «вынесем за скобки».
        Благодарю за внимание.

  • zanuda

    Интересно А, тяжело «достроить» этот генератор до вида, подобного http://www.phpform.org/ И чтобы кнопочки можно было выбирать: «Отправить», «Искать», «Редактировать», …
    «Как мед, так и ложкой» :))

    • Достроить можно до чего угодно 🙂
      Но! Free HTML Form Builder создает форму полностью, т.е. с оформлением, а тут стояла другая задача — сделать каркас для форму, который можно вставить в существующее приложение и подогнать под общий дизайн.

      • zanuda

        я имел ввиду функциональную реализацию.
        Дизайн «вынесем за скобки».
        Благодарю за внимание.

  • zanuda

    Спасибо за информацию

  • zanuda

    Спасибо за информацию