Bílá stránka, trošku jinak?

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

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 Mirtes
Člen | 1536
+
0
-

Ukaž část createComponent, kde ten form vytváříš :)

Ondřej Brejla
Člen | 746
+
0
-

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
+
0
-

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)

sodae
Nette Evangelist | 250
+
0
-

pro formuláře používej

{!$loginForm}

tam to je více pravděpodovnější že se vypíše proměná $loginForm jak má jako string , escap. to může pochopit jinak.

PS:

$this->addComponent($form, $name);

je to nutné ? stačí returnovat instanci Form, ne?
, aspoň to tak dělám

nAS
Člen | 277
+
0
-

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
+
0
-

Ještě bych ho zkusil svázat s presenterem – čtvrtý řádek:

$form = new AppForm($this, $name);
Ondřej Brejla
Člen | 746
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

To jsem hledal, ale nic podobného jsem nenašel…možná to nebude identická chyba, ale nějak spjatá.

sodae
Nette Evangelist | 250
+
0
-

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
+
0
-

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 | 8139
+
0
-

Zkusil jsem něco upravit, můžete ověřit, jestli i v poslední revizi tato chyba vzniká?

Ondřej Brejla
Člen | 746
+
0
-

V poslední revizi mi funguje zobrazení formu i BEZ vykřičníku, takže nejspíš fixed.

Editoval Warden (15. 6. 2009 16:41)