Podivné chování FILTER_IN

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

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
+
0
-

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
+
0
-

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)