nette / forms

📝 Generating, validating and processing secure forms in PHP. Handy API, fully customizable, server & client side validation and mature design.

Home Page:https://doc.nette.org/forms

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Validation rules with Nette\Utils\Html-Strings not rendered correctly in `data-nette-rules`

NoNoNo opened this issue · comments

Environment

nette/forms version: v3.0.3
nette/utils version: v3.1.1
php version: PHP 7.4.4 (cli)
Reproducibility: always

Steps to Reproduce

require 'vendor/autoload.php';

use Nette\Forms\Form;
use Nette\Utils\Html;

$form = new Form;

$form->addPassword('password1', 'Password:')
	->addRule(Form::PATTERN, 'Must contain number', '.*[0-9].*');

$form->addPassword('password2', 'Password:')
	->addRule(Form::PATTERN, Html::el()->addHtml('Must contain number'), '.*[0-9].*');

echo $form; // renders the form

Expected Result

<form action="" method="post">

<table>
<tr>
	<th><label for="frm-password1">Password:</label></th>

	<td><input type="password" name="password1" pattern=".*[0-9].*" id="frm-password1" 
    data-nette-rules='[{"op":":pattern","msg":"Must contain number","arg":".*[0-9].*"}]' class="text"></td>
</tr>

<tr>
	<th><label for="frm-password2">Password:</label></th>

	<td><input type="password" name="password2" pattern=".*[0-9].*" id="frm-password2" 
    data-nette-rules='[{"op":":pattern","msg":"Must contain number","arg":".*[0-9].*"}]' class="text"></td>
</tr>
</table>

</form>

Please note: data-nette-rules are the same in INPUT[name="password1] and INPUT[name="password2].

Actual Result

<form action="" method="post">

<table>
<tr>
	<th><label for="frm-password1">Password:</label></th>

	<td><input type="password" name="password1" pattern=".*[0-9].*" id="frm-password1" 
    data-nette-rules='[{"op":":pattern","msg":"Must contain number","arg":".*[0-9].*"}]' class="text"></td>
</tr>

<tr>
	<th><label for="frm-password2">Password:</label></th>

	<td><input type="password" name="password2" pattern=".*[0-9].*" id="frm-password2" 
    data-nette-rules='[{"op":":pattern","msg":{"attrs":[]},"arg":".*[0-9].*"}]' class="text"></td>
</tr>
</table>

</form>

Please note the "msg":{"attrs":[]} in INPUT[name="password2"][data-nette-rules].

Note

Found a workaround:

diff --git i/src/Forms/Validator.php w/src/Forms/Validator.php
index 66acfdd..6406374 100644
--- i/src/Forms/Validator.php
+++ w/src/Forms/Validator.php
@@ -52,7 +52,7 @@ class Validator
        {
                $message = $rule->message;
                if ($message instanceof Nette\Utils\IHtmlString) {
-                       return $message;
+                       return (string)$message;

                } elseif ($message === null && is_string($rule->validator) && isset(static::$messages[$rule->validator])) {
                        $message = static::$messages[$rule->validator];