Clean URL – nefungujuci router

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

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
+
0
-

->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
+
0
-

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
+
0
-

mas tuto routu pred „catch all“ routou? (tim myslim nejakou <presenter>/<action>)?

xand
Člen | 15
+
0
-

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)