This repository has been archived by the owner on Sep 23, 2022. It is now read-only.
/
DefaultFormCreator.php
74 lines (58 loc) · 2.19 KB
/
DefaultFormCreator.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
<?php
namespace Knp\RadBundle\Form;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\Event\DataEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;
use Knp\RadBundle\Reflection\ClassMetadataFetcher;
class DefaultFormCreator implements FormCreatorInterface, EventSubscriberInterface
{
private $fetcher;
private $factory;
private $dataTypeGuesser;
public function __construct(ClassMetadataFetcher $fetcher = null, FormFactoryInterface $factory, DataTypeGuesser $dataTypeGuesser)
{
$this->fetcher = $fetcher ?: new ClassMetadataFetcher;
$this->factory = $factory;
$this->dataTypeGuesser = $dataTypeGuesser;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SET_DATA => 'preSetData'
);
}
public function create($object, $purpose = null, array $options = array())
{
$builder = $this->factory->createBuilder('form', $object, $options);
return $builder->getForm();
}
public function preSetData(DataEvent $event)
{
$object = $event->getData();
$form = $event->getForm();
if (!is_object($object)) {
return;
}
$this->dataTypeGuesser->setData($object);
foreach ($this->fetcher->getMethods($object) as $method) {
if (0 === strpos($method, 'get') || 0 === strpos($method, 'is')) {
$propertyName = $this->extractPropertyName($method);
if ($this->hasRelatedSetter($object, $propertyName)) {
$form->add($this->factory->createForProperty(get_class($object), $propertyName));
}
}
}
foreach ($this->fetcher->getProperties($object) as $property) {
$form->add($this->factory->createForProperty(get_class($object), $property));
}
}
private function extractPropertyName($methodName)
{
return lcfirst(preg_replace('#is|get#', '', $methodName));
}
private function hasRelatedSetter($object, $propertyName)
{
return $this->fetcher->hasMethod($object, 'set'.ucfirst($propertyName));
}
}