Persistentni promenne komponenty mi znici tvar url

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

Nette 2.0.1, PHP 5.3.8

Ahoj, mam nasledujici router

<?php
$container->router[] = new Route('<slug>-<id [0-9]+>[!.html]', array(
    'module' => 'Front',
    'presenter' => 'Homepage',
    'action' => 'default',
    'slug' => 'stranka'
));
?>

tzn. ze mam url adresy ve tvaru forum-21.html, splatkovy-prodej-18.html apod.

stranka forum-21.html obsahuje komponentu Forum (zkracene) ->

<?php
namespace Components;

class Forum extends Control
{
    /** @persistent */
    public $type = 'all';

    /** @persistent */
    public $page = 1;

    /** @var int */
    private $itemsPerPage = 20;

    public function render()
    {
        // something goes here

    }
}
?>

Pokud ve foru prepnu na jinou stranu, nez prvni (vychozi hodnota persistentniho parametru), tak se mi url zmeni na /homepage/default/21.html?forum-page=5, pritom routu napsanou na tento request mam a nevidim duvod, proc by persistentni parametr mel url nicit?

Neni to nic zavazneho, funguje to, ale nelibi se mi to. Setkal se s tim uz nekdo?

Diky

Ot@s
Backer | 476
+
0
-

Pokud chceš mít stránkování v URL (tj. ne jako parametr), musíš to nadefinovat do definice speciální routy pro fórum (tj. do bootstrapu + persistentní proměnnou $page do presenteru). V komponentě bys pak musel psát něco jako $this->presenter->page=5. Je to sice krkolomné, ale fungovalo by to.

MelkorNemesis
Člen | 36
+
0
-

Ot@s napsal(a):

Pokud chceš mít stránkování v URL (tj. ne jako parametr), musíš to nadefinovat do definice speciální routy pro fórum (tj. do bootstrapu + persistentní proměnnou $page do presenteru). V komponentě bys pak musel psát něco jako $this->presenter->page=5. Je to sice krkolomné, ale fungovalo by to.

To se mi zda jako hloupost, url ve tvaru /forum-21.html?foo=1&bar=2 nic nedela (test), ale parametry v url zustanou tak, jak jsem je tam napsal, takze nevim, proc by persistentni parametr mel neco takoveho delat. Navic je to strankovani te komponenty a ta by mela byt odstinena od presenteru, funguje samostatne, kdyz ji dam do jineho presenteru, nebudu prepisovat router a davat promennou do jineho presenteru.

llook
Člen | 407
+
0
-

Ot@s napsal(a):

Pokud chceš mít stránkování v URL (tj. ne jako parametr), musíš to nadefinovat do definice speciální routy pro fórum (tj. do bootstrapu + persistentní proměnnou $page do presenteru). V komponentě bys pak musel psát něco jako $this->presenter->page=5. Je to sice krkolomné, ale fungovalo by to.

Jemu jde o něco jiného. Cílem je adresa /forum-21.html?forum-page=5, jenže link mu generuje /homepage/default/21.html?forum-page=5.

Chtělo by to vidět i ostatní routy a pravděpodobně přeházet jejich pořadí. Router použije první routu, na kterou se dají parametry odkazu napasovat. Jestli máš ještě před tou svojí routou klasiku <presenter>/<action>/<id>, tak použije tu.

MelkorNemesis
Člen | 36
+
0
-

llook napsal(a):

Ot@s napsal(a):

Pokud chceš mít stránkování v URL (tj. ne jako parametr), musíš to nadefinovat do definice speciální routy pro fórum (tj. do bootstrapu + persistentní proměnnou $page do presenteru). V komponentě bys pak musel psát něco jako $this->presenter->page=5. Je to sice krkolomné, ale fungovalo by to.

Jemu jde o něco jiného. Cílem je adresa /forum-21.html?forum-page=5, jenže link mu generuje /homepage/default/21.html?forum-page=5.

Chtělo by to vidět i ostatní routy a pravděpodobně přeházet jejich pořadí. Router použije první routu, na kterou se dají parametry odkazu napasovat. Jestli máš ještě před tou svojí routou klasiku <presenter>/<action>/<id>, tak použije tu.

Poradi rout by melo byt spravne

<?php
// Setup router
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

$container->router[] = new Route('admin/<presenter>/<action>[/<id>]', array(
    'module' => 'Admin',
    'presenter' => 'Homepage',
    'action' => 'default'
));

$container->router[] = new Route('<slug>-<id [0-9]+>[!.html]', array(
    'module' => 'Front',
    'presenter' => 'Homepage',
    'action' => 'default',
    'slug' => 'stranka'
));

$container->router[] = new Route('<presenter>/<action>[/<id>].html', array(
    'module' => 'Front',
    'presenter' => 'Homepage',
    'action' => 'default'
));
?>

a odkaz v komponente

<?php
<a n:class="$i == $control->page ? active" n:href="this, page => $i">{$i}</a>
?>

kdyz posledni routu odmazu ovsem, dostanu toto, coz neni moc pekne

http://d.pr/Jj16+

Editoval MelkorNemesis (23. 3. 2012 16:11)

duke
Člen | 650
+
0
-

Zjisti, zda ti to ta „špatná“ url generuje přímo do stránky, nebo se to na ně přesměrovává až v rámci kanonikalizace. Pokud je to ten druhý případ, zkus si jako workaround do metody startup presenteru přidat volání saveGlobalState.

llook
Člen | 407
+
0
-

Aha, tak ty routy máš správně. Teď mě napadá, jestli tvůj presenter má persistentní parametr $slug. Když ho v n:href neuvedeš, tak se do parametrů odkazu dostane pouze tehdy, pokud je perzistentní.