Passed
Push — master ( 951dea...0f2edd )
by Bruno
10:24
created

FrameworkComposer::editableNodes()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 12
nc 5
nop 2
dl 0
loc 17
ccs 0
cts 0
cp 0
crap 20
rs 9.8666
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace Formularium;
4
5
use Formularium\Exception\ClassNotFoundException;
6
use Formularium\HTMLNode;
7
8
class FrameworkComposer
9
{
10
    /**
11
     * @var Framework[]
12
     */
13
    protected $frameworks = [];
14
15
    /**
16
     * @param Framework[] $frameworks
17
     */
18 5
    public function __construct(array $frameworks = [])
19
    {
20 5
        $this->setFrameworks($frameworks);
21 5
    }
22
23
    /**
24
     * @param Framework[] $frameworks
25
     */
26 4
    public static function create(array $frameworks = []): FrameworkComposer
27
    {
28 4
        return new self($frameworks);
29
    }
30
31
    /**
32
     *
33
     * @return Framework[]
34
     */
35 4
    public function getFrameworks(): array
36
    {
37 4
        return $this->frameworks;
38
    }
39
40
    /**
41
     *
42
     * @return Framework|null
43
     */
44 2
    public function getByName(string $name): ?Framework
45
    {
46 2
        foreach ($this->frameworks as $f) {
47 2
            if ($f->getName() === $name) {
48 2
                return $f;
49
            }
50
        }
51 1
        return null;
52
    }
53
54
    /**
55
     * @param Framework[] $frameworks
56
     * @return void
57
     */
58 5
    public function setFrameworks(array $frameworks = [])
59
    {
60 5
        $this->frameworks = [];
61 5
        foreach ($frameworks as $f) {
62 5
            $this->append($f);
63
        }
64 5
    }
65
66
    /**
67
     * Appends a framework to the queue
68
     *
69
     * @param string|Framework $framework
70
     * @return void
71
     */
72 5
    public function append($framework)
73
    {
74 5
        $this->frameworks[] = ($framework instanceof Framework ? $framework : Framework::factory($framework));
75 4
    }
76
77
    /**
78
     * Returns the html <head> contents for all frameworks.
79
     *
80
     * @return string
81
     */
82 1
    public function htmlHead(): string
83
    {
84 1
        $head = new HTMLNode('');
85 1
        foreach ($this->getFrameworks() as $framework) {
86 1
            $framework->htmlHead($head);
87
        }
88 1
        return $head->getRenderHTML();
89
    }
90
91 1
    public function htmlFooter(): string
92
    {
93 1
        $footer = new HTMLNode('');
94 1
        foreach ($this->getFrameworks() as $framework) {
95 1
            $framework->htmlFooter($footer);
96
        }
97 1
        return $footer->getRenderHTML();
98
    }
99
100
    /**
101
     * Renders an element
102
     *
103
     * @param string $elementName
104
     * @param array $parameters
105
     * @return HTMLNode The element HTMLNode
106
     */
107 1
    public function nodeElement(string $elementName, array $parameters = []): HTMLNode
108
    {
109 1
        $node = new HTMLNode('');
110 1
        foreach ($this->getFrameworks() as $framework) {
111
            try {
112 1
                $element = $framework->getElement($elementName);
113 1
                $node = $element->render($parameters, $node);
114
            } catch (ClassNotFoundException $e) {
115
                continue; // element default
116
            }
117
        }
118 1
        return $node;
119
    }
120
121
    /**
122
     * Renders an element to a string
123
     *
124
     * @param string $elementName
125
     * @param array $parameters
126
     * @return string The rendered HTML
127 1
     */
128
    public function element(string $elementName, array $parameters = []): string
129 1
    {
130 1
        return $this->nodeElement($elementName, $parameters)->getRenderHTML();
131 1
    }
132 1
133 1
    /**
134
     * Renders a Model with the loaded frameworks.
135 1
     *
136 1
     * @param Model $m
137 1
     * @param array $modelData Actual data for the fields to render. Can be empty.
138
     * @return HTMLNode[]
139
     */
140
    public function viewableNodes(Model $m, array $modelData): array
141
    {
142 1
        $elements = [];
143
        foreach ($m->getFields() as $field) {
144 1
            $value = $modelData[$field->getName()] ?? $field->getDataType()->getDefault(); // TODO: values?
145 1
            $html = new HTMLNode('');
146 1
            foreach ($this->getFrameworks() as $framework) {
147
                try {
148 1
                    $r = $framework->getRenderable($field->getDatatype());
149
                    $x = $r->viewable($value, $field, $html);
150
                    $html = $x;
151
                } catch (ClassNotFoundException $e) {
152
                    continue; // renderable default
153
                }
154
            }
155
            $elements[$field->getName()] = $html;
156
        }
157
        return $elements;
158
    }
159
160
    /**
161
     * Renders a Model with the loaded frameworks.
162
     *
163
     * @param Model $m
164
     * @param array $modelData Actual data for the fields to render. Can be empty.
165
     * @return string
166
     */
167
    public function viewable(Model $m, array $modelData): string
168
    {
169
        $elements = $this->viewableNodes($m, $modelData);
170
        $output = '';
171
        foreach ($this->getFrameworks() as $framework) {
172
            $output = $framework->viewableCompose($m, $elements, $output);
173
        }
174
        return $output;
175
    }
176
177
    /**
178
     * Renders a Model as an editable form with the loaded frameworks.
179
     *
180
     * @param Model $m
181
     * @param array $modelData Actual data for the fields to render. Can be empty.
182
     * @return HTMLNode[]
183
     */
184
    public function editableNodes(Model $m, array $modelData): array
185
    {
186
        $elements = [];
187
        foreach ($m->getFields() as $field) {
188
            $value = $modelData[$field->getName()] ?? $field->getDataType()->getDefault(); // TODO: values?
189
            $html = new HTMLNode('');
190
            foreach ($this->getFrameworks() as $framework) {
191
                try {
192
                    $r = $framework->getRenderable($field->getDatatype());
193
                    $html = $r->editable($value, $field, $html);
194
                } catch (ClassNotFoundException $e) {
195
                    continue; // renderable default
196
                }
197
            }
198
            $elements[$field->getName()] = $html;
199
        }
200
        return $elements;
201
    }
202
203
    /**
204
     * Renders a Model as an editable form with the loaded frameworks.
205
     *
206
     * @param Model $m
207
     * @param array $modelData Actual data for the fields to render. Can be empty.
208
     * @return string
209
     */
210
    public function editable(Model $m, array $modelData): string
211
    {
212
        $elements = $this->editableNodes($m, $modelData);
213
        $output = '';
214
        foreach ($this->getFrameworks() as $framework) {
215
            $output = $framework->editableCompose($m, $elements, $output);
216
        }
217
        return $output;
218
    }
219
}
220