Roury fungují, ale nedá se dostat na pohled přes {plink nazevpohledu}

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

Ahoj všem,

vím že se tu ohledně routování řešilo snad už úplně všechno, ale bohužel jsem odpověď nenašel ani po dvou dnech procházení jednotlivých příspěvků, tak se osměluji a zkusím se zeptat.

V bootstrap.php mám nastavenu rouru:

$router[] = new Route('<page .*><filetype (\.html()|(\.))><action>', array(
	'presenter' => 'Page',
	'action' => 'default',
));

abych mohl mít například dvě adresy

a na ně dát buďto již uloženou stránku a nebo její variantu pro editaci. V PagePresenter.php mám vytvořené dvě třídy

public function renderDefault($page) {
	$this->template->title = 'neco';
	$this->template->text = 'muhehe';
}
public function renderEdit() {
	$this->template->title = 'neco - edit';
	$this->template->text = 'umcaca';
}

Při zadání jednotlivých stránek se vše v pořádku vykoná, ale jakmile zkusím zadat v Page.default.phtml žádost aby mi to poslalo link na editaci tj. {plink edit} tak mi to napíše /o-nas error: No route for Page:edit().

Asi mi uniká nějaká maličkost, protože když dám link ručně do url tak roura funguje.

Nemá někdo nějakou myšlenku co dělám špatně, či zda třeba nechápu systém pohledů a routování zcela špatně.

Díky moc.

ViliamKopecky
Nette hipster | 230
+
0
-

Co použít dvě routy?

$router[] = new Route('<page .*>.html', array(
        'presenter' => 'Page',
        'action' => 'default',
));
$router[] = new Route('<page .*>.edit', array(
        'presenter' => 'Page',
        'action' => 'edit',
));
Petr Mašát
Člen | 101
+
0
-

Bohužel dvě routy nepomohly. Stále stejný výsledek : /

ViliamKopecky
Nette hipster | 230
+
0
-

Otestováno:

// require LIBS_DIR . '/Nette/loader.php';

$router = new MultiRouter();

$router[] = new Route('<page .*>.html', array(
        'presenter' => 'Page',
        'action' => 'default',
));
$router[] = new Route('<page .*>.edit', array(
        'presenter' => 'Page',
        'action' => 'edit',
));;

$url = "http://example.com/neco.html";
$httpRequest = new HttpRequest();
$httpRequest->setUri(new UriScript($url));

Debug::dump($router->match($httpRequest));


$url = "http://example.com/neco.edit";
$httpRequest = new HttpRequest();
$httpRequest->setUri(new UriScript($url));

Debug::dump($router->match($httpRequest));

Neruší ti to nějaká jiná routa?

Petr Mašát
Člen | 101
+
0
-

Hm, všiml jsem si že používám místo $router = new MultiRouter(); toto:

$router = Environment::getApplication()->getRouter();
$router = $application->getRouter();

a když to nahradím tvou variantou tak mi to padne do chyby (neexistující presenter DefaultPresenter) ještě rychleji : )
Ten když vytvořím (nechápu proč ho musím vytvářet, vždyť ty routy míří přece na PagePresenter) tak se mi to pro změnu zacykli : /

Myslím že asi dělám něco velice nedobře, ale stále mi nedochází co, tak bych tě chtěl poprosit zda by ses nemohl podívat na můj aktuální stav projektu , protože jinak bychom se možná mohli točit na místě vzhledem k tomu že asi nedokáži přesně pochopit a popsat kde je tzv. zakopán pes.

Jen měj prosím slitování nad poslaným kódem, jsem holt jenom kodér jenž si chce zkusit něco napsat : ) tzn. poslaný kód bude obsahovat nemalé množství špatných praktik.

Díky moc.

ViliamKopecky
Nette hipster | 230
+
0
-

Tak… problém byl především v .htaccess, kterej jsi neměl v document_root, ale v tom kořenovým adresáři a ještě byl nějakej změněnej… a pro jistotu jsem ti přidal ještě takovou routu, která schramstne celkem všechno co neprojde těma nad ní. tady

Jestli ten .htaccess měl znamenat, že chceš aby web fungoval přímo odtamtud namísto až z document_root, tak je lepší tam přesunout celej obsah toho document_root, a v index.php změnit cesty k LIBS_DIR a APP_DIR.

Petr Mašát
Člen | 101
+
0
-

.htaccess jsem měl v kořenovém adresáři, protože jsem měl špatně nastavenou v konfiguraci apache DocumentRoot a to do /var/www/ a ne do /var/www/document_root – opraveno, takže nyní již ten .htaccess v kořenu nepotřebuji (vymazal jsem ho).
S tvojí úpravou již stránka plink vrací ale bohužel ne jako http://www.domena.cz/o-nas.edit ale jako http://www.domena.cz/page/edit tj. použije se pro editaci tento kousek:

$router[] = new Route('<presenter>/<action>/<id>', array(
        'presenter' => 'Page',
        'action' => 'default',
        'id' => NULL,
));

a ne tento:

$router[] = new Route('<page .*>.edit', array(
        'presenter' => 'Page',
        'action' => 'edit',
));

Nevíš prosím tě co ještě s tímto problémem?

Díky za tvoji trpělivost.