Špatné escapování řetězců v selectech

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

Narazil jsem v minulosti v Nette 2.0 a i teď v 2.1.2 na následující problém.

Vypisuji nějaké záznamy a nyní potřebuju přidat do názvu položek na konec nějaký řetězec, pokud má daný záznam active = 0.

Pár příkladů:

$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE ' inactive' END) AS `text`");

Slovo inactive je oescapováno apostrofy, takže pak mám v názvech toto: Abcd `inactive`
Když dám slovo inactive do uvozovek, tak je to OK:

$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE \" inactive\" END) AS `text`");

Pak mám v názvech toto: Abcd inactive
Ale chtěl bych to česky, tedy to slovo přeložím:

$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE \" neaktivní\" END) AS `text`");

A výsledek je bohužel: Abcd `neaktivn
Úplně špatně.

V laděnce je tohle:

SELECT `washstand`.`id` AS `value`, CONCAT(`washstand`.`name`, CASE WHEN `washstand`.`active` THEN
'' ELSE " `neaktivn`í" END) AS `text`
FROM `washstand`

Chtělo by to poladit, na tenhle problém narážím už dlouho. Musím to teď zase nějak obejít.


EDIT: Ještě jeden poznatek, když napíšu slovo aktivní velkými písmeny – NEAKTIVNÍ – tak to funguje správně.

$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE \" NEAKTIVNÍ\" END) AS `text`");

A výsledek je: Abcd NEAKTIVNÍ

Editoval H0w4rd (29. 4. 2014 11:00)

Jan Endel
Člen | 1016
+
0
-

Proč tohle řešíš na databázové vrstvě a neuděláš to krásně v šabloně:

$washstand->name {if $washstand->active}neaktivní{/if}

V případě že by jsi to mermomoci chtěl v db vrstvě tak nějak takto:

$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE ? END) AS `text`", "neaktivní");
H0w4rd
Člen | 99
+
0
-

Protože to jde jako items do selectboxu.

Děkuji. Že je možné metodě select() dát druhý parametr, jsem vůbec netušil. Škoda, že to není v dokumentaci.

Jan Endel
Člen | 1016
+
0
-

Podle api by to mělo jít, nezkoušel jsem.

Ale i když to jde jako itemy do selectboxu tak to jde udělat nějak takto:

$items = array_map(function ($item) {
	return $item->active ? $item->name : $item->name . ' neaktivní';
}, $items);

Editoval Jan Endel (29. 4. 2014 12:43)