Routovanie pomocou polí Nefunkčné!!!

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

Zdravím,
Samozrejme predtým ako som založil túto tému som prešiel všetko ale nič pravdepodobne neriešilo môj problém

doteraz som používal tento typ routovania:

<?php

use Nette\Application\Routers\RouteList,
	Nette\Application\Routers\Route,
	Nette\Application\Routers\SimpleRouter;


/**
 * Router factory.
 */
class RouterFactory
{

	/**
	 * @return Nette\Application\IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList();
		$router[] = new Route('index.php', 'Indexpage:index_view', Route::ONE_WAY);
        $router[] = new Route('login', 'Loginpage:login_view');
        $router[] = new Route('register', 'Registerpage:register_view');
		$router[] = new Route('<presenter>/<action>[/<id>]', 'Indexpage:index_view');
		return $router;
	}

}

A všetko fungovalo perfetkne myslím tým url adresy
Ale akonáhle som to chcel alebo sa pokúšal zmeniť to na tento typ:

<?php

use Nette\Application\Routers\RouteList,
	Nette\Application\Routers\Route,
	Nette\Application\Routers\SimpleRouter;


/**
 * Router factory.
 */
class RouterFactory
{

	/**
	 * @return Nette\Application\IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList();

        $router[] = new Route('<presenter>/<action>[/<id>]', array(
               'presenter' => 'Indexpage',
               'action'    => 'index_view',
               'id'        =>  Null,
                               Route::ONE_WAY,
        ));

        $router[] = new Route('<presenter>/<action>[/<id>]', array(
               'presenter' => 'Loginpage',
               'action'    => 'login_view',
               'id'        =>  Null,
        ));

		$router[] = new Route('<presenter>/<action>[/<id>]', array(
               'presenter' => 'Registerpage',
               'action'    => 'register_view',
               'id'        =>  Null,
        ));

        /**
         * $router[] = new Route('<>/<>[/<>]', array(
         *        'presenter' => '',
         *        'action'    => '',
         *        'id'        => Null,
         * ));
         */
        return $router;
	}
}

Tak mi nefunguje nič ani ladenka nič neukazuje a url adresy po akomkoľvek kliku sa nepresmerujú a stále ostáva iba defaultná adresa čiže index .
Neviem na to prísť kde môže byť chyba som len začiatočnik a stále sa účím no toto je pre mňa nepochopiteľné prečo tie adresy sú nefunkčné…
Za akúkoľvek pomoc som vopred vďačný!

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jenom bych podotknul, že ten převod na pole vůbec není totožný, vždyť je to úplně jiná definice. Nevím, co bylo tvojí motivací to přepsat z těch stringů na pole, ale zkus to znova a přesně. Určitě to bude fungovat stejně.

Zbavil bych se být tebou těch ...page a ..._view přípon, to není vůbec hezké, ale určitě zbytečné.

A do třetice :), ten Route::ONE_WAY máš teďka součástí toho pole, což nic neznamená. Musí zůstat jako třetí parametr.

SontoEremo
Člen | 341
+
0
-

vojtech.dobes napsal(a):

Jenom bych podotknul, že ten převod na pole vůbec není totožný, vždyť je to úplně jiná definice. Nevím, co bylo tvojí motivací to přepsat z těch stringů na pole, ale zkus to znova a přesně. Určitě to bude fungovat stejně.

Zbavil bych se být tebou těch ...page a ..._view přípon, to není vůbec hezké, ale určitě zbytečné.

A do třetice :), ten Route::ONE_WAY máš teďka součástí toho pole, což nic neznamená. Musí zůstat jako třetí parametr.

Nazdar vďaka za odpoveď tak som to ešte teda skúsil znova podarilo sa mi toto:

<?php

use Nette\Application\Routers\RouteList,
	Nette\Application\Routers\Route,
	Nette\Application\Routers\SimpleRouter;


/**
 * $router[] = new Route('index.php', 'Indexpage:index_view', Route::ONE_WAY);
 * $router[] = new Route('login', 'Loginpage:login_view');
 * $router[] = new Route('register', 'Registerpage:register_view');
 * $router[] = new Route('<presenter>/<action>[/<id>]', 'Indexpage:index_view');
 */
class RouterFactory
{

	/**
	 * @return Nette\Application\IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList();

        $router[] = new Route('index<action>', array(
               'presenter' => 'Indexpage',
               'action'    => 'index_view',
               'id'        => NULL,
        ), Route::ONE_WAY);

        $router[] = new Route('login<action>', array(
               'presenter' => 'Loginpage',
               'action'    => 'login_view',
               'id'        => NULL,
        ));

		$router[] = new Route('register<action>', array(
               'presenter' => 'Registerpage',
               'action'    => 'register_view',
               'id'        => NULL,
        ));
        $router[] = new Route('<presenter>/<action>[/<id>]', 'Indexpage:index_view');
        /**
         * $router[] = new Route('<>/<>[/<>]', array(
         *        'presenter' => '',
         *        'action'    => '',
         *        'id'        => NULL,
         * ));
         */
        return $router;
	}
}

Ale prosím ťa je to dobrý spôsob? či sa mám vrátiť späť na ten prvý Rout a doplňať len hodnoti do neho…

čo sa týka tých prípon page prisahám, že som bol celý čas v tom, že to je povinné :) :) :) lebo som to vždy vydel na príklade ale ak sú neni povinné idem odstraňovať :)
a tie _view sa mi zdalo také nevšedné, že aha _view čiže šablóna :) :) :).

Grelek
Člen | 233
+
0
-
$router = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
// nebo pomocí pole
$router = new Route('<presenter>/<action>[/<id>]', array(
	'presenter' => 'Homepage',
	'action' => 'default',
));

A jen taková poznámka k tvému způsobu rout. Proč mám divný pocit, že vytváříš pro každý presenter novou routu?

SontoEremo
Člen | 341
+
0
-

Grelek napsal(a):

$router = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
// nebo pomocí pole
$router = new Route('<presenter>/<action>[/<id>]', array(
	'presenter' => 'Homepage',
	'action' => 'default',
));

A jen taková poznámka k tvému způsobu rout. Proč mám divný pocit, že vytváříš pro každý presenter novou routu?

Nazdar ako to myslíš pre každý? ako ináč by som mal definovať rout? snažím sa prísť na to ako to funguje…
Prečo je každé zadefinovanie presenteru zle? mohli by ste mi to tak laicky popísať díky.

Filip Procházka
Moderator | 4668
+
0
-

Zpracování routy, jestli odpovídá současné url, nebo vygenerování odkaz, něco stojí. Proto je lepší mít rout spíše méně a mít je obecné tak, aby odpovídaly co možná nejvíce presenterům.

Například tady je k tomu počtění.

Grelek
Člen | 233
+
0
-

No, stačí, když si pořádně přečteš dokumentaci a zjistíš si něco o MVC. Ve zkratce to je, že nějaký model (to je to M) obstarává práci s databázi, soubory a obecně s nějakými daty, provádí s nimi určité operace. Pak je tu V jako view, šablona. Myslím, že ta je jasná, prostě zobrazuje už připravená data. A ještě tu tedy je to C (u Nette by to mělo být spíše P), to je controller, v Nette presenter. Ten komunikuje s modely, získává od nich data a nebo jim je naopak předává ke zpracování a také posílá data do šablony k zobrazení.

A mělo by se to psát co nejvíc univerzálně, automaticky. Uvedu příklad.

class HomepagePresenter extends Nette\Application\UI\Presenter
{

	// proměnná pro model
	private $model;

	// do proměnné pro model dosadíme objekt našeho modelu
	public function injectModel(Model $model)
	{
		$this->model = $model;
	}

	// pokud HomepagePresenter renderuje šablonu default, obsloužíme ji zde
	public function renderDefault()
	{
		// předáme do šablony data
		$this->template->data = $this->model->getData();
	}
	// a takhle přidáváš různé šablony, obsluhu pro ně, můžeš tu taky vytvářet komponenty atd.

}


class AnotherPresenter extends Nette\Application\UI\Presenter
{

	// řekněme, že dělá podobné věci jako HomepagePresenter, akorát třeba ty data přijímá

}


// no a pak je tu routování
// je blbost psát routy pro každý presenter "na míru", proto je v předpřipraveném routeru ona routa
$router = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
// zkus si to představit takhle
// router = routa('JakýkolivPresenter/JakákolivAkce[/MůžeTuBýtID]', 'HomepagePresenter:renderDefault());

Teď doufám, že jsem nepsal nějaké bludy. Zkus si ještě přečíst tohle a tohle.

SontoEremo
Člen | 341
+
0
-

Vďaka chlapci za stručne a rýchle odp.
Ihneď sa púštam do čítania a ziastovania…

Grelek
Vďaka taktiež za názornú ukážku idem ju testovať a učiť sa :)