Špatné escapování vlastního pravidla v Nette\Forms\Controls\BaseControl

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Coura
Člen | 20
+
0
-

version 2.1-dev released on 2012–04–28
Při použití vlastního pravidla, které má jako parametr třídu s public parametry, dojde ke špatnému escapování při renderování inputu a nefunguje validace.
Jedná se o řádek 396 v metodě getControl, příkaz

$rules = preg_replace('#(?<!\\\\)"([^\\\\\',]*)"#i', "'$1'", $rules);

Před tímto řádkem mají pravidla takovýto tvar:

{
	"op":":filled",
	"msg":"Pole  'P\u0159ihl\u00e1\u0161en\u00ed' mus\u00ed b\u00fdt vypln\u011bno."
},{
	"op":"FormValidator::isUniqueValue",
	"msg":"Zvolen\u00e9 jm\u00e9no ji\u017e existuje",
	"arg":{
		"validator":{
			"table":"users",
			"primary_key":{"user = %s"}
		}
	}
}

A po něm takovýto:

{
	op:':filled',
	msg:"Pole  'P\u0159ihl\u00e1\u0161en\u00ed' mus\u00ed b\u00fdt vypln\u011bno."
},{
	op:'FormValidator::isUniqueValue',
	msg:"Zvolen\u00e9 jm\u00e9no ji\u017e existuje",
	arg:{
		validator:{
			table:'users',
			'primary_key":{"user = %s'}
		}
	}
}

⇒ špatně uvozovky ‚primary_key":{"user = %s‘

Editoval Coura (1. 5. 2012 21:26)

David Grudl
Nette Core | 8228
+
0
-

Jaká data ($rules) vstupují do json_encode? Je mi záhadou ta část "primary_key":{"user = %s"}, to totiž není validní JSON. A jakou máš verzi PHP?

Ale jinak opraveno.

Coura
Člen | 20
+
0
-

PHP 5.3.8

array(2) [
   0 => array(2) {
      op => ":filled" (7)
      msg => "Pole  'Přihlášení' musí být vyplněno." (44)
   }
   1 => array(3) {
      op => "FormValidator::isUniqueValue" (28)
      msg => "Zvolené jméno již existuje" (29)
      arg => array(1) {
         validator => Users(6) {
            table => "users" (5)
            primary_key => array(1) [
               0 => "[user] = %s" (11)
            ]
            supportInsertedId protected => FALSE
            primary_key_value protected => NULL
            condition protected => NULL
            chosen protected => FALSE
         }
      }
   }
]

Díky za fix

Editoval Coura (4. 6. 2012 19:21)