Completed
Push — master ( 3a8823...81c6e7 )
by Piotr
02:46
created

ResourceFormBuilder   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 129
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Importance

Changes 0
Metric Value
wmc 12
lcom 1
cbo 8
dl 0
loc 129
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A build() 0 13 1
A getResourceGroup() 0 13 2
A createPropertyPath() 0 11 2
A createFormData() 0 14 2
A buildForm() 0 16 2
A normalizeKey() 0 4 1
A buildResourceName() 0 4 1
1
<?php
2
3
namespace FSi\Bundle\AdminBundle\Admin\ResourceRepository;
4
5
use FSi\Bundle\AdminBundle\Exception\RuntimeException;
6
use FSi\Bundle\ResourceRepositoryBundle\Model\ResourceValueRepository;
7
use FSi\Bundle\ResourceRepositoryBundle\Repository\MapBuilder;
8
use Symfony\Component\Form\FormFactoryInterface;
9
use Symfony\Component\Form\FormBuilderInterface;
10
use Symfony\Component\PropertyAccess\PropertyAccess;
11
12
class ResourceFormBuilder
13
{
14
    /**
15
     * @var \Symfony\Component\Form\FormFactoryInterface
16
     */
17
    protected $formFactory;
18
19
    /**
20
     * @var \FSi\Bundle\ResourceRepositoryBundle\Repository\MapBuilder
21
     */
22
    protected $mapBuilder;
23
24
    public function __construct(FormFactoryInterface $formFactory, MapBuilder $mapBuilder)
25
    {
26
        $this->formFactory = $formFactory;
27
        $this->mapBuilder = $mapBuilder;
28
    }
29
30
    public function build(Element $element)
31
    {
32
        $resources = $this->getResourceGroup($element->getKey());
33
34
        $builder = $this->formFactory->createBuilder(
35
            'form',
36
            $this->createFormData($element, $element->getRepository(), $resources),
37
            $element->getResourceFormOptions()
38
        );
39
40
        $this->buildForm($element, $builder, $resources);
41
        return $builder->getForm();
42
    }
43
44
    /**
45
     * @param string $key
46
     * @return array
47
     * @throws RuntimeException
48
     */
49
    private function getResourceGroup($key)
50
    {
51
        $map = $this->mapBuilder->getMap();
52
        $propertyPath = $this->createPropertyPath($key);
53
        $accessor = PropertyAccess::createPropertyAccessor();
54
55
        $resources = $accessor->getValue($map, $propertyPath);
56
        if (!is_array($resources)) {
57
            throw new RuntimeException(sprintf('%s its not a resource group key', $key));
58
        }
59
60
        return $resources;
61
    }
62
63
    /**
64
     * @param $key
65
     * @return string
66
     */
67
    private function createPropertyPath($key)
68
    {
69
        $parts = explode('.', $key);
70
        $propertyPath = '';
71
72
        foreach ($parts as $part) {
73
            $propertyPath .= sprintf("[%s]", $part);
74
        }
75
76
        return $propertyPath;
77
    }
78
79
    /**
80
     * @param Element $element
81
     * @param \FSi\Bundle\ResourceRepositoryBundle\Model\ResourceValueRepository $valueRepository
82
     * @param array|\FSi\Bundle\ResourceRepositoryBundle\Repository\Resource\Type\ResourceInterface[] $resources
83
     * @return array
84
     */
85
    private function createFormData(
86
        Element $element,
87
        ResourceValueRepository $valueRepository,
88
        array $resources
89
    ) {
90
        $data = array();
91
92
        foreach ($resources as $resourceKey => $resource) {
93
            $resourceName = $this->buildResourceName($element, $resourceKey);
94
            $data[$this->normalizeKey($resourceName)] = $valueRepository->get($resource->getName());
95
        }
96
97
        return $data;
98
    }
99
100
    /**
101
     * @param Element $element
102
     * @param \Symfony\Component\Form\FormBuilderInterface $builder
103
     * @param array|\FSi\Bundle\ResourceRepositoryBundle\Repository\Resource\Type\ResourceInterface[] $resources
104
     */
105
    private function buildForm(
106
        Element $element,
107
        FormBuilderInterface $builder,
108
        array $resources
109
    ) {
110
        foreach ($resources as $resourceKey => $resource) {
111
            $resourceName = $this->buildResourceName($element, $resourceKey);
112
            $builder->add(
113
                $this->normalizeKey($resourceName),
114
                'resource',
115
                array(
116
                    'resource_key' => $resourceName,
117
                )
118
            );
119
        }
120
    }
121
122
    /**
123
     * @param string $key
124
     * @return string
125
     */
126
    private function normalizeKey($key)
127
    {
128
        return str_replace('.', '_', $key);
129
    }
130
131
    /**
132
     * @param Element $element
133
     * @param string $resourceKey
134
     * @return string
135
     */
136
    private function buildResourceName(Element $element, $resourceKey)
137
    {
138
        return sprintf("%s.%s", $element->getKey(), $resourceKey);
139
    }
140
}
141