Podivné chování FILTER_IN
- FLAT.cube
- Člen | 2
Zdravím,
s nette jsem nedávno začal a překvapilo mne jednoduchostí použití a rychlostí vývoje aplikací. Ovšem narazil jsem na problém. Když jsem hledal něco o user-friendly url. Narazil jsem na vlákno, ve kterém se doporučuje řešit to přes FILTER_IN a FILTER_OUT. Obslužné fce by se připojily k DB a vyhledaly by odpovídající řádek. Pro začátek jsem použil jen pole:
bootstrap.php
<?php
//...
Route::addStyle('#id');
Route::setStyleProperty('#id', Route::FILTER_IN, 'getId');
Route::setStyleProperty('#id', Route::FILTER_OUT, 'getPath');
$translate = array(
0 => 'nula',
1 => 'jeden',
2 => 'dva',
3 => 'tri',
4 => 'ctyri',
5 => 'pet',
6 => 'sest',
7 => 'sedm',
);
function getId($path) {
global $translate;
$id = array_search($path, $translate);
if($id === FALSE) {
return NULL;
}
else {
return $id;
}
}
function getPath($id) {
global $translate;
if(isset($translate[$id])) {
return $translate[$id];
}
else {
return NULL;
}
}
$router[] = new Route('<id #id>', array(
'presenter' => 'Content',
'action' => 'default',
'id' => 0,
));
//..
?>
Routa funguje dobře až na případy „dva“ a „ctyri“, kdy mě (http://localhost/dva a http://localhost/ctyri) přesměruje na výchozí hodnotu (http://localhost/). Pokud ovšem použiji v poli „dvojka“ a „ctyrka“, tak vše funguje bez problémů. Nevím, kde je chyba. Nejsou to nějaká rezervovaná klíčová slova nebo snad záleží na délce (ale „tri“ chodi bez problémů)?
Díky
- iqtq
- Člen | 20
Vyzkoušel jsem tvojí routu a funguje mi bez problémů, resp. až na routu http://localhost/nula (což je asi pochopitelné). Testováno na obou verzích Nette.
- FLAT.cube
- Člen | 2
Nejpodivnější na tom je to, že pokud nastavím document_root apache
o složku výše, tj. http://localhost/doc_root/jedna atd. Tak fungují všechny
routy. Zatím to vypadá na bug php.
Řešení
Problém byl trochu jinde, mám totiž nastaveno vhost v apache, tak
abych nemusel psát http://localhost/nette/doc_root ale stačilo pouze http://nette/ s odpovídajícími
záznamy v /etc/hosts. Ovšem jak se zdá, tak nějaký regulární výraz
hledá tečku v doméně, která tam není, takže problém je na světě.
Vyřešil jsem to přidáním neexistující TLD k odpovídajácím záznamům
v /etc/hosts a httpd-vhosts.conf.
Oprava řešení
Doufám že tentokrát se už nemýlím. Nebylo to chybějící TLD, ale cache firefoxu. Nevím co přesně vrací nette za hlavičku, když funkce od ROUTER_IN vrátí NULL, ale firefox při zadání té url rovnou přešel na tu co se mu kdysi vrátila hlavičce jako redirect, takže ač v aplikaci ta url nyní byla platná, firefox na ní nepřešel.
Děkuji za rady.
Editoval FLAT.cube (5. 11. 2009 20:26)