Ako na adresu v tvare presenter/action/id-title

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

Pozdravujem všetkých ľudí ochotných toto čítať a prejdem k veci.
Chcem vytvoriť adresu v tvare presenter/action/id-title resp. pres/act/id/title
V šablone kde generujem odkazy mám toto:

<a href="{link Post:show $post->id}">{$post->title}</a>

Nedokážem k tomu $post->id dostať $post-title.
Ja lama som si to predstavoval takto:

<a href="{link Post:show $post->id-$post->title}">{$post->title}</a>

Z toho Nette vygenerovalo pres/act/id (bez title).

Aby to celé fungovalo, tak som zlamil ešte aj nejaký filter do routy, ktorá to má podľa mňa celé obsluhovať. Ten vyzerá takto:

$router = new RouteList();
		$router[] = new Route('<presenter>/<action>/<postId>',
								array('presenter' => 'Post',
									'postId' => array(
										Route::FILTER_IN => function($postId)
										{
											return explode('-', $postId)[0];
										},
										Route::FILTER_OUT => function($postId)
										{
											return Strings::webalize($postId, NULL, FALSE);
										}
								))
							);
		$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

Môže mi prosím vás niekto poradiť čo s tým mám robiť?

Editoval Čamo (4. 6. 2014 14:42)

Čamo
Člen | 798
+
0
-

Tak som medzitým na niečo prišiel.
Odkazy teraz generujem takto:

{capture $urlId}{$post->id}-{$post->title}{/capture}
<a href="{link Post:show $urlId}">{$post->title}</a>

a tu routu som zmenil takto:

$router[] = new Route('<presenter>[/<action>]/<postId>',
								array('presenter' => 'Post',
									'action' => 'show',
									'postId' => array(
										Route::FILTER_IN => function($postId)
										{
											return $postId;
										},
										Route::FILTER_OUT => function($postId)
										{
											return Strings::webalize($postId, NULL, FALSE);
										}
								))
							);

Len neviem či to robím dobre.

PS: Zaujímavé je, že keď zavolám
$this->database->table(‚posts‘)->get($id) ← $id === id-title
tak mi to normálne funguje(zoberie písmená miesto integeru).

Tabetha
Člen | 140
+
0
-

A niečo taktéto ti nebude fungovať?

<a href="{link Post:show postId => $post->id, title => $post->title}">{$post->title}</a>

a router nejako takto

$router[] = new Route('<presenter>[/<action>]/<postId>/<title>',
                                array('presenter' => 'Post',
                                    'action' => 'show',
                                    'title' => array(
                                        Route::FILTER_IN => function($title)
                                        {
                                            return $title;
                                        },
                                        Route::FILTER_OUT => function($title)
                                        {
                                            return Strings::webalize($title, NULL, FALSE);
                                        }
                                ))
                            );
Čamo
Člen | 798
+
0
-

No jo, treba pridať do tej routy parameter <title>. Potom funguje aj pomlčka aj lomítko.
new Route(‚<presenter>[/<action>]/<postId>-<title>‘,…
new Route(‚<presenter>[/<action>]/<postId>/<title>‘,…

Editoval Čamo (4. 6. 2014 21:42)