Passed
Push — 5.x ( 65a76f...3a1e20 )
by Enjoys
59s queued 13s
created

HtmlRenderer::output()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 2
Metric Value
eloc 5
c 2
b 0
f 2
dl 0
loc 7
ccs 5
cts 5
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Enjoys\Forms\Renderer\Html;
6
7
use Enjoys\Forms\Element;
8
use Enjoys\Forms\Elements;
9
use Enjoys\Forms\Elements\Hidden;
10
use Enjoys\Forms\Helper;
11
use Enjoys\Forms\Interfaces\TypeRenderInterface;
12
use Enjoys\Forms\Renderer\AbstractRenderer;
13
14
class HtmlRenderer extends AbstractRenderer
15
{
16
    private const _MAP_ = [
17
        TypesRender\Button::class => [
18
            Elements\Button::class,
19
            Elements\Submit::class,
20
            Elements\Reset::class,
21
            Elements\Image::class
22
        ],
23
        TypesRender\Radio::class => [
24
            Elements\Radio::class,
25
            Elements\Checkbox::class
26
        ],
27
        TypesRender\Select::class => Elements\Select::class,
28
        TypesRender\Html::class => [
29
            Elements\Html::class,
30
            Elements\Header::class
31
        ]
32
    ];
33
34 22
    public static function createTypeRender(Element $element): TypeRenderInterface
35
    {
36 22
        $typeRenderClass = Helper::arrayRecursiveSearchKeyMap(get_class($element), self::_MAP_)[0] ?? false;
37 22
        if ($typeRenderClass === false || !class_exists($typeRenderClass)) {
38 12
            return new TypesRender\Input($element);
39
        }
40 13
        return new $typeRenderClass($element);
41
    }
42
43 1
    private function rendererHiddenElements(): string
44
    {
45 1
        $html = [];
46 1
        foreach ($this->getForm()->getElements() as $element) {
47 1
            if ($element instanceof Hidden) {
48 1
                $this->getForm()->removeElement($element);
49 1
                $html[] = $element->baseHtml();
50
            }
51
        }
52 1
        return implode("\n", $html);
53
    }
54
55 1
    private function rendererElements(): string
56
    {
57 1
        $html = [];
58 1
        foreach ($this->getForm()->getElements() as $element) {
59 1
            $html[] = "<div>" . self::createTypeRender($element)->render() . "</div>";
60
        }
61 1
        return implode("\n", $html);
62
    }
63
64 1
    public function output(): string
65
    {
66 1
        return sprintf(
67
            "<form%s>\n%s\n%s\n</form>",
68 1
            $this->getForm()->getAttributesString(),
69 1
            $this->rendererHiddenElements(),
70 1
            $this->rendererElements()
71
        );
72
    }
73
}
74