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

HtmlRenderer   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 3
Bugs 0 Features 2
Metric Value
wmc 9
eloc 33
c 3
b 0
f 2
dl 0
loc 57
ccs 22
cts 22
cp 1
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A createTypeRender() 0 7 3
A rendererElements() 0 7 2
A rendererHiddenElements() 0 10 3
A output() 0 7 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