рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдкреНрд░рдкрддреНрд░ рдпрдХреАрдирди Symfony2 рдХреЗ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рд╛рд░реА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдкреАрдЫреЗ рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд▓рдЪреАрд▓реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдирд┐рд╣рд┐рдд рд╣реИ рдЬреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдлрд╝реЙрд░реНрдо рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ), рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ, рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд░реЛрдВ рдФрд░ рдЯрд╛рдЗрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЖрдЬ рдмрд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рд╕рд┐рджреНрдзрд╛рдВрдд
рдкреНрд░рдХрд╛рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ (FormView) рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рднреАрддрд░, рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
public function buildForm(FormBuilderInterface $builder, array $options) { } public function buildView(FormView $view, FormInterface $form, array $options) { } public function finishView(FormView $view, FormInterface $form, array $options) { } public function setDefaultOptions(OptionsResolverInterface $resolver) { }
рдЖрдЗрдП рдЙрди рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
- рдмрд┐рд▓реНрдбрдлрд╝реЙрд░реНрдо - рдлреЙрд░реНрдордмреНрдпреБрд▓реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдлреЙрд░реНрдо рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рднреА рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИ;
- buildView - рдкреНрд░рдкрддреНрд░ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FormView рдФрд░ рдкреНрд░рдкрддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рднреАрддрд░, рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ;
- finishView - buildView рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
- setDefaultOptions - рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдпрд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП OptionsResolver рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо
setDefaultOptions рдФрд░
buildView рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдлрд╝реЙрд░реНрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ:
- setDefaultOptions - OptionsResolver рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ;
- buildView - рд╣рдо рд╡рд┐рдХрд▓реНрдк рдорд╛рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ;
- рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдкрддреНрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрджрд▓реЗрдВред
GetExtendedType рд╡рд┐рдзрд┐ рд╣рдореЗрдВ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
public function getExtendedType() {
рд╕рд┐рдореНрдлрдиреА 2 рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЯреИрдЧ
form.type_extension рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯреИрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрди рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ
рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
services: acme_demo.form.my_extension: class: Acme\DemoBundle\Form\Extension\MyExtension tags: - { name: form.type_extension, alias: textarea }
рдЕрднреНрдпрд╛рд╕
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ <рдлрд╝реАрд▓реНрдбрд╕реЗрдЯ> рддрддреНрд╡ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
<?php namespace Acme\DemoBundle\Form\Extension; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormView; use Symfony\Component\Form\FormInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\OptionsResolver\Options; class FieldsetExtension extends AbstractTypeExtension { private $rootView; public function getExtendedType() {
рдПрдХ рдкреНрд░рдкрддреНрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдБ:
{# src Acme/DemoBundle/Resources/views/Form/fields.html.twig #} {% extends 'form_div_layout.html.twig' %} {% block form_widget_compound %} <div {{ block('widget_container_attributes') }}> {% if form.parent is empty %} {{ form_errors(form) }} {% endif %} {% if form.vars.groups is defined %} {% for group,items in form.vars.groups %} <fieldset> <legend>{{ group|title|trans({}, translation_domain) }}</legend> {% for item in items %} {{ form_row(form[item]) }} {% endfor %} </fieldset> {% endfor %} {% endif %} {{ form_rest(form) }} </div> {% endblock form_widget_compound %}
рдирд┐рд░реНрднрд░рддрд╛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдирдпрд╛ рдлреЙрд░реНрдо рдмрдирд╛рдПрдБ:
<?php namespace Acme\DemoBundle\Form\Extension; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class PersonType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', 'text', array( 'group' => 'fio' )) ->add('surname', 'text', array( 'group' => 'fio' )) ->add('midname', 'text', array( 'group' => 'fio' )) ->add('phone', 'text', array( 'group' => 'contacts' )) ->add('skype', 'text', array( 'group' => 'contacts' )) ->add('email', 'text', array( 'group' => 'contacts' )) ; } }
рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ:
{# src Acme/DemoBundle/Resources/views/Person/new.html.twig #} {% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %} <form action="{{ path('person_create') }}" > {{ form_widget(form) }} </form>
рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрд░реЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП, рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рдВрд╢реНрд▓рд┐рд╖реНрдЯ рдЪреАрдиреА рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
<?php namespace Acme\DemoBundle\Form; use Symfony\Component\Form\FormBuilder; class FormMapper { private $builder; private $group = null; public function __construct(FormBuilder $builder) { $this->builder = $builder; } public function add($child, $type = null, array $options = array()) { if (!array_key_exists('group', $options) and null !== $this->group) { $options['group'] = $this->group; } $this->builder->add($child, $type, $options); return $this; } public function with($group) { $this->group = $group; return $this; } }
рд╕рдореВрд╣ рдкреНрд░рдмрдВрдзрди рдЕрдм рдЖрд╕рд╛рди рд╣реИ:
public function buildForm(FormBuilderInterface $builder, array $options) { $mapper = new FormMapper($builder); $mapper ->with('fio') ->add('name', 'text') ->add('surname', 'text') ->add('midname', 'text') ->with('contacts') ->add('phone', 'text') ->add('skype', 'text') ->add('email', 'text') ; }
рдЕрдиреНрдд
рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- рд╕рд┐рдореНрдлрдиреА 2 рдлреЙрд░реНрдо рдШрдЯрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ
- рд╕рд┐рдореНрдлрдиреА 2 рдлреЙрд░реНрдо рд░реЗрд╕рд┐рдкреА