Простая генерация форм при помощи FuelPHP

Благодаря FuelPHP классу fieldset, работа с формами может быть очень простой.

Используя несколько строк кода, вы можете легко сгенерировать и проверить форму. Сегодня мы узнаем, как это сделать. Здесь вы можете посетить бесплатный интернет магазин

Класс Fieldset используется для создания формы и управления её проверкой объектно-ориентированным способом. Он использует классы Form и Validation. Сам класс непосредственно предназначен только для того, чтобы смоделировать набор полей формы, в то время, как два других класса выполняют основную работу.

Установка Fuel

Нам нужно установить FuelPHP с подключённым пакетом RM. Мы собираемся использовать базу данных MySQL со стандартной таблицей. В то время, как класс Fieldset может быть сконфигурирован с использованием обычной модели, использование ORM сэкономит нам немного времени.

Если вы не читали два урока, посвящённые FuelPHP, на сайте Nettuts+, сейчас самое время прочитать первую (eng.) и вторую (eng.) статьи от Phil Sturgeon.

Настройте соединение базы данных в fuel/app/config/development/db.php.

Включите пакет ORM через fuel/app/config.php

И наконец, вот SQL код для таблицы, которую мы используем в этом уроке.

Модель

Нам нужна модель для нашего контроллера, чтобы работать с таблицей постов. Создайте post.php в app/classes/model/. Затем создайте класс Model_Post и убедитесь, что он расширяет \Orm\Model. ORM автоматически будет использовать таблицу posts в нашей базе данных, т.к. мы использовали только её. Если вы хотите установить другую таблицу, настройте статическое свойство $_table_name.

Настройка свойств

Мы должны определить столбцы нашей таблицы постов в пределах нашей модели. В то же время, мы можем также установить метки, правила проверки формы для использования с нашим классом fieldset, чтобы сгенерировать форму. Всё это вместе входит в связанный массив $_properties. Если собрать всё воедино, наша конечная модель должна выглядеть так:

Давайте узнаем, какие опции мы можем использовать. data_type просто определяет тип поля. Это может быть string (строка), integer (целое число) или mysql_date. Значение свойства label будет показано, как метка поля, когда форма будет сформирована. validation вводит массив правил проверки. По умолчанию, эти поля являются текстовыми. Но используя form, вы можете изменить их тип на select или texarea.

ORM обрабатывает столбец под названием id, как первичный, и он не будет показан во время генерации формы. Если у вас другой первичный столбец таблицы, используйте свойство $_primary_key, чтобы определить его.

Контроллер

Теперь, когда модель готова, давайте создадим контроллер. Контроллеры должны быть размещены в fuel/app/classes/controller/. Мы создали контроллер, под названием Controller_Posts (posts.php) и расширили его из Controller_Template.

Пользователи смогут видеть список постов, добавлять новые или редактировать существующие. Поскольку мы используем шаблонный контроллер, мы можем использовать для работы основной файл шаблона. Шаблоны находятся в fuel/app/views/template.php

Это просто стандартная HTML разметка. Переменная $content будет содержать контент. Мы можем установить массив переменных, и если мы так сделаем, то этот массив будет отображён в виде неупорядоченного списка.

Добавление новых постов

Вот теперь начинаются развлечения. Мы собираемся создать форму для добавления новых постов. Как вы, возможно, предположили, мы будем работать с методом action_add(). Давайте сгенерируем форму и передадим её нашему шаблону.

Fieldset::forge() возвращает новый экземпляр класса поля. Это идентично выполнению new Fieldset. Однако, использование здесь метода forge позволяет нам указать название нового экземпляра класса. Если мы назовём свой класс второй раз одинаковым именем, существующий экземпляр класса будет возвращён, если это доступно [the Factory pattern]. Чтобы назвать свой класс, передайте название методу forge. Fieldset::forge('new_post')

Используя метод add_model, мы передаём модель, из которой должны генерироваться формы. Fieldset возмет информацию из $_properties, чтобы сгенерировать форму. Вызов метода form() из объекта fieldset возвратит экземпляр класса Form, а вызывая метод build(), мы можем получить html (строковый) вывод формы.

Наконец, мы передаём $form шаблону, как контент. Другой метод передачи переменных шаблону это $this->template->content = $form.

Запустите свой браузер и введите в адресную строку http://path_to_site/index.php/posts/add. Вы должны увидеть форму, идентичную этой.

форма

Нет кнопки подтверждения? Давайте исправим это. Нам нужно добавить новое поле нашему объекту формы.

Используя метод add, мы можем добавлять дополнительные поля в нашу форму. Первый параметр это новое название поля, второй — его метка, а третьим параметром мы передаём массив атрибутов.

После добавления, наш action_add() будет выглядеть так.

А наша форма...

tut_img_2

Проверка и сохранение

Теперь, когда у нас есть форма, давайте проверим её правильность и сохраним в базе данных. Объект fieldset включает экземпляр класса валидации FuelPHP. Все правила применены и готовы к работе.

$fieldset->validation() передаёт экземпляр класса валидации, и обратившись к его методу run(), мы можем проверить, пройдена ли валидация. Если так, мы добавляем новый пост в нашу базу данных. $fieldset->validated() возвращает массив проверенных полей. Если проверка пройдена, и пост сохранён, пользователь будет переадресован на страницу редактирования, в противном случае ошибки проверки будут переданы нашему шаблону, как переменная сообщения.

Если вы попытаетесь подтвердить какие-либо недопустимые данные, вы получите подобный результат:

tut_img_3

Всё, кажется, прекрасно, за исключением одной проблемы: данные, которые мы подтвердили не появляются после перезагрузки страницы. Не волнуйтесь, один запрос метода и всё готово.

Круто? Добавьте какие-то допустимые данные, и вы будете переадресованы к методу action_edit(), который ещё не готов.

Редактирование поста

Редактирование очень похоже на добавление поста. За исключением того, что мы должны заполнить секцию данными из существующего поста. Мы собираемся дублировать код action_add.

С некоторыми небольшими модификациями нашего метода action_add(), у нас есть свой метод редактирования. Метод repopulate() был заменён на метод populate(). Используя метод populate, мы можем заполнить форму существующими данными поста.

В этом случае мы получаем пост из нашей базы данных, используя параметр $id, а затем передаём его необходимому методу. Мы больше не нуждаемся в $post = new Model_Post;, поскольку мы ничего не добавили в базу данных. Объект $post, который мы создаём в начале, используется, чтобы назначить новые значения. Как только пост отредактирован, вы будете переадресованы назад к экрану редактирования. Всё готово! Добавьте несколько постов и попытайтесь их отредактировать.

Страницы списка

Давайте создадим раздел списка постов, так пользователи смогут увидеть все посты в одном месте.

Список будет обработан методом action_index().

Model_Post::find('all') возвратит массив объектов всех наших постов. Используя View::forge(), мы создаём новый объект просмотра. Параметр для View::forge() — это название нашего определённого просмотра. Они располагаются в app/views/listing.php. Затем массив объектов постов ($posts) передаётся нашему «view». «Listing» позаботится о списке, и наконец, мы назначаем просмотр на $this->template->content.

В просмотре мы выполняем цикл в $posts и генерируем список.

Если у вас есть несколько постов в базе данных, то это должно выглядеть так.

tut_img_4

Некоторые конечные доработки

Кажется всё работает правильно; однако, есть некоторые незначительные проблемы. У сгенерированной формы есть текстовое поле для контента поста, которое будет лучше выглядеть, как textarea.

Вы можете передать все типы полей: text, textarea, select, radio и т.д. Для элементов select или radio вы можете установить опции. Установка опций для select, используя другую таблицу также возможна. Если вы хотите изменить стандартную разметку, поместите файл конфигурации формы в fuel/app/config/form.php. Если вы не уверены, что ставить туда, скопируйте материал из fuel/core/config/form.php. Fuel использует этот файл для генерации форм.

Итоги

Мы надеемся, у вас теперь есть ясное понимание класса fieldset. Если у вас есть какие-нибудь вопросы, задавайте их в комментариях. Большое спасибо за чтение!


4 комментарий на “Простая генерация форм при помощи FuelPHP

  1. Очень интересно. Начинаю осваивать этот фреймворк, ваша статья очень помогла начать. Спасибо и удачи в развитии!

    Thumb up 0 Thumb down 0

Оставить комментарий