Passed
Pull Request — master (#28)
by Enjoys
21:42 queued 16:27
created

HtmlRenderer   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Test Coverage

Coverage 82.14%

Importance

Changes 5
Bugs 1 Features 3
Metric Value
wmc 11
eloc 37
c 5
b 1
f 3
dl 0
loc 68
ccs 23
cts 28
cp 0.8214
rs 10

5 Methods

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