Helper plink generuje špatně URL

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

Nejsem si jistý jestli není chyba u mne.
myslím že přiložený obrázek mluví za vše

Nette PLINK error
Filip Procházka
Moderator | 4668
+
0
-

Můj bože co to je za úchylárnu :D jestli chceš poradit ukaž definici rout a napiš jaké odkazy to generuje, obrázky jsou na 2 věci

whipster
Člen | 17
+
0
-

nevím co na tom není jasné

definice těch rout je na tom obrázku
v šabloně pak použiji {plink this} a ono to generuje odkaz na jinou stránku

Aurielle
Člen | 1281
+
0
-

Zopakuju to ještě jednou – ukaž nám definici rout.

whipster
Člen | 17
+
0
-

Bootstrap:

<?php
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
PagePresenter::createRoutes($router);

$router[] = $adminRouter = new \Nette\Application\MultiRouter('Admin');
$adminRouter[] = new Route('admin/[<lang [a-z]{2}>/]<presenter>/<action>[/<id>]',array("presenter"=>"Default", "action"=>"default","lang"=>  Environment::getVariable("lang")));

$router[] = new Route('[<lang [a-z]{2}>/]<presenter>/<action>[/<id>]', array("presenter"=>"Homepage","action"=>"default","lang"=>  Environment::getVariable("lang")));

/* pagePresenter ... */
public static function createRoutes($router){

        foreach (dibi::query("SELECT * FROM pages WHERE status=%s",self::STATUS_ACTIVE) as $page) {
            $router[] = new \Nette\Application\Route('[<lang [a-z]{2}>/]'.$page->url,
                    array( "presenter"=>"Page","action"=>"default","lang"=> $page->lang ? $page->lang :Environment::getVariable("lang"), "url"=>$page->url, "id"=>$page->id));
        }
        $router[] = new \Nette\Application\Route('[<lang [a-z]{2}>/]page/<action>[/<id>]', array("presenter"=>"Page","action"=>"default","lang"=>  Environment::getVariable("lang")));

    }
?>
Aurielle
Člen | 1281
+
0
-

Evidentně jsi nepochopil úlohu rout. Metoda PagePresenteru ti má přidat tak maximálně jednu dynamickou routu pro články, ne přidávat routu pro každý článek.

Filip Procházka
Moderator | 4668
+
0
-

Vskutku archivní kousek

whipster
Člen | 17
+
0
-

Samozrejme chapu k cemu jsou routy.
mozna nevim jak udelat lepe routy pro stranky ktere nemaji presentery, ale jsou definovany v databazi.

ale cekal bych neco konstruktivnejsiho nez ze „nevim k cemu jsou routy“
I kdyz jsem mozna zvolil spatny navrh, i tak by to melo fungovat ne?

dekuji za konstruktivnejso odezvu

Ondřej Mirtes
Člen | 1536
+
0
-
$router[] = new Route('<id>[/<action>]', array(
	'lang' => 'cs',
	'presenter' =>'Article',
	'id' => array(
		Route::FILTER_IN => array($articleService, 'getIdBySlug'),
		Route::FILTER_OUT => array($articleService, 'getSlugById'),
	),
	'action' => 'default',
));
Aurielle
Člen | 1281
+
0
-
$router[] = new Route('[<lang ...>/]<url .*?>', array(
	'presenter' => '...'
	'action' => '...',
	'lang' => '...',
	'url' => array(
		Route::FILTER_IN => function($value) { /* funkce filtrující přicházející argumenty třeba proti databázi, pokud neexistuje vrátí se NULL */ },
		Route::FILTER_OUT => function($value) { /* to samé, jen pro generování odkazů */ },
		Route::VALUE => 'default hodnota, nepovinná',
	),
));

Filtry se dají použít třeba i na převádění URL na interní ID a zpět.

whipster
Člen | 17
+
0
-

Děkuji za nasměrování
Nahradil jsem konstrukci routy, ale stejně to generuje nesmyslné URL :(

<?php
 $router[] = new Route('[<lang [a-z]{2}>/]<page .*?>', array(
                'presenter' => 'Page',
                'action' => 'default',
                'lang' => Environment::getVariable("lang"),
                'page' => array(
                    Route::FILTER_IN => function($value) {
                        $page = dibi::fetchSingle("SELECT id FROM pages WHERE %and",array("url"=>$value,"status"=>  Pages::STATUS_ACTIVE));
                        if ( $page) return $page;
                    },
                    Route::FILTER_OUT => function($value) {
                        $page = dibi::fetchSingle("SELECT url FROM pages WHERE id=%i",$value);
                        if ($page) { return $page; }
                    },
                    //Route::VALUE => 'defaultValue',
                ),
        ));
?>

ale bez výsledku :(

<?php
{plink this} v šabloně vrací "/testApp/document_root/page/"
?>
Filip Procházka
Moderator | 4668
+
0
-

Tohle by ti mohlo pomoct… https://forum.nette.org/…dnot-pri-mvc

whipster
Člen | 17
+
0
-

Děkuji – stránka byla opravdu velice inspirující.
Nicméně se obávám že to nijak nevysvětluje proč mi presenter generuje špatně URL – konstrukce je ± stejná…

Zajímá mě jestli dělám něco špatně nebo je to skutečně chyba v Nette