Fork me on GitHub

Формы

Использует Symfony 2 компоненты, которые облегчают создание, отображение и валидацию форм.

|-- app/
    |-- Forms/          # Формы
      |-- Constraints/  # Правила валидации форм
      |-- PostForm.php  # Форма для добавления/редактирования сообщений пользователя
      `-- RegForm.php   # Форма для регистрации нового пользователя

Рассмотрим основные возможности формы на основе создания нового сообщения (поста).

Создание формы

С помощью действия newAction в контроллере app/Controllers/BlogController.php мы создаем новое сообщение (пост) и сохраняем его в базе данных. Пример показан ниже.

...
// Create object NewPost and set values
$ormPost = new Post();
$ormPost->setCreated(date($format));
// Create form
$form = $this->createForm(new PostForm(), $ormPost, array('action' => "/blog/new"));
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $user = $this->getUser();
    $username = $user->getUsername();
    // Create new post
    $models->load('Post', 'newPost', array('username' => $username, 'new_post' => $ormPost));
    ...
}

Само создание формы происходит с помощью функции:

// Create form
$form = $this->createForm(new PostForm(), $ormPost, array('action' => "/blog/new"));

В первом параметре передается объект формы класса PostForm app/Forms/PostForm.php, в котором задаются характеристики формы:

  • method (post или get)
  • action (/blog/new)
  • Поля формы (тип поля, параметры поля)
  • Опции по умолчанию (data_class,csrf_protection, csrf_field_name, intention и т.д.)

Во втором параметре передается объект данных класса Post app/Models/ORM/Post.php, в котором задаются характеристики таблицы post в базе данных app/Resources/db/app.db:

  • Column (name, type и т.д. )
  • Связи между таблицами (ManyToOne, JoinColumn и т.д.)
  • Правила валидации полей таблицы

В третьем параметре передаются параметры формы, заданные вручную.

array('action' => "/blog/new")

Валидация формы

Валидация данных формы происходит на двух уровнях:

  • Серверном
  • Клиентском

На серверном уровне мы проверяем признак отправки данных пользователем и делаем валидацию данных. Правила валидации задаются в объекте данных класса Post app/Models/ORM/Post.php.

...
if ($form->isSubmitted() && $form->isValid()) {
    ...
}

На клиентском уровне мы должны в шаблоне app/Views/Controller/blog/new.html.twig добавить сервис FormValidation и добавить правила валидации для этого сервиса.

...
<script type="text/javascript">
    BSA.ScriptResources.push('FormValidation');
    ...
    addScriptParams('FormValidation',
            {
                form: 'form[name="post"]',
                rules: {
                    "post[created]": {
                        required: true
                    },
                    "post[title]": {
                        required: true,
                        minlength: 5
                    },
                    "post[body]": {
                        required: true
                    }
                }
            });
    ...
</script>
...

Отображение формы

Вид отображения формы можно задать при конфигурации сервиса Twig в методе _iniProviders класса Bootstrap app/Bootstrap.php

...
// Twig
$app->register(
        new Silex\Provider\TwigServiceProvider(), array(
    ...
    #Global form templates
    'twig.form.templates' => array("Form/bootstrap_3_horizontal_layout.html.twig"),
    ...
));
...

или в файле конфигурации app/Resources/Config/config.yml

service_providers:
    ...
    twig:
        class: Silex\Provider\TwigServiceProvider
        construct_parameters: ~
        parameters:
            ...
            twig.form.templates:    
                #Global form templates
                - Form/bootstrap_3_horizontal_layout.html.twig
            ...
    ...

где задается параметр #Global form templates.

Сами шаблоны, которые определяют внешний вид формы, находятся в app/Views/Form.