Generování SEO rout se zachováním ID v URL a tahání názvů z DB, jde to jednoduše?

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

Potřeboval bych nějakou jednoduchou SEO optimalizaci na e-shopu, který jsem dělal na Nette, dřív, když jsem to dělal ručně, tak to vypadalo nějak následovně http://example.com/…uktu/pid-157, nebo http://example.com/…gorie/cid-27 s tím, že název kategorie a položky bylo vytáhnutý název z DB a bylo to „zwebalizované“. SimpleSeoRouter od Honzy tvrdíka bohužel použít nelze, protože nemůžu zajistit unikátnost názvů položek a kategorií.

Takže moje otázka: Jde nějak jednoduše použít třídu Route a doplnit do URL „webalizovaný“ název vytažený z databáze/pole/cache? podle ID v generovaném odkazu?

Prošel jsem si všechny témata na fóru, ale nic z toho nesedělo na můj problém. Předem dík za rady.

Foowie
Člen | 269
+
0
-

Něco najít lze … a je to i v dokumentaci ale trošku jinak podané ;)

Editoval Foowie (14. 6. 2010 13:55)

forkman
Člen | 72
+
0
-

Dík za nakopnutí, ale bohužel mi to úplně nestačí :-) Nevím, jestli to takhle vůbec může fungovat, ale když zapíšu tu routu takhle, tak se mi namatchne a odkazy se vygenerují podle poslední nejobecnejší routy

<?php
  Route::addStyle('seo');
  Route::setStyleProperty('seo', Route::FILTER_OUT, callback('Items::getName'));

  $router[] = new Route('produkt/<seo>/pid-<id>', array(
		'module' => 'Front',
		'presenter' => 'Polozky',
		'action' => 'detail',
  	'seo' => NULL,
    'id' => NULL,
  ));

  $router[] = new Route('<presenter>/<action>/<id>', array(
		'module' => 'Front',
  	'id' => NULL
  ));
?>
Foowie
Člen | 269
+
0
-

V tomhle kousku kódu chybu nevidím (testoval jsem a funguje to normálně…)

forkman
Člen | 72
+
0
-

Tak to bude asi tím, že jsem to špatně pochopil :-) parametr seo tam totiž vůbec nemám a potřeboval bych ho vyrobit z databáze. Pokud pomocí callback funkce přepíšu původní ID, klidně si ho můžu dát do adresy, ale pak bych tam potřeboval dát ještě původní číselné ID a to už nevím jak na to.

Chtěl bych něco jako tohle:

<?php
  Route::addStyle('#seo');
  Route::setStyleProperty('#seo', Route::FILTER_OUT, callback('Items::getName'));

  $router[] = new Route('produkt/pid-<id>/<id #seo>', array(
		'module' => 'Front',
		'presenter' => 'Polozky',
		'action' => 'detail',
  	'seo' => NULL,
    'id' => NULL,
  ));
?>

Podle čeho vůbec callback fce dostane parametr?

Foowie
Člen | 269
+
0
-

On to má být callback na filtr. (jako parametr dostane položku id a returnem to vrátí upravený výsledek)

Možná bych tam seo ani nedával. Místo toho bych použil styl na id, něco jako:

function getName($id) {
	$seo = Items::getName($id);
	return "pid-" . $id . "/" . $seo;
}

a pak ještě funkci getId která bude jako Route::FILTER_IN a vyextrahuje ID :) .

PS: nevím, jestli nebude dělat to lomítko problémy. Místo něho bych možná použil nějaký jiný znak, případně jde na to napsat regexp pro sprývný match části adresy. Vyzkoušej a napiš ;)

forkman
Člen | 72
+
0
-

Takhle očůrat už jsem to zkoušel :-) ale lomítko to bohužel nežere:-( Jestli to jinak nepůjde, tak tam dám pomlčku a regexp už bude brnkačka ;-) to lomítko by tam ale stejně bodlo …

Foowie
Člen | 269
+
0
-
Route::addStyle("id");
Route::setStyleProperty("id", Route::PATTERN, "pid-[0-9]+/[a-zA-Z0-9-]+");
Route::setStyleProperty("id", Route::FILTER_OUT ...
forkman
Člen | 72
+
0
-

Paráda, tohle jsem přesně potřeboval. Dík za tvůj čas, moc jsi mi pomohl!