Presenter a Action z URL strtolower

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

Dobrý den,

mám níže uvedenou routu, která v podstatě funguje dobře. Problém nastane, pokud někdo přistoupí na adresu /Kosik (velke K na začátku nebo i jakákoliv jiná kombinace velkých a malých písmen).

Potřeboval bych poradit, jak zajistit, aby po matchnutí routy se parametry presenter a action prohnali přes funkci strtolower a došlo k přesměrování na variantu jen s malými písmeny. Samozřejmě se to nesmí dostat do nekonečné smyčky, ale to předpokládám, že už si ošetřím.

Obecně by se mi toto chování hodilo pro všechny presentery a akce i mimo ty z filtrovací tabulky.

Používám Nette 2.3.10

Děkuji

$router[] = new Route('[<currency CZK|EUR>/]<presenter>/<action>/[<id>[-<name>]/][page/<visualPaginator-page>/][sort/<sortBy>/[<sortHow>/]]', array(
    'presenter' => [
        Route::VALUE => 'Product',
        Route::FILTER_TABLE => [
            'karta' => 'VoucherRetail'
        ]
    ],
    'action' => array(
        Route::VALUE => 'default',
        Route::FILTER_TABLE => array(
            'krok1' => 'step1',
            'krok2' => 'step2'
        )
    )
));
David Matějka
Moderator | 6445
+
0
-

myslim, ze nepujde pouzit FILTER_TABLE, ale budes muset pouzit FILTER_IN a FILTER_OUT, coz je funkce, ktera transformuji vstup/vystup jak potrebujes. takze tam provedes strtolower a pak tam budes mit nejaky vlastni ekvivalent FILTER_TABLE

Sonny
Člen | 13
+
0
-

Omlouvám se, že píšu až teď, ale nepřišel mi mail.

Pro testování jsem všechny routy odstranil a nechal jen jednoduchou routu. Aktuálně mým cílem bylo zprovoznit správně zadané adresy (/cart a /product), což funguje. A jako druhý krok jsem chtěl vyřešit adresy ve tvaru /carT nebo /pRoduct. U takovýchto adres mi ale Nette vyhodí 404 dříve, než se dostane na funkci FILTER_IN. Stejné chování nastává i když FILTER_IN dám přímo u parametru presenter.

Prosím ještě o nakopnutí. Děkuji

$router[] = new Route('<presenter>/<action>/',
    [
        'presenter' => [
            Route::VALUE => 'Product',
        ],
        'action' => array(
            Route::VALUE => 'default',
        ),
        NULL => [
            Route::FILTER_IN => function ($params) {
                $params['presenter'] =  ucfirst(strtolower($params['presenter']));

                return $params;
            },
        ]
    ]
);
David Matějka
Moderator | 6445
+
+1
-

ajo vlastne. tam jsou pro presenter a action defaultni masky

takze by melo staci upravit tu routu na neco jako <presenter [a-zA-Z][a-zA-Z0-9.-]*>/<action [a-zA-Z][a-zA-Z0-9.-]*>

Sonny
Člen | 13
+
0
-

Díky za nakopnutí. Už jsem se posunul o pořádný kus dál a předpokládám, že zbytek si už vyřeším sám.

Díky