Формы в symfony 1.1 |
- Statistics
- Participants
- Translate into Russian
- Translation result
- 98% translated in draft. Almost done, let's finish it!
Форма состоит из полей, таких, как скрытые поля, текстовые поля, выпадающие списки, чекбоксы. Эта глава познакомит вас с созданием форм и управлением полями с помощью фреймворка форм symfony.
Для выполнения упражнений из книги требуется Symfony 1.1. Кроме того, для дальнейшей работы вам нужно будет создать проект и приложение. Для более полной информации о создании проекта, читайте Введение.
Прежде, чем мы начнём
Начнём с добавления формы обратной связи к приложению.
На рисунке 1-1 изображена форма обратной связи так, как её видит пользователь.
Рисунок 1-1 — Форма обратной связи
Форма обратной связи
Создадим три поля: имя пользователя, его email и сообщение, которое он хочет отправить. Для выполнения упражнения мы просто отобразим информацию, переданную формой, как показано на рисунке 1-2.
Рисунок 1-2 - Страница благодарности
Страница благодарности
Рисунок 1-3 показывает процесс взаимодействия между приложением и пользователем.
Рисунок 1-3 — Взаимодействие с пользователем
Схема взаимодействия с пользователем
Виджеты
Классы sfForm и sfWidget
Пользователи вводят информацию в поля, составляющие форму. Форма в symfony — это объект, наследующий класс sfForm. В нашем примере мы создадим класс ContactForm, наследующий класс sfForm. sfForm — это базовый класс для всех форм. sfForm облегчает управление конфигурацией и жизненным циклом ваших форм.
sfForm — это базовый класс для всех форм, облегчающий управление конфигурацией и жизненным циклом ваших форм.
Настройку формы можно начать с добавления виджетов в методе configure().
Виджет представляет поле формы. Для формы нашего примера добавим три виджета, представляющих ее поля: имя, email и сообщение. На листинге 1-1 показана первая реализация класса ContactForm.
Листинг 1-1 — Класс ContactForm с тремя полями
// lib/form/ContactForm.class.php
class ContactForm extends sfForm
{
public function configure()
{
$this->setWidgets(array(
'name' => new sfWidgetFormInput(),
'email' => new sfWidgetFormInput(),
'message' => new sfWidgetFormTextarea(),
));
}
}
Виджеты определяются в методе configure(). Этот метод автоматически вызывается конструктором класса sfForm.
Метод setWidgets() используется для определения виджетов, используемых в форме. Он принимает ассоциативный массив, в котором ключами являются имена полей, а значениями — объекты-виджеты. Каждый виджет — это класс, наследующий sfWidget. В этом примере мы использовали два типа виджетов:
* sfWidgetFormInput: Этот виджет представляет поле ввода
* sfWidgetFormTextarea: Этот виджет представляет поле textarea.
По соглашению мы храним классы формы в папке lib/form/. Вы можете располагать их в любой папке, подхватываемой механизмом автозагрузки symfony, но, как мы увидим позднее, symfony использует папку lib/form/ для генерации форм из объектов модели.
Отображение формы
Теперь наша форма готова к использованию и мы можем создать модуль для ее отображения:
$ cd ~/ПУТЬ/К/ПРОЕКТУ
$ php symfony generate:module frontend contact
Изменим действие index модуля обратной связи так, чтоб передать экземпляр формы в шаблон, как показано в листинге 1-2.
Листинг 1-2 — Класс действий модуля обратной связи
// apps/frontend/modules/contact/actions/actions.class.php
class contactActions extends sfActions
{
public function executeIndex()
{
$this->form = new ContactForm();
}
}
При создании формы определенный ранее метод configure() будет вызван автоматически.
Осталось создать шаблон для вывода формы, как показано в листинге 1-3.
Листинг 1-3 — Шаблон для вывода формы
// apps/frontend/modules/contact/templates/indexSuccess.php
<form action="<?php echo url_for('contact/submit') ?>" method="POST">
<table>
<?php echo $form ?>
<tr>
<td colspan="2">
<input type="submit" />
</td>
</tr>
</table>
</form>
Форма symfony поддерживает только виджеты, отображающие информацию пользователям. В шаблоне indexSuccess строка <?php echo $form ?> всего лишь выводит три поля. Другие элементы, такие как тег <form> и кнопка submit, должны быть добавлены разработчиком. На первый взгляд это может показаться неочевидным, но в дальнейшем мы покажем, как полезно и просто объединять формы.
Использование конструкции <?php echo $form ?> очень полезно при создании прототипов и определении форм. Это позволяет разработчикам сконцентрироваться на бизнес-логике, не беспокоясь о визуальных аспектах. В главе 3 будет объяснено, как персонализировать шаблон и раскладку формы.
При отображении объекта с использованием <?php echo $form ?> ядро PHP в действительности выводит текстовое представление объекта $form. Для преобразования объекта в строку PHP пытается выполнить «магический» метод __toString(). Каждый виджет реализует этот магический метод для преобразования объекта в HTML-код. Вызов <?php echo $form ?> в таком случае эквивалентен вызову <?php echo $form->__toString() ?>.
Теперь мы можем увидеть форму в браузере (рисунок 1-4) и проверить результат, набрав адрес действия contact/index (/frontend_dev.php/contact).
Рисунок 1-4 — Сгенерированная форма обратной связи
Сгенерированная форма обратной связи
Листинг 1-4 Сгенерированный шаблоном HTML-код
-->
Имя
Сообщение
-->
