Skip to content

Commit 11e21e5

Browse files
jtojnardg
authored andcommitted
DefaultFormRenderer: Add control .error class (#209)
Bootstrap 4 marks invalid controls with is-invalid class. Let’s allow to set this class in DefaultFormRenderer.
1 parent dcd80e5 commit 11e21e5

File tree

4 files changed

+19
-8
lines changed

4 files changed

+19
-8
lines changed

examples/bootstrap4-rendering.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function makeBootstrap4(Form $form): void
2828
$renderer->wrappers['label']['container'] = 'div class="col-sm-3 col-form-label"';
2929
$renderer->wrappers['control']['description'] = 'span class=form-text';
3030
$renderer->wrappers['control']['errorcontainer'] = 'span class=form-control-feedback';
31+
$renderer->wrappers['control']['.error'] = 'is-invalid';
3132

3233
foreach ($form->getControls() as $control) {
3334
$type = $control->getOption('type');

src/Forms/Rendering/DefaultFormRenderer.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class DefaultFormRenderer implements Nette\Forms\IFormRenderer
4747
* \---
4848
*
4949
* /--- control.container [.odd]
50-
* .... CONTROL [.required .text .password .file .submit .button]
50+
* .... CONTROL [.required .error .text .password .file .submit .button]
5151
* .... control.requiredsuffix
5252
* .... control.description
5353
* .... control.errorcontainer + control.erroritem
@@ -95,6 +95,7 @@ class DefaultFormRenderer implements Nette\Forms\IFormRenderer
9595
'erroritem' => '',
9696

9797
'.required' => 'required',
98+
'.error' => null,
9899
'.text' => 'text',
99100
'.password' => 'text',
100101
'.file' => 'text',
@@ -386,8 +387,12 @@ public function renderPairMulti(array $controls): string
386387

387388
$control->setOption('rendered', true);
388389
$el = $control->getControl();
389-
if ($el instanceof Html && $el->getName() === 'input') {
390-
$el->class($this->getValue("control .$el->type"), true);
390+
if ($el instanceof Html) {
391+
if ($el->getName() === 'input') {
392+
$el->class($this->getValue("control .$el->type"), true);
393+
}
394+
395+
$el->class($this->getValue('control .error'), $control->hasErrors());
391396
}
392397
$s[] = $el . $description;
393398
}
@@ -447,8 +452,12 @@ public function renderControl(Nette\Forms\IControl $control): Html
447452

448453
$control->setOption('rendered', true);
449454
$el = $control->getControl();
450-
if ($el instanceof Html && $el->getName() === 'input') {
451-
$el->class($this->getValue("control .$el->type"), true);
455+
if ($el instanceof Html) {
456+
if ($el->getName() === 'input') {
457+
$el->class($this->getValue("control .$el->type"), true);
458+
}
459+
460+
$el->class($this->getValue('control .error'), $control->hasErrors());
452461
}
453462
return $body->setHtml($el . $description . $this->renderErrors($control));
454463
}

tests/Forms/Forms.renderer.2.expect

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<dt><label for="frm-age" class="required">Your age:</label></dt>
1515

16-
<dd class="odd"><input type="number" name="age" min="10" max="100" id="frm-age" required data-nette-rules='[{"op":":filled","msg":"Enter your age"},{"op":":integer","msg":"Age must be numeric value"},{"op":":range","msg":"Age must be in range from 10 to 100","arg":[10,100]}]' value="9.9" class="text"> •
16+
<dd class="odd"><input type="number" name="age" min="10" max="100" id="frm-age" required data-nette-rules='[{"op":":filled","msg":"Enter your age"},{"op":":integer","msg":"Age must be numeric value"},{"op":":range","msg":"Age must be in range from 10 to 100","arg":[10,100]}]' value="9.9" class="text is-invalid"> •
1717

1818
<span class="error">
1919
Age must be numeric value
@@ -24,7 +24,7 @@
2424

2525
<dt><label for="frm-gender">Your gender:</label></dt>
2626

27-
<dd><select name="gender" id="frm-gender"><option style="color: #248bd3" value="m">male</option><option style="color: #e948d4" value="f">female</option></select>
27+
<dd><select name="gender" id="frm-gender" class="is-invalid"><option style="color: #248bd3" value="m">male</option><option style="color: #e948d4" value="f">female</option></select>
2828

2929
<span class="error">
3030
Please select a valid option.
@@ -81,7 +81,7 @@
8181

8282
<dt><label for="frm-password" class="required">Choose password:</label></dt>
8383

84-
<dd><input type="password" name="password" id="frm-password" required data-nette-rules='[{"op":":filled","msg":"Choose your password"},{"op":":minLength","msg":"The password is too short: it must be at least 3 characters","arg":3}]' class="text"> • <small>(at least 3 characters)</small>
84+
<dd><input type="password" name="password" id="frm-password" required data-nette-rules='[{"op":":filled","msg":"Choose your password"},{"op":":minLength","msg":"The password is too short: it must be at least 3 characters","arg":3}]' class="text is-invalid"> • <small>(at least 3 characters)</small>
8585

8686
<span class="error">
8787
The password is too short: it must be at least 3 characters

tests/Forms/Forms.renderer.2.phpt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ $renderer->wrappers['pair']['container'] = null;
4646
$renderer->wrappers['controls']['container'] = 'dl';
4747
$renderer->wrappers['control']['container'] = 'dd';
4848
$renderer->wrappers['control']['.odd'] = 'odd';
49+
$renderer->wrappers['control']['.error'] = 'is-invalid';
4950
$renderer->wrappers['control']['errors'] = true;
5051
$renderer->wrappers['label']['container'] = 'dt';
5152
$renderer->wrappers['label']['suffix'] = ':';

0 commit comments

Comments
 (0)