Skip to content

Commit 82dcd7d

Browse files
authored
Merge pull request #136 from Icinga/fix-duplicate-button-submitting
Fix duplicate submit button not triggering `getPressedSubmitElement()`
2 parents 7c7ca7e + 78c15b2 commit 82dcd7d

File tree

2 files changed

+78
-3
lines changed

2 files changed

+78
-3
lines changed

src/Compat/CompatForm.php

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
namespace ipl\Web\Compat;
44

5+
use http\Exception\InvalidArgumentException;
56
use ipl\Html\Contract\FormSubmitElement;
67
use ipl\Html\Form;
8+
use ipl\Html\FormElement\SubmitButtonElement;
79
use ipl\Html\FormElement\SubmitElement;
810
use ipl\Html\HtmlDocument;
911
use ipl\Html\HtmlString;
@@ -53,14 +55,31 @@ public function hasDefaultElementDecorator()
5355
*
5456
* @param FormSubmitElement $originalSubmitButton
5557
*
56-
* @return SubmitElement
58+
* @return FormSubmitElement
5759
*/
58-
public function duplicateSubmitButton(FormSubmitElement $originalSubmitButton): SubmitElement
60+
public function duplicateSubmitButton(FormSubmitElement $originalSubmitButton): FormSubmitElement
5961
{
6062
$attributes = (clone $originalSubmitButton->getAttributes())
6163
->set('class', 'primary-submit-btn-duplicate');
6264
$attributes->remove('id');
65+
// Remove to avoid `type="submit submit"` in SubmitButtonElement
66+
$attributes->remove('type');
6367

64-
return new SubmitElement($originalSubmitButton->getName(), $attributes);
68+
if ($originalSubmitButton instanceof SubmitElement) {
69+
$newSubmitButton = new SubmitElement($originalSubmitButton->getName(), $attributes);
70+
$newSubmitButton->setLabel($originalSubmitButton->getButtonLabel());
71+
72+
return $newSubmitButton;
73+
} elseif ($originalSubmitButton instanceof SubmitButtonElement) {
74+
$newSubmitButton = new SubmitButtonElement($originalSubmitButton->getName(), $attributes);
75+
$newSubmitButton->setSubmitValue($originalSubmitButton->getSubmitValue());
76+
77+
return $newSubmitButton;
78+
}
79+
80+
throw new InvalidArgumentException(sprintf(
81+
'Cannot duplicate submit button of type "%s"',
82+
get_class($originalSubmitButton)
83+
));
6584
}
6685
}

tests/Compat/CompatFormTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,62 @@ public function testDuplicateSubmitButtonApplied(): void
3636
$this->assertHtml($expected, $this->form);
3737
}
3838

39+
public function testSubmitElementDuplication(): void
40+
{
41+
$this->form->addElement('submit', 'submit', [
42+
'label' => 'Submit label',
43+
'class' => 'btn-primary'
44+
]);
45+
$this->form->addElement('submit', 'delete', [
46+
'label' => 'Delete label',
47+
'class' => 'btn-danger'
48+
]);
49+
$this->form->setSubmitButton($this->form->getElement('submit'));
50+
51+
$expected = <<<'HTML'
52+
<form class="icinga-form icinga-controls" method="POST">
53+
<input class="primary-submit-btn-duplicate" name="submit" type="submit" value="Submit label"/>
54+
<div class="control-group form-controls">
55+
<input class="btn-primary btn-primary" name="submit" type="submit" value="Submit label"/>
56+
</div>
57+
<div class="control-group form-controls">
58+
<input class="btn-danger btn-primary" name="delete" type="submit" value="Delete label"/>
59+
</div>
60+
</form>
61+
HTML;
62+
63+
$this->assertHtml($expected, $this->form);
64+
}
65+
66+
67+
public function testSubmitButtonElementDuplication(): void
68+
{
69+
$this->form->addElement('submitButton', 'submit', [
70+
'label' => 'Submit label',
71+
'class' => 'btn-primary',
72+
'value' => 'submit_value'
73+
]);
74+
$this->form->addElement('submitButton', 'delete', [
75+
'label' => 'Delete label',
76+
'class' => 'btn-danger'
77+
]);
78+
$this->form->setSubmitButton($this->form->getElement('submit'));
79+
80+
$expected = <<<'HTML'
81+
<form class="icinga-form icinga-controls" method="POST">
82+
<button class="primary-submit-btn-duplicate" name="submit" type="submit" value="submit_value" />
83+
<div class="control-group form-controls">
84+
<button class="btn-primary btn-primary" name="submit" type="submit" value="submit_value">Submit label</button>
85+
</div>
86+
<div class="control-group form-controls">
87+
<button class="btn-danger btn-primary" name="delete" type="submit" value="y">Delete label</button>
88+
</div>
89+
</form>
90+
HTML;
91+
92+
$this->assertHtml($expected, $this->form);
93+
}
94+
3995
public function testDuplicateSubmitButtonOmitted(): void
4096
{
4197
$this->form->addElement('submit', 'submitCreate');

0 commit comments

Comments
 (0)