Bílá stránka, trošku jinak?
- Ondřej Brejla
- Člen | 746
Tak a je to tu zas, opět problém s bílou stránkou na produkčním sevreru. 777 práva mám na sessions, log a temp. Nepotřebuju odchytávat exceptiony laděnkou (přestože se mi to nepodařilo rozběhat ani po půl hodině různého kombinování nastavení), stačí mi logy v logs. Problém je, že se žádné logy neuloží (ano, opravdu mám práva zápisu).
Zadám adresu webu…a bílá stránka. Kouknu do logs, tam nic. FW se nahraje, dokonce se vytvoří url a dokonce se vygenerují tempy webu! Nicméně se nezobrazí, bílá stránka. Po několikahodinovém mlácení do klávesnice jsem zjistil, že problém je tu (používám továrničku):
public function renderLogin() {
//echo $this->getComponent('loginForm');exit;
$this->template->loginForm = $this->getComponent('loginForm');
}
Pokud první řádek odkomentuju, tak se form vyechuje. Pokud je zakomentovaný, bílá stránka. Každopádně, pokud udělám toto:
public function renderLogin() {
$this->template->loginForm = 'test';
}
Tak se zobrazí opravdu celá kompletní stránka, tak jak má…
Může mi někdo vysvětlit, co za tím stojí a jak tomu předejít případně to opravit? Na localu běží celá aplikace bez problémů.
Je možné, že to bude nějaká ptákovina, ale já už jsem zoufalej…díky.
Revize Nette – 338
PHP Version 5.2.4–2ubuntu5.3
Apache 2.0
Editoval Warden (11. 6. 2009 20:37)
- Ondřej Brejla
- Člen | 746
Já v tom chybu nevidim…ale už z toho mám za celý den uplně vymatláno…
protected function createComponentLoginForm($name) {
$form = new AppForm();
$renderer = $form->getRenderer();
// zakážeme použití JS validace
//$renderer->setClientScript(NULL);
$renderer->wrappers['controls']['container'] = Html::el('table')->align('center');
$renderer->wrappers['form']['errors'] = FALSE; // zakáže vypisování errorů automaticky formulářem
$form->addText('username', 'Přihlašovací jméno:')
->addRule(Form::FILLED, 'Zadejte přihlašovací jméno.');
$form->addPassword('password', 'Přihlašovací heslo:')
->addRule(Form::FILLED, 'Zadejte přihlašovací heslo.');
$form->addSubmit('login', 'Přihlásit');
$form->onInvalidSubmit[] = array($this, 'formInvalidSubmitted');
$form->onSubmit[] = array($this, 'formSubmitted');
return $form;
}
- Ondřej Brejla
- Člen | 746
Tak teď jsem zjistil, že pokud upravím kód takto:
public function renderLogin() {
$this->template->loginForm = (string) $this->getComponent('loginForm');
}
a v šabloně pak použiju místo klasického {$loginForm}
neescapovaný {!$loginForm}
, tak se formulář i web vykreslí tak
jak má…není to nějaký bug či nejaký šílený haluz?
EDIT: tak ještě trošku líp, to přetypování na (string)
být nemusí, ale vykřičník v šabloně být musí, jinak
je bílá stránka…ale pouze na produkčním serveru (nějaká php fce, kterou
daná verze php nepodporuje?)
Editoval Warden (11. 6. 2009 21:37)
- nAS
- Člen | 277
Warden napsal(a):
a v šabloně pak použiju místo klasického{$loginForm}
neescapovaný{!$loginForm}
, tak se formulář i web vykreslí tak jak má…není to nějaký bug či nejaký šílený haluz?EDIT: tak ještě trošku líp, to přetypování na
(string)
být nemusí, ale vykřičník v šabloně být musí, jinak je bílá stránka…ale pouze na produkčním serveru (nějaká php fce, kterou daná verze php nepodporuje?)
Nemůže to souviset s tímhle?
sodae napsal(a):
PS:
$this->addComponent($form, $name);
je to nutné ? stačí returnovat instanci Form, ne?
, aspoň to tak dělám
Tím vytváříš při každém požadavku na form novou instanci, takže úplně ztrácíš výhody továrničky a nebude ti fungovat ukládání proměnných atd.
Edit: Ono to pouze s tím returnem nebude asi fungovat vůbec.
Editoval nAS (11. 6. 2009 22:50)
- Ondřej Mirtes
- Člen | 1536
Ještě bych ho zkusil svázat s presenterem – čtvrtý řádek:
$form = new AppForm($this, $name);
- Ondřej Brejla
- Člen | 746
nAS napsal(a):
Nemůže to souviset s tímhle?
Možné to je, těžko říct…každopádně vykřičník v templatě to řeší. Asi začnu pro jistotu psát všechny formy neescapované.
- Honza Marek
- Člen | 1664
sodae napsal(a):
PS:
$this->addComponent($form, $name);
je to nutné ? stačí returnovat instanci Form, ne?
, aspoň to tak dělám
Podle mě jenomreturnování funguje jenom u takové té vytuněné továrničky, která se tu někde válí na fóru. Určitě se ten formulář musí nějakým způsobem připojit k prezenteru.
- nAS
- Člen | 277
Warden napsal(a):
nAS napsal(a):
Nemůže to souviset s tímhle?
Možné to je, těžko říct…každopádně vykřičník v templatě to řeší. Asi začnu pro jistotu psát všechny formy neescapované.
Jestli máš přístup do logů Apache, tak se zkus podívat, jestli není něco tam. Konkrétně ta „segmentation fault“.
- Ondřej Brejla
- Člen | 746
To jsem hledal, ale nic podobného jsem nenašel…možná to nebude identická chyba, ale nějak spjatá.
- sodae
- Nette Evangelist | 250
Honza M. napsal(a):
Podle mě jenomreturnování funguje jenom u takové té vytuněné továrničky, která se tu někde válí na fóru. Určitě se ten formulář musí nějakým způsobem připojit k prezenteru.
Že jsem napsal Form tak to se jednalo jak Form, tak AppForm :), jinak použítám AppForm
A to Presenter->addComponent(), je to nutné u AppForm ?
Editoval sodae (12. 6. 2009 7:11)
- _Martin_
- Generous Backer | 679
Pokud jde o chybu, příčinou je hmyzák v PHP 5.2.4. Řešením je používat vždy a výhradně:
{!$form}
Vykřičník (musí se používat u všech vykreslitelných komponent vkládaných do šablony) je zde logický, protože proměnná obsahuje XHTML kód, který nechceme escapovat.
Továrničku máš napsanou správně, pro větší efektivnost ještě
můžeš – jak psal LastHunter – odebrat řádek s
addComponent
a jeho funkčnost nahradit na začátku pomocí:
$form = new AppForm($this, $name);
- David Grudl
- Nette Core | 8227
Zkusil jsem něco upravit, můžete ověřit, jestli i v poslední revizi tato chyba vzniká?
- Ondřej Brejla
- Člen | 746
V poslední revizi mi funguje zobrazení formu i BEZ vykřičníku, takže nejspíš fixed.
Editoval Warden (15. 6. 2009 16:41)