Teoreticky nekonečná url
- ricco24
- Člen | 141
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
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
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)
- Ascaria
- Člen | 187
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
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..
- PetrLz
- Člen | 8
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;
}
}
?>