Chyba pri predefinovani PresenterComponent->render

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

Ahoj, nasel jsem jednu malou nevychytavku metody PresenterComponent->render(). Pri pokusu o naprosto korektni predefinovani v prezenteru (se zachovanim vsech parametru a volitelnosti parametru $code), dojde k vyvolani chyby Destination must be non-empty string.
Kocka jest zakopana v podmince if(!is_numeric($code)), jelikoz pri volani rodicovske metody je jiz parametr $code uveden a roven NULL, tudiz podminka is_numeric($code) vraci false, cimz se dana metoda uvede v omyl a nespravne vymeni sve parametry.
Reseni by mohlo byt if(is_string($code)).

Nette Framework 2.0-dev (revision a8e74c1 released on 2010–10–14)
PHP 5.3.2

arron
Člen | 464
+
0
-

Mel jsi asi na mysli metodu PresenterComponent->redirect

Nevim jak presne to mas predefinovane, ale chovani je to spravne. Metoda redirect ocekava jako prvni paremetr bud kod presmerovani (coz je int, proto is_numeric($code)), pak se cil pro presmerovani musi nadefinovat ve druhem parametru, a nebo se kod presmerovani neuvede a v prvnim parametru se ocekava cil pro presmerovani. A ta podminka if(!is_numeric($code)) prave oddeluje tyto dva pripady, pokud parametr $code neni cislo, tak to neni kod presmerovani, ocekava se, ze je to cil pro presmerovani, a dojde k vymene parametru.

Bez ukazky Tvoji implementace jsou ale tohle jenom takova obecna konstatovani :-)

stanley
Člen | 22
+
0
-

Jej, pardon, opravdu jde o metodu PresenterComponent->redirect(), nevim kde se mi tu vzalo render…

Kazdopadne nasledujici kod nefunguje tak jak bych ocekaval (chyba „Destination must be non-empty string“). Chci zde predefinovat metodu redirect tak, aby automaticky zahrnovala do $args hodnotu $this->language.

<?php
final class ExamplePresenter extends \Nette\Application\Presenter
{
	protected $language;

	public function redirect( $code, $destination = NULL, $args = array() ) {
		//podminka nize je doslovna kopie z PresenterComponent
		if (!is_numeric($code)) { //first parameter is optional
			$args = $destination;
			$destination = $code;
			$code = NULL;
		}
		if (!isset($args['lang'])) {
			$args['lang'] = $this->language;
		}
		parent::redirect($code, $destination, $args);
	}

	public function startup() {
		$this->language = 'en';
	}

	public function actionSomeaction() {
		$this->redirect('otheraction');
		//ocekavam presmerovani na otheraction s parametrem
		//'lang' = $this->language;
	}
}
?>
Aurielle
Člen | 1281
+
0
-

Nic nepředefinovávej a použij persistentní parametr.

stanley
Člen | 22
+
0
-

Jasne, ze si vystacim s perzistentnim parametrem jsem uz taky zjistil, nicmene ten problem je obecnejsi – treba nekdo bude chtit tu metodu predefinovat nejakym sofistikovanejsim zpusobem a pak uz si s tim neporadi. Pripada mi, ze nahradi-li se

if (!is_numeric($code)) {

za

if (is_string($code)) {

tak se to poresi jednou provzdy. Nebo se pletu?

Aurielle
Člen | 1281
+
0
-

Pokud něco předefinuješ tak jedinou věc, kterou musíš zachovat, je definice funkce. V jejím těle může být cokoliv. Osobně nevidím problém, ukaž příklad, kde selhává !is_numeric.

stanley
Člen | 22
+
0
-

Viz vyse. A neni ani zapotrebi se zaobirat nejakym predefinovavanim… Polopaticky:

<?php
// chci nastavit $code jenom nekdy
$code = ( $this->testSomething() ) ? $someVariable : NULL;
$this->redirect( $code, 'myAction' );
?>
Aurielle
Člen | 1281
+
0
-
$code = ($this->something()) ? $someVar : IHttpResponse::S302_FOUND;
$this->redirect($code, 'Presenter:action');

viz API

stanley
Člen | 22
+
0
-

Ok, prakticky vsechno se da ohackovat…

Z implementace metody PresenterComponent->redirect() je patrne, ze pokud neni uvedeny argument $code, jeho defaultni hodnota je NULL, nikoliv IHttpResponse::S302_FOUND. A v odkazovane implementaci Presenter->redirectUri() je i videt proc…