Spojení action a id pomocí pomlčky

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

Ahoj,
mám problém spojit v routě action a id pomocí pomlčky. Pokud mám takovouto routu

<?php
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>[-<id>].html]', array(
	'module' => 'Front',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
	'lang' => NULL,
));
?>

tak se link vygeneruje správně ve tvaru cs/nejaky-presenter/clanek-10.html , ale když na něj kliknu, hodí mi výjimku NBadRequestException Action name ‚clanek-10‘ is not alphanumeric string.

Jak by teda měla ta routa vypadat, aby byla tvaru action.htmlaction-id.html ? Jde mi hlavně o tu pomlčku, když tam dám třeba znaménko plus(+) místo tý pomlčky, tak funguje všechno v pohodě..
Díky..

LuKo
Člen | 116
+
0
-

V routeru lze používat regulární výrazy, proto by mohlo fungovat něco ve smyslu (v action ale pak nemůžeš mít pomlčky):

<?php
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action [^\-]>[-<id>].html]', array(...));
?>

A nebo jít na jistotu a udělat 2 routy:

<?php
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>-<id [0-9]+>.html]', array(...));
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>.html]', array(...));
?>
Honca
Člen | 28
+
0
-

LuKo napsal(a):

V routeru lze používat regulární výrazy, proto by mohlo fungovat něco ve smyslu (v action ale pak nemůžeš mít pomlčky):

<?php
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action [^\-]>[-<id>].html]', array(...));
?>

A nebo jít na jistotu a udělat 2 routy:

<?php
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>-<id [0-9]+>.html]', array(...));
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>.html]', array(...));
?>

Díky za odpověď :-)

Pokud ale použiju ty dvě routy, tak mi správně funguje tvar action-id.html, jenže u adresy, která id nemá nastaveno, tak se použije tvar action-.html a to já nechci :-(
dělalo mi to taky tohle předtím, když mi funguje jedno, tak zas nejde druhý správně a nevím, jak na to..

pave.kucera
Člen | 122
+
0
-

Mělo by stačit dát tam další nepovinný parametr:

<?php
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>[-<id [0-9]+>.html]]', array(...));
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>.html]', array(...));

?>
LuKo
Člen | 116
+
0
-
<?php
$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>/<action>-<id [0-9]+>.html', array(
        'module' => 'Front',
        'lang' => NULL,
));

$router[] = new NRoute('[<lang [a-z]{2}>/]<presenter>[/<action>.html]', array(
        'module' => 'Front',
        'presenter' => 'Default',
        'action' => 'default',
        'id' => NULL,
        'lang' => NULL,
));
?>

Zkoušel jsem u sebe, funguje podle očekávání.

Honca
Člen | 28
+
0
-

Tak teď už mi to jde, díky moc. Nevím přesně proč, ale začalo to fungovat, když jsem smazal v metadatech jen to ‚id‘ ⇒ NULL, předtím to ještě házelo chyby.. Ještě jednou díky, snad to do budoucna pomůže i někomu jinýmu :-)

Patrik Votoček
Člen | 2221
+
0
-

@Honca: prosím necituj příště celý předchozí komentář je to zbytečné a za*** se tím fórum. (citaci jsem odstranil)