Teoreticky nekonečná url

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

V db mám uložené stránky a id ich rodičov. Stránky môžem zanorovať teoreticky do nekonečnej hĺbky no nastáva problém pri tvorbe routy na frontende.

Samozrejme vytvoriť jednoduchú routu ktorá bude vyplúvať adresu

www.example.com/page/xyz

je v pohode no chcel by som to vyriešiť tak aby som dostával adresu

www.expamle.com/rodic1/rodic2/rodic_x/stranka

no neviem si rady s tým ako vytvoriť takúto „dynamickú“ routu, keďže každá stránka môže mať iný počet rodičov.

Ako by sa to dalo riešiť ? Vopred ďakujem za odpovede.

Editoval ricco24 (11. 2. 2012 14:29)

Aurielle
Člen | 1281
+
0
-

example.com/<node> – node nastavíš pattern .+ (prostě aby bral i lomítka) a pomocí filtrů si to rozparsuješ. Mám celkem funkční routu tohohle typu, která používá traverzování kolem stromu. Jestli chceš, můžu poslat.

ricco24
Člen | 141
+
0
-

Bolo by super ak by si ju sem hodil. Nech viem aspoň ako na to.

PetrLz
Člen | 8
+
0
-

taky se pripojuju se zadosti, resim podobnou situaci. díky.

Aurielle
Člen | 1281
+
0
-

https://gist.github.com/1801560 – Je to řešené přes mírně upravenou verzi FilterRoute – najdete tuším v cookbooku, v closurách je to proto, že mám dvě routy, které to využívají. Ten kód je z dnešního pohledu ne moc „programmer-friendly“ a psán na nějakou nedokumentovanou vývojovou verzi Nette 2.0 a ještě na Ormion a dibi. Určitě by to šlo napsat líp, dopouštěl jsem se tam taky pár „špatných“ practice kvůli nacachování a kdo ví čemu ještě. Původní filtry pro <category> jsou v routách vyresetovány na NULL.

ricco24
Člen | 141
+
0
-

Routovanie mám vyriešené aktuálne tak že routa mi zachytí akýkoľvek reťazec z url roztrhá mi ho na časti oddelené „/“ a ak sa stránka nachádza v db tak mi predá jej ID do Homepage:default ak nie tak vyhodí 404ku.

No prišiel som k inému problému. Stránkam nastavujem v db príznak druhu stránky (galéria, novinky, normálna stránka …) a neviem ako presne sa vysporiadať s tým aby som príslušný druh stránky presmeroval na príslušný presenter …

Jediné čo ma napadlo je niečo takéto

public function actionDefault($path = 1)
{
	$page = $this->model('Models\Data\Page')->findAll()->where('id', $path)->fetch();

	switch($page->page_type_id) {
		case '2' : $this->setView('Page');
				break;
		case '3' : $this->setView('News');
				break;
		default : break;
	}
}

No pri tomto riešení by som celý frontend riadil cez jeden presenter čo pokladám za úplnú blbosť …
Ako lepšie sa to dá riešiť ? Poprípade ako to riešite vy ?

Editoval ricco24 (18. 3. 2012 19:42)

ricco24
Člen | 141
+
0
-

Tak som to teda vyriesil asi jedinim moznim riesenim → napisal som si vlastnu routu.

tomasnikl
Člen | 137
+
0
-

ricco24 napsal(a):

Tak som to teda vyriesil asi jedinim moznim riesenim → napisal som si vlastnu routu.

Podělíš se?

Editoval tomasnikl (29. 3. 2012 13:29)

Ascaria
Člen | 187
+
0
-

Jestli můžu radit, tak doporučuju nedělat kilometrové url (jednak to snižuje nějakej ten rank na googlu a druhak je to zbytečné)

toto je naprosto dostačující:

www.expamle.com/page/rodic_x/stranka

rodic1, rodic2… rodicN si dopočítej pomocí parentů od rodic_x interně v aplikaci. nebudeš potřebovat vlastní routu a bude to vypadat elegantněji (alespoň podle mě).

tomasnikl
Člen | 137
+
0
-

Ascaria napsal(a):

Jestli můžu radit, tak doporučuju nedělat kilometrové url (jednak to snižuje nějakej ten rank na googlu a druhak je to zbytečné)

toto je naprosto dostačující:

www.expamle.com/page/rodic_x/stranka

rodic1, rodic2… rodicN si dopočítej pomocí parentů od rodic_x interně v aplikaci. nebudeš potřebovat vlastní routu a bude to vypadat elegantněji (alespoň podle mě).

diky, urcite to stoji za uvahu.. je fakt, ze nekdy jsou by vznikaly opravdu giganticke url adresy kdyz vezmu clanek zanoreny ve trech kategoriich..

tomasnikl
Člen | 137
+
0
-

koukam, ze toto vlakno je oproti jinym asi tak 3× vice cteno… urcite se najde jeste nekdo, kdo ma nejake reseni se kterym by se byl ochoten podelit :) nebo se pletu?

PetrLz
Člen | 8
+
0
-

Ahoj tady na to máš cely router, jako db je pouzita doctrine2. Já to tenkrát řešil snad pul dne, ale nakonec z toho vzniklo todle :P. Poměrně špatně se to debuguje… Tak snad to tobě nebo jiným pomůže.

<?php
class CategoryRouter extends RouteList implements \Nette\Application\IRouter {

    /** @var CategoriesService */
    private $categoriesService;



    public function __construct(CategoriesService $categoriesService) {
        $this->categoriesService = $categoriesService;
        $this[] = new Route('<node>', array(
                    'module' => 'Front',
                    'presenter' => 'Categories',
                    'action' => 'default',
                    'node' => array(
                        //Route::PATTERN => '.*?',
                        Route::PATTERN => '.+',
                        Route::FILTER_IN => callback($this, 'filterInCategory'),
                        Route::FILTER_OUT => callback($this, 'filterOutCategory'),
                    //Route::VALUE => '',
                    ),

                ));



    }

    public function filterInCategory($url) {
        $nodes = explode('/', $url);
        $count = count($nodes);
        if ($count == 1) {
            $key = $nodes[0];
        } else {
            $key = $nodes[$count -1];
        }
        $category = $this->categoriesService->getByUrl($key);
        if ($category instanceof Category) {
            return $category->id;
        }
        return null;
    }

    public function filterOutCategory($id) {
        $category = $this->categoriesService->getById($id);
        if ($category instanceof Category) {
            $ancestors = $this->categoriesService->getAncestorsOf($category);
            $slug = null;
            foreach ($ancestors as $key => $value) {
                if ($value->id == 1) {
                    continue;
                }
                $slug .=  $value->url.'/';

            }
            return $slug;
        }
        return null;
    }

}

?>