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) { }
public function getExtendedType() { // textarea return 'textarea'; }
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() { // return 'form'; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( // . 'group' => null, )); } public function buildView(FormView $view, FormInterface $form, array $options) { $group = $options['group']; if (null === $group) { return; } $root = $this->getRootView($view); $root->vars['groups'][$group][] = $form->getName(); } public function getRootView(FormView $view) { $root = $view->parent; while (null === $root) { $root = $root->parent; } return $root; } }
{# 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 { /** * Form builder * @var FormBuidler */ private $builder; /** * Active group * @var mixed null|string */ private $group = null; public function __construct(FormBuilder $builder) { $this->builder = $builder; } /** * Add child to builder with group option */ 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; } /** * Set active group */ 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') ; }
Source: https://habr.com/ru/post/184484/
All Articles