Clean URL – nefungujuci router
- xand
- Člen | 15
ahojte,
patral som dlho na fore, ale neviem aj spojazdnit tento router s peknymi url
adresami. v db mam stlpec url a chcem jeho obsah zobrazovat namiesto id.
$frontRouter[] = new Route('kategoria/<slug [a-z-0-9]+>', array(
'presenter' => 'Category',
'action' => 'view',
'view' => array(
Route::FILTER_IN => function ($slug) use($container){return $container->categories->slugToId($slug);},
Route::FILTER_OUT => function ($id) use($container){return $container->categories->idToSlug($id);}
),
));
a v modely mam
public function idToSlug($id)
{
$db = new Nette\Database\Connection('mysql:host=localhost;dbname=cd', 'root', 'heslo', NULL);
return $db->table('categories')->select('url')->where('id', $id)->fetch();
}
public function slugToId($slug)
{
$db = new Nette\Database\Connection('mysql:host=localhost;dbname=cd', 'root', 'heslo', NULL);
return $db->table('categories')->select('id')->where('url', $slug)->fetch();
}
Hlada teraz KategoriaPresenter..
Pochopil som to routrovanie spravne a este mi nieco chyba alebo je to cele
zle? :)
Dakujem
- David Matějka
- Moderator | 6445
->fetch() ti vrati ActiveRow. musis vratit slug/id. do prvniho pridej za
fetch() ->url
, do druhyho ->id
nejvic wtf je to pripojovani k databazi. prochazel sis quickstart (nejlepe anglickej)? tam je popsano, jak predavat zavislosti, pripojeni k databazi apod.
a ten filtr nema byt pro view ale pro slug
Editoval matej21 (6. 12. 2013 14:28)
- xand
- Člen | 15
hej, to pripojenie do DB je omyl, predtym odomna chcel abstraktne funkcie a
tak som to nejako riesil…
takze som opravil:
'slug' => array(
Route::FILTER_IN => function ($slug) use($container){return $container->categories->slugToId($slug);},
Route::FILTER_OUT => function ($id) use($container){return $container->categories->idToSlug($id);}
),
public function idToSlug($id)
{
return $db->table('categories')->select('url')->where('id', $id)->fetch()->url;
}
public function slugToId($slug)
{
return $db->table('categories')->select('id')->where('url', $slug)->fetch()->id;
}
a chyba ta ista – Cannot load presenter ‚Front:Kategoria‘
- David Matějka
- Moderator | 6445
mas tuto routu pred „catch all“ routou? (tim myslim nejakou
<presenter>/<action>
)?
- xand
- Člen | 15
nebola uz je :)
teraz uz Class ‚BadRequestException‘ not found.
public function renderView($id = NULL)
{
if($this->categories->findById($id)) {
$this->template->category = $this->categories->findById($id);
$this->template->products = $this->categories->getProducts($id);
} else {
throw new BadRequestException('Článek nebyl nalezen.', 404);
}
}
normalne by nacitalo asi 404, ale toto je asi ina story, preco to nechce :D
do renderview mam predsa davat to id, ze
Editoval xand (6. 12. 2013 14:49)