Формы в symfony 1.1

Fabien, “Формы в symfony 1.1”, public translation into Russian from English More about this translation.

Translate into another language.

Форма состоит из полей, таких, как скрытые поля, текстовые поля, выпадающие списки, чекбоксы. Эта глава познакомит вас с созданием форм и управлением полями с помощью фреймворка форм 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-код

-->

Имя

Email

Сообщение

-->

Pages: ← previous Ctrl next
1 2 3 4

© sensiolabs

Original (English): Формы в symfony 1.1

Translation: © tyutin, Денис, Fenrir, hooey, Алексей, stalxed, d_evelop7, syroegkin, andreiko, Андрей Дягель, Olegbl4, Александр, Да так, akorenskoy84, hlomzik .

License: GFDL license

translated.by crowd

Like this translation? Share it or bookmark!