-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathFormGenerator.php
137 lines (123 loc) · 4.39 KB
/
FormGenerator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
namespace Codete\FormGeneratorBundle;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
/**
* FormGenerator creates populated FormBuilder for any given class. Say goodbye to writing boring FormType classes!
*
* @author Maciej Malarz <[email protected]>
*/
class FormGenerator
{
/** @var AdjusterRegistry */
private $adjusterRegistry;
/** @var FormConfigurationFactory */
private $formConfigurationFactory;
/** @var FormFactoryInterface */
private $formFactory;
/**
* @param FormFactoryInterface $formFactory
*/
public function __construct(FormFactoryInterface $formFactory)
{
$this->adjusterRegistry = new AdjusterRegistry();
$this->formConfigurationFactory = new FormConfigurationFactory($this->adjusterRegistry);
$this->formFactory = $formFactory;
}
/**
* Adds modifier for form's configuration.
*
* @param FormConfigurationModifierInterface $modifier
* @param int $priority
*/
public function addFormConfigurationModifier(FormConfigurationModifierInterface $modifier, $priority = 0)
{
$this->adjusterRegistry->addFormConfigurationModifier($modifier, $priority);
}
/**
* Adds resolver for form's fields.
*
* @param FormFieldResolverInterface $resolver
* @param int $priority
*/
public function addFormFieldResolver(FormFieldResolverInterface $resolver, $priority = 0)
{
$this->adjusterRegistry->addFormFieldResolver($resolver, $priority);
}
/**
* Adds provider for defining default fields for form.
*
* @param FormViewProviderInterface $provider
* @param int $priority
*/
public function addFormViewProvider(FormViewProviderInterface $provider, $priority = 0)
{
$this->adjusterRegistry->addFormViewProvider($provider, $priority);
}
/**
* Creates FormBuilder and populates it.
*
* @param object $model data object
* @param string $form view to generate
* @param array $context
* @param array $options
* @return FormBuilderInterface
*/
public function createFormBuilder($model, $form = 'default', $context = [], $options=[])
{
$fb = $this->formFactory->createBuilder(FormType::class, $model, $options);
$this->populateFormBuilder($fb, $model, $form, $context);
return $fb;
}
/**
* Creates named FormBuilder and populates it.
*
* @param string $name
* @param object $model data object
* @param string $form view to generate
* @param array $context
* @param array $options
* @return FormBuilderInterface
*/
public function createNamedFormBuilder($name, $model, $form = 'default', $context = [], $options=[])
{
$fb = $this->formFactory->createNamedBuilder($name, FormType::class, $model, $options);
$this->populateFormBuilder($fb, $model, $form, $context);
return $fb;
}
/**
* Populates FormBuilder.
*
* @param FormBuilderInterface $fb
* @param object $model
* @param string $form view to generate
* @param array $context
*/
public function populateFormBuilder(FormBuilderInterface $fb, $model, $form = 'default', $context = [])
{
$configuration = $this->formConfigurationFactory->getConfiguration($form, $model, $context);
foreach ($this->adjusterRegistry->getFormConfigurationModifiers() as $modifier) {
if ($modifier->supports($model, $configuration, $context)) {
$configuration = $modifier->modify($model, $configuration, $context);
}
}
foreach ($configuration as $field => $options) {
$type = null;
if (isset($options['type'])) {
$type = $options['type'];
unset($options['type']);
}
foreach ($this->adjusterRegistry->getFormFieldResolvers() as $resolver) {
if ($resolver->supports($model, $field, $type, $options, $context)) {
$fb->add($resolver->getFormField($fb, $field, $type, $options, $context));
continue 2;
}
}
if (isset($options['options'])) {
$options = $options['options'];
}
$fb->add($field, $type, $options);
}
}
}