Nette bez mod rewrite

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

Měl bych takový obecný dotaz, jak funguje Nette v případě, že na serveru není podpora mod_rewrite.
Pokud nepoužiji skeleton, a nenastvím routování v bootstrapu, tak Nette defaultně hledá DefaultPreseneter. Vytvořím tedy DefaultPresenter+default šablonu a vše funguje podle očekávání.
Ovšem, pokud použijí připravený skeleton a nechám povolené routování, Nette očekává jako výchozí BasePresenter a výchozí pro ostaní Presentery, navíc je abstraktní, což DefaultPresenter být nemůže, tedy musel bych předřadit ještě jeden abstraktní Presenter za DefaultPresenter, abych dodržel logiku skeletonu.
Pokud bych použil skeleton a vypnul routování, pak nefunguje správně odkazování, protože jsou vytvářená hezká URL, která samozřejmě končí chybou, pokud mode rewrite není povolen.

Čili jak z toho ven? Používat DefaultPresenter a další BasePresenter a pak rozvětvit web?

Editoval 22 (26. 1. 2010 15:28)

Honza Marek
Člen | 1664
+
0
-

Použít jakékoliv presentery a SimpleRouter.

22
Člen | 1478
+
0
-

Dá se to trošku rozvést? když dám v dokumentaci do vyhledávání simple router, zmizí vyhledávací okno a nic se neděje :-)

22
Člen | 1478
+
0
-

diky, prostuduji..

22
Člen | 1478
+
0
-

teď ještě dotaz, jde nějak ošetřit, aby aplikace fungovala pro oba případy? tzn. pokud zjistí, že není povoleno mod rewrite, použila simple routing?

Editoval 22 (26. 1. 2010 16:30)

Ondřej Brejla
Člen | 746
+
0
-

Dej SimpleRouter jako poslední routu? Pokud nevyhoví žádná před ním, použije se simple…

22
Člen | 1478
+
0
-

simple routa mi háže chybu :-(
BadRequestException #404
Presenter name must be alphanumeric string, '' is invalid.

bootstrap.pbp

//Nastavení
$application = Environment::getApplication();
$application->errorPresenter = 'Error';

//Nastavení routeru
$router = $application->getRouter();
/*
$router[] = new Route('index.php', array(
	'presenter' => 'HomePage',
	'action' => 'default',
), Route::ONE_WAY);

$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'HomePage',
	'action' => 'default',
	'id' => NULL,
));
*/
$router[] = new SimpleRouter('index.php', array(
	'presenter' => 'HomePage',
	'action' => 'default',
), Route::ONE_WAY);

$router[] = new SimpleRouter('<presenter>/<action>/<id>', array(
	'presenter' => 'HomePage',
	'action' => 'default',
	'id' => NULL,
));
Panda
Člen | 569
+
0
-

Nejde míchat oba druhy routování, protože pokud bude mod_rewrite zakázán, tak ty „běžné“ routy vyhoví a použijí se (problém je hlavně ve vytváření odkazů) – k SimpleRouteru se to ani nedostane. A zase opačně – kdyby byl SimpleRouter první, tak vyhoví a k těm dalším se to nedostane.

Honza Marek
Člen | 1664
+
0
-

Ondřej Brejla napsal(a):

Dej SimpleRouter jako poslední routu? Pokud nevyhoví žádná před ním, použije se simple…

To určitě ne. Odkazy se pak budou generovat stejně na první routy.

Spíš bych zkusil něco takového:

if (in_array("mod_rewrite", apache_get_modules())) {
	// nastavit normální routy
} else {
	// nastavit simplerouter
}
22
Člen | 1478
+
0
-

Honza Marek napsal(a):

Ondřej Brejla napsal(a):

Dej SimpleRouter jako poslední routu? Pokud nevyhoví žádná před ním, použije se simple…

To určitě ne. Odkazy se pak budou generovat stejně na první routy.

Spíš bych zkusil něco takového:

if (in_array("mod_rewrite", apache_get_modules())) {
	// nastavit normální routy
} else {
	// nastavit simplerouter
}

nebylo by dobré tohle dát přímo do skeletonu tedy?

Ondřej Brejla
Člen | 746
+
0
-

Jistěže píšu bláboly…ale než to stačím opravit, tak jsou tu další odpovědi. Naštěstí. Jdu se projít…nepřemýšlím…

Panda
Člen | 569
+
0
-

22 napsal(a):

nebylo by dobré tohle dát přímo do skeletonu tedy?

To by nebylo asi nejlepší: https://forum.nette.org/…-mod-rewrite.

Jinak je to SimpleRouter, ne SimpleRoute, takže použití je trochu jiné:

$application->setRouter(new SimpleRouter());

Samožřejmě lepší je řešit to přes service…

22
Člen | 1478
+
0
-

Pokud použiju:

$application->setRouter(new SimpleRouter());

háže to missing presenter, přitom HomePagePresenter tam je…

Editoval 22 (26. 1. 2010 17:13)

22
Člen | 1478
+
0
-

Proč Laděnka v Nette Apllication vypisuje misto index.php ndex.php?

array(1) ▼ {
   0 => object(PresenterRequest) (7) ▼ {
      "method" private => string(3) "GET"
      "flags" private => array(1) ▼ {
         "secured" => bool(FALSE)
      }
      "name" private => string(0) ""
      "params" private => array(1) ▼ {
         "action" => string(8) "ndex.php"
      }
      "post" private => array(0)
      "files" private => array(0)
      "frozen" private => bool(FALSE)
   }
}
Honza Marek
Člen | 1664
+
0
-

22 napsal(a):

nebylo by dobré tohle dát přímo do skeletonu tedy?

Kdysi to tam bylo, ale skeleton pak prošel zjednodušením. Ono nepřítomnost rewritu na hostingu asi nebude moc častá situace. Hlavně ten můj způsob ale funguje jen pod apache, což není jediný webserver na světě :)

22
Člen | 1478
+
0
-

Tady je bootstrap se Simple route, háže chybu:
Presenter name must be alphanumeric string, '' is invalid.

<?php
//Zavoláme si framework
require LIBS_DIR . '/Nette/loader.php';

//a pustíme si debuggovací službu - známou jako Ladenka
Debug::enable();

//Náhrání konfigurace
Environment::loadConfig();

//Nastavení
$application = Environment::getApplication();
$application->errorPresenter = 'Error';

//Nastavení routeru
$router = $application->getRouter();
$router[] = new SimpleRouter('index.php', array(
	'presenter' => 'HomePage',
	'action' => 'default',
));

//Start aplikace
$application->run();

…není mi jasný, kde je chyba, asi se půjdu taky projít :-(

Honza Marek
Člen | 1664
+
0
-

Panda: Celý Simple lze použít i jako jednu z rout v multirouteru.

Editoval Honza Marek (26. 1. 2010 17:51)

22
Člen | 1478
+
0
-

Honza Marek napsal(a):

22 napsal(a):

nebylo by dobré tohle dát přímo do skeletonu tedy?

Kdysi to tam bylo, ale skeleton pak prošel zjednodušením. Ono nepřítomnost rewritu na hostingu asi nebude moc častá situace. Hlavně ten můj způsob ale funguje jen pod apache, což není jediný webserver na světě :)

Problém je v tom, že pokud někdo mod_rewrite nemá a chce testovat Nette, použije skeleton + nějaký návody tady, kde se automaticky předpokládá mod rewrite on, dostane se do potíží..

Honza Marek
Člen | 1664
+
0
-

22 napsal(a):
…není mi jasný, kde je chyba, asi se půjdu taky projít :-(

Podle API to nevypadá, že by SimpleRouter přijímal jako první parametr jméno souboru. Možná je špatná dokumentace.

Panda
Člen | 569
+
0
-

22 napsal(a):

Pokud použiju:

$application->setRouter(new SimpleRouter());

háže to missing presenter, přitom HomePagePresenter tam je…

Pardon, ještě tomu routeru o tom HomePagePresenteru musíš říct:

$application->setRouter(new SimpleRouter(array('presenter' => 'HomePage')));
22
Člen | 1478
+
0
-

pak dostavam tuto chybu:
Cannot use object of type SimpleRouter as array

zajímavý je, že ten původní bootstrap o pár příspěvků výše, jeden na venkovní adrese, akora nenačte patřičný layout a hlásí 404, pokud to spustím na lokalni siti, vyhlasí: Presenter name must be alphanumeric string, '' is invalid.

Panda
Člen | 569
+
0
-

Prosím celou výjimku, abych viděl, kde přesně k tomu dochází. Tipuji, že nastavíš ten router a pak se do něj snažíš ještě cpát další routy ve stylu

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

Jinak rozdílné chování podle adresy sice zajímavé je, ale jedná se o jednu z těch „killer features“ Nette – nastavení aplikace podle prostředí ve kterém se nachází. LAN autmaticky zapíná vývojové prostředí, venkovním uživatelům to chyby přece nebude vypisovat. Viz https://doc.nette.org/cs/configuring.

Honza Marek napsal(a):

Panda: Celý Simple lze použít i jako jednu z rout v multirouteru.

Jasně, i MultiRoutery jdou zanořovat, když to všechno sdílí rozhraní IRouter… Ale má to smysl takto uvádět, když to stejně nejde moc kombinovat? Neudělalo by to začátečníkovi ještě o trošku větší guláš, kdyby to dělalo neplechu?

22
Člen | 1478
+
0
-

No já to tam necpu, jak vidíš v posledním bootstrapu..
Jak ti mám přeposlat celej vypis chyby? Zapnul jsem Laděnku na Development, abych ti poslal odkaz ale nejak to nebere v potaz..

Debug::enable(Debug::DEVELOPMENT);

Editoval 22 (26. 1. 2010 18:31)

22
Člen | 1478
+
0
-

no nic, jdu nainstalit Apache spolu s IIS6 :-)

Ondřej Mirtes
Člen | 1536
+
0
-

Mně tedy funguje řešení:

$router[] = new SimpleRouter(array(
	'module' => 'Web',
	'presenter' => 'Homepage',
	'action' => 'default',
));

Pokud použiju variantu se setRouter, Laděnka zahlásí:

Service named 'Nette\Application\IRouter' has been already registered.

Jinak je jasné, že SimpleRouter má jiné parametry konstruktoru, stačí použít hlavu (a pokud selže, tak API).

22
Člen | 1478
+
0
-

..tak to už vypadá líp :-) akorat jsem vypnul module:

$router[] = new SimpleRouter(array(
        'module' => NULL,
        'presenter' => 'HomePage',
        'action' => 'default',
));
Ondřej Mirtes
Člen | 1536
+
0
-

Ten řádek s ním můžeš úplně odstranit :) Takže problém vyřešen?

22
Člen | 1478
+
0
-

jojo, ten jsem odstranil, stejně bych se vsadil, že jsem to už tak měl jednou napsaný :-)..diky za pomoc panové