Š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
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
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
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)