Passed
Push — master ( fe0c03...8eed1b )
by Enjoys
12:27 queued 10:03
created

HtmlRenderer::output()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
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 6
cts 6
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\Renderer\AbstractRenderer;
12
use Enjoys\Forms\Renderer\Html\TypesRender\TypeRenderInterface;
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
        /** @var false|string $typeRenderClass */
37 22
        $typeRenderClass = Helper::arrayRecursiveSearchKeyMap(get_class($element), self::_MAP_)[0] ?? false;
38 22
        if ($typeRenderClass === false || !class_exists($typeRenderClass)) {
0 ignored issues
show
introduced by
The condition $typeRenderClass === false is always true.
Loading history...
39 12
            return new TypesRender\Input($element);
40
        }
41
        /** @var class-string<TypeRenderInterface> $typeRenderClass */
42 13
        return new $typeRenderClass($element);
43
    }
44
45 1
    public function rendererHiddenElements(): string
46
    {
47 1
        $html = [];
48 1
        foreach ($this->getForm()->getElements() as $element) {
49 1
            if ($element instanceof Hidden) {
50 1
                $this->getForm()->removeElement($element);
51 1
                $html[] = $element->baseHtml();
52
            }
53
        }
54 1
        return implode("\n", $html);
55
    }
56
57 1
    public function rendererElements(): string
58
    {
59 1
        $html = [];
60 1
        foreach ($this->getForm()->getElements() as $element) {
61 1
            $html[] = "<div>" . self::createTypeRender($element)->render() . "</div>";
62
        }
63 1
        return implode("\n", $html);
64
    }
65
66
    public function rendererElement(string $elementName): string
67
    {
68
        $element = $this->getForm()->getElement($elementName);
69
        if ($element === null) {
70
            return '';
71
        }
72
        return "<div>" . self::createTypeRender($element)->render() . "</div>";
73
    }
74
75 1
    public function output(): string
76
    {
77 1
        return sprintf(
78 1
            "<form%s>\n%s\n%s\n</form>",
79 1
            $this->getForm()->getAttributesString(),
80 1
            $this->rendererHiddenElements(),
81 1
            $this->rendererElements()
82 1
        );
83
    }
84
}
85