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\RendererInterface; |
12
|
|
|
use Enjoys\Forms\Renderer\Html\TypesRender\TypeRenderInterface; |
13
|
|
|
use Enjoys\Forms\Renderer\Renderer; |
14
|
|
|
|
15
|
|
|
class HtmlRenderer extends Renderer implements RendererInterface |
|
|
|
|
16
|
|
|
{ |
17
|
|
|
private const _MAP_ = [ |
18
|
|
|
TypesRender\Button::class => [ |
19
|
|
|
Elements\Button::class, |
20
|
|
|
Elements\Submit::class, |
21
|
|
|
Elements\Reset::class, |
22
|
|
|
Elements\Image::class |
23
|
|
|
], |
24
|
|
|
TypesRender\Radio::class => [ |
25
|
|
|
Elements\Radio::class, |
26
|
|
|
Elements\Checkbox::class |
27
|
|
|
], |
28
|
|
|
TypesRender\Select::class => Elements\Select::class, |
29
|
|
|
TypesRender\Html::class => [ |
30
|
|
|
Elements\Html::class, |
31
|
|
|
Elements\Header::class |
32
|
|
|
] |
33
|
|
|
]; |
34
|
|
|
|
35
|
22 |
|
public static function createTypeRender(Element $element): TypeRenderInterface |
36
|
|
|
{ |
37
|
|
|
/** @var false|string $typeRenderClass */ |
38
|
22 |
|
$typeRenderClass = Helper::arrayRecursiveSearchKeyMap(get_class($element), self::_MAP_)[0] ?? false; |
39
|
22 |
|
if ($typeRenderClass === false || !class_exists($typeRenderClass)) { |
|
|
|
|
40
|
12 |
|
return new TypesRender\Input($element); |
41
|
|
|
} |
42
|
|
|
/** @var class-string<TypeRenderInterface> $typeRenderClass */ |
43
|
13 |
|
return new $typeRenderClass($element); |
44
|
|
|
} |
45
|
|
|
|
46
|
1 |
|
public function rendererHiddenElements(): string |
47
|
|
|
{ |
48
|
1 |
|
$html = []; |
49
|
1 |
|
foreach ($this->getForm()->getElements() as $element) { |
50
|
1 |
|
if ($element instanceof Hidden) { |
51
|
1 |
|
$this->getForm()->removeElement($element); |
52
|
1 |
|
$html[] = $element->baseHtml(); |
53
|
|
|
} |
54
|
|
|
} |
55
|
1 |
|
return implode("\n", $html); |
56
|
|
|
} |
57
|
|
|
|
58
|
1 |
|
public function rendererElements(): string |
59
|
|
|
{ |
60
|
1 |
|
$html = []; |
61
|
1 |
|
foreach ($this->getForm()->getElements() as $element) { |
62
|
1 |
|
$html[] = "<div>" . self::createTypeRender($element)->render() . "</div>"; |
63
|
|
|
} |
64
|
1 |
|
return implode("\n", $html); |
65
|
|
|
} |
66
|
|
|
|
67
|
|
|
public function rendererElement(string $elementName): string |
68
|
|
|
{ |
69
|
|
|
$element = $this->getForm()->getElement($elementName); |
70
|
|
|
if ($element === null) { |
71
|
|
|
return ''; |
72
|
|
|
} |
73
|
|
|
return "<div>" . self::createTypeRender($element)->render() . "</div>"; |
74
|
|
|
} |
75
|
|
|
|
76
|
1 |
|
public function output(): string |
77
|
|
|
{ |
78
|
1 |
|
return sprintf( |
79
|
1 |
|
"<form%s>\n%s\n%s\n</form>", |
80
|
1 |
|
$this->getForm()->getAttributesString(), |
81
|
1 |
|
$this->rendererHiddenElements(), |
82
|
1 |
|
$this->rendererElements() |
83
|
1 |
|
); |
84
|
|
|
} |
85
|
|
|
} |
86
|
|
|
|
This interface has been deprecated. The supplier of the interface has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the interface will be removed and what other interface to use instead.