Формы
Использует 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
.