Chyba pri predefinovani PresenterComponent->render
- stanley
- Člen | 22
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
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
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;
}
}
?>
- stanley
- Člen | 22
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?
- stanley
- Člen | 22
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…