blob: 97ad10c87fa0f410118f5c09c1e2a682a184bafb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
<?php
namespace ipl\Web\Compat;
use http\Exception\InvalidArgumentException;
use ipl\Html\Contract\FormSubmitElement;
use ipl\Html\Form;
use ipl\Html\FormElement\SubmitButtonElement;
use ipl\Html\FormElement\SubmitElement;
use ipl\Html\HtmlDocument;
use ipl\Html\HtmlString;
use ipl\I18n\Translation;
use ipl\Web\FormDecorator\IcingaFormDecorator;
class CompatForm extends Form
{
use Translation;
protected $defaultAttributes = ['class' => 'icinga-form icinga-controls'];
/**
* Render the content of the element to HTML
*
* A duplicate of the primary submit button is being prepended if there is more than one present
*
* @return string
*/
public function renderContent(): string
{
if (count($this->submitElements) > 1) {
return (new HtmlDocument())
->setHtmlContent(
$this->duplicateSubmitButton($this->submitButton),
new HtmlString(parent::renderContent())
)
->render();
}
return parent::renderContent();
}
public function hasDefaultElementDecorator()
{
if (parent::hasDefaultElementDecorator()) {
return true;
}
$this->setDefaultElementDecorator(new IcingaFormDecorator());
return true;
}
protected function ensureDefaultElementLoaderRegistered()
{
if (! $this->defaultElementLoaderRegistered) {
$this->addPluginLoader(
'element',
'ipl\\Web\\FormElement',
'Element'
);
parent::ensureDefaultElementLoaderRegistered();
}
return $this;
}
/**
* Return a duplicate of the given submit button with the `class` attribute fixed to `primary-submit-btn-duplicate`
*
* @param FormSubmitElement $originalSubmitButton
*
* @return FormSubmitElement
*/
public function duplicateSubmitButton(FormSubmitElement $originalSubmitButton): FormSubmitElement
{
$attributes = (clone $originalSubmitButton->getAttributes())
->set('class', 'primary-submit-btn-duplicate');
$attributes->remove('id');
// Remove to avoid `type="submit submit"` in SubmitButtonElement
$attributes->remove('type');
if ($originalSubmitButton instanceof SubmitElement) {
$newSubmitButton = new SubmitElement($originalSubmitButton->getName(), $attributes);
$newSubmitButton->setLabel($originalSubmitButton->getButtonLabel());
return $newSubmitButton;
} elseif ($originalSubmitButton instanceof SubmitButtonElement) {
$newSubmitButton = new SubmitButtonElement($originalSubmitButton->getName(), $attributes);
$newSubmitButton->setSubmitValue($originalSubmitButton->getSubmitValue());
return $newSubmitButton;
}
throw new InvalidArgumentException(sprintf(
'Cannot duplicate submit button of type "%s"',
get_class($originalSubmitButton)
));
}
}
|