Jak na Apache, aby nette-forms fungovalo?
- neo.taa
- Člen | 14
Zdravím.
Mám Apache spuštěný na mém vlastním počítači (localhost). Tam mi
nefungují Nette formuláře.
Odeslaný formulář obsahuje data v poli $_REQUEST, ale Nette zhavaruje na volání funkce „$form->isSubmitted()“. Laděnka nic nenapíše.
Takže otázka zní : jaké nastavení apache ovlivňuje tento problém? Pokud to tedy je v Apache.
Ještě výsledek pokusu : Pokud po odeslání formuáře otestuju
přítomnost dat z formuláře v poli $_REQUEST a pak hned zavolám fci
„$form->getValues()“, tak Laděnka vyhondí vyjímku
InvalidStateException, Form was not populated yet. Call method isSubmitted() or setDefaults().
A to na řádku 547 v souboru Nette/Forms/Form.php.
- Honza Kuchař
- Člen | 1662
neo.taa napsal(a):
Zdravím.
Mám Apache spuštěný na mém vlastním počítači (localhost). Tam mi nefungují Nette formuláře.Odeslaný formulář obsahuje data v poli $_REQUEST, ale Nette zhavaruje na volání funkce „$form->isSubmitted()“. Laděnka nic nenapíše.
Takže otázka zní : jaké nastavení apache ovlivňuje tento problém? Pokud to tedy je v Apache.
Ještě výsledek pokusu : Pokud po odeslání formuáře otestuju přítomnost dat z formuláře v poli $_REQUEST a pak hned zavolám fci „$form->getValues()“, tak Laděnka vyhondí vyjímku „InvalidStateException, Form was not populated yet. Call method isSubmitted() or setDefaults().“ A to na řádku 547 v souboru Nette/Forms/Form.php.
Mám takový pocit, že si musíš na formuláři
zavolat $form->setDefaults();
Ale stejně doporučuji používat konstrukci
$form = new Form();
$form->...
$form->onsubmit[] = "poOdeslani";
function poOdeslani(/* myslim, ze tady neco dostanes, ale nevim presne co*/){
}
Laděnka nic nehlásí: A máš ji zaplnou? Debug::enable();
?
- vlki
- Člen | 218
Postni sem tu část kódu, ve které se ti to nedaří.
Jaké máš nastavení direktiv display_errors
a
ini_set
?
Osobně bych zkusil tu část kódu debugovat. Pokud na to nemáš nějaký vhodný nástroj, můžeš si třeba zkusit zavést nějaké debug výpisy přímo do kódu Nette. Abys věděl, kde ti to spadne.
Takový problém (co vím), jsme tu ještě neřešili, takže to bude potřebovat větší diagnózu.
- David Grudl
- Nette Core | 8218
Asi by se tam mělo zavolat $form->processHttpRequest()
,
právě v ten okamžik se data zpracují, zavolají metody atd.
- neo.taa
- Člen | 14
Zdroják :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<?php
ini_set('display_errors', TRUE );
error_reporting (E_ALL);
require "Nette/loader.php" ;
Debug::enable(Debug::DEVELOPMENT);
$form = new Form ;
echo "<br/>Nette formulář vytvořen.\n" ;
$form->addText('name', 'Jméno:')
->addRule(Form::FILLED, 'Zadejte prosím své jméno');
$form->addText('email', 'E-mail:')
->addRule(Form::EMAIL, 'Zadejte prosím platnou e-mailovou adresu');
$form->addCheckbox('promo', 'zasílejte mi reklamu');
$form->addTextArea('text', 'Vzkaz:')
->addRule(Form::FILLED, 'Napište nám prosím vzkaz');
$form->addSubmit('send', 'Odeslat');
// jestliže byl formulář odeslán
echo "<br/>Test zda byl form odeslán, tj. před isSubm.." ;
echo "<br/>Req.Met: ". $_SERVER['REQUEST_METHOD'] ;
$prname = $_REQUEST['name'] ;
echo "<br/>Req.name: ". $prname ;
if ( strlen($prname) > 0 ) {
echo "<br/>Mám nějakou proměnnou, obsahuje : " . $prname ;
// $form->processHttpRequest() ;
// $values = $form->getValues();
// Debug::dump($values);
}
echo $form;
echo "<br/>Formulář hotový." ;
if ($form->isSubmitted()) {
echo "něco " ;
// a jestliže jsou všechny položky vyplněny správně
if ($form->isValid()) {
echo '<h1>Formulář byl odeslán</h1>';
$values = $form->getValues();
Debug::dump($values);
exit;
}
else
echo "No formulář nebyl celý v pořádku." ;
}
else {
echo "<br/>Nový formulář" ;
// a jestliže nebyl odeslán, nastavíme výchozí hodnoty
$form->setDefaults(array( 'promo' => true, "name" => "zadej jméno" ));
// každý si přeje, abychom mu zaplevelili e-mailovou schránku
}
?>
</body>
Tento script po odeslání formuláře vypíše text „Mám nějakou proměnnou, obsahuje : " a obsah té proměnné. Pak ukáže prázdný formulář a za textem "Formulář hotový“ už nic. Tedy zhavaruje na volání funkce $form->isSubmitted()
Pokud odstraním komentáře // v řádku // $form->processHttpRequest()
;
tak to celé zhavaruje a to hned za vypsaným textem „Mám nějakou proměnnou
…“, tedy právě totální zatuhnutí způsobí
$form->processHttpRequest() ;
Pokud odstraním komentáře // na hned dalším řádku // $values =
$form->getValues();
tak se vypíše vyjímka s hlášením „Form was not populated yet. Call
method isSubmitted() or setDefaults().“
Taky jsem pročetl už dva návody na nastavení Apache, ale nevím čím by
to mohlo být. Stále se mi zdá, že problém je někde v Apache nebo php. Ale
např. v error logu taky nickonkrétního není napsané. V souboru
„access_log“ je :
127.0.0.1 – – [10/May/2009:18:26:09 +0200] „POST /pokus-Nette/pokus.php
HTTP/1.1“ 200 2111 „http://localhost/pokus-Nette/pokus.php“
„Mozilla/5.0 (X11; U; Linux i686; cs; rv:1.9.0.10) Gecko/2009042315
Firefox/3.0.10“
A v soboru „error_log“ je :
[Sun May 10 18:02:58 2009] [error] [client 127.0.0.1] PHP Parse error: syntax
error, unexpected T_VARIABLE in /var/www/html/pokus-Nette/pokus.php on line 90,
referer: http://localhost/…te/pokus.php
Ale to nevím jestli je chyba týkající se právě toho problému, protože
jsem tam zkoušel i volat $form->něco ještě před $form = new Form ; tak
to mohlo být i tím. Navíc řádek 90 mám v tom scriptu už posunutý.
Ještě jsem to zkoušel zpustit ve VirtualBox-u ve WinXP + Apache, ale tam to taky nahlásí vyjímku : „Call to undefined method HttpRequest::setEncoding()“ + „File: C:\wamp\www\pokus-Nette\Nette\Forms\Form.php Line: 378“ a to na místě volání řádku :
if ($form->isSubmitted())
Což je divné, jiné o proti linuxu, protože tam mi to padá (volání funkce „$form->isSubmitted()“) až po odeslání formuláře a při jeho druhém zpracování, ale ve win ještě před odesláním formuláře, tj. při jakémkoli volání funkce „$form->isSubmitted()“.
- David Grudl
- Nette Core | 8218
Asi tuším zdroj problémů… V PHP je nejspíš nainstalováno rozšíření HTTP, které přepíše třídu HttpRequest svou vlastní. Řešením je tedy buď rozšíření vypnout, nebo použít prefixed verzi Nette.
p.s.přidal jsem to do Requirements Checkeru
- neo.taa
- Člen | 14
Tak prefixed verze Nette nepomohla, tedy jestli se jedná o to, když se před třídy dá písmenko „N“ a stáhne se k tomu odpovídající php balík (https://files.nette.org/…prefixed.zip). Pochopitelně jsem všude vyměnil na NForm, NDebug, atd. Zhavaruje to stejně.
Zajímavé jak se to chová na linuxu :
Při prvním otevření scriptu php, nedojde k ukončení při volání „$form->isSubmitted()", ale po odeslání formuláře už totéž volání ukončí script.
- neo.taa
- Člen | 14
Tak jsem to ještě testnul pod WinXP ve VirtualBox-u (v IE i FF) a tam to funguje (vypíše obsah odeslaných dat formuláře), ale jen pokud tam použiju prefixed verzi Nette.
Ale v linuxu ani prefixed verze nepomohla.
Tak to vypadá, že ve Win se opravdu přepíše třída HttpRequest a prefixed Nette to vyřeší.
Takže jak to, že prefixed Nette v linuxu nepomůže ?
- neo.taa
- Člen | 14
Tak v Linuxu se po volání funkce $form->processHttpRequest(), nebo
$form->isSubmitted() dojde k ukončení běhu php scriptu bez vypsání
jakékoli chyby i když je zapnutá laděnka i
„ini_set(‚display_errors‘,TRUE ); error_reporting (E_ALL);“.
Ale ve fci $form->processHttpRequest() jsem donutil vyskočit vyjímku a tím
pádem i Laděnkau a tím pádem zjistil obsaha proměnné $httpRequest :
object(NHttpRequest) (9) {
„query“ protected ⇒ NULL
„post“ protected ⇒ NULL
„files“ protected ⇒ NULL
„cookies“ protected ⇒ NULL
„uri“ protected ⇒ NULL
„originalUri“ protected ⇒ NULL
„headers“ protected ⇒ NULL
„uriFilter“ protected ⇒ array(2) {
5 ⇒ array(1) {
„#/{2,}#“ ⇒ string(1) „/“
}
0 ⇒ array(0) {
}
}
„encoding“ protected ⇒ NULL
}
- David Grudl
- Nette Core | 8218
Spíš tam zkus vypsat $httpRequest->isMethod('post')
a
$httpRequest->getPost()
. Můžeš zpřístupnit výpis
phpinfo()? Třeba někam uploadnout.
- David Grudl
- Nette Core | 8218
Už se snad pomalu dostáváme k cíli. Zkus v souboru
HttpRequest.php
vyhledat a zakomentovat ty dva řádky s voláním
error_reporting()
a napiš, jakou to teď hodí chybu.
ad phpinfo() – no nejlépe celou vygenerovanou stránku. S ní se dají problémy odhalit prakticky hned.
- neo.taa
- Člen | 14
Tak koukám na ty zdrojáky a líbí se mi jak je to napsané, ale to jen tak na okraj.
Našel jsem a zakomentoval ty error_reporting()
v
HttpRequest.php
, ale stále se žádná chyba nehlásí, prostě to
zkončí a nic.
Pak jsem ale zjistil, že to zhavaruje na funkci
initialize()
a tam to zhavaruje na volání $v = NString::fixEncoding($v);
a tam zase na volání fce iconv
, protože když odstraním
@
před touto funkcí na řádku :
return @iconv('UTF-16', $encoding . '//IGNORE', iconv($encoding, 'UTF-16//IGNORE', $s));
tak vyhlásí laděnka chybu :
Fatal Error Call to undefined function iconv()
Takže nechápu proč zrovna moje php nezná funkci iconv()
? Co
jsem komu udělal? :-)
část phpinfo : http://leteckaposta.cz/204844317
- neo.taa
- Člen | 14
To : _Martin_ :
Já mezi tím ,než jsi to tu napsal, narychlo pouvažoval a jen tak pokusně
nechal vyhledat balíček s názvem iconv jestli mi náhodou nechybí a ejhle
on existova a nebyl nainstalovaný.
Jasně kdybych se o tomhle Requirements Checker-u někde dozvěděl dřív, testnul bych to a byl bych pak nainstaloval ten balíček pro iconv.
Ale co už, aspoň jsem se zahrabal do těch zdrojáků :-) Furt jsem žil ale v domění, že to bude problém s nastavením Apache. Četl jsem ale tohle nevyčetl.
Ale dotaz ještě : ono se @
dává obyčejně před volání
funkce, která se považuje za požadovanou pro běh Nette ?
- _Martin_
- Generous Backer | 679
neo.taa napsal(a):
Ale dotaz ještě : ono se
@
dává obyčejně před volání funkce, která se považuje za požadovanou pro běh Nette ?
Ne ne, zavináč potlačuje v PHP vypsání chybové hlášky a
v případě iconv
byly nějaké problémy (kdesi to David psal,
bylo to něco, že snad hází chyby i při žádaném převodu, kdy
odstraňuje divný znaky či co – nevím už přesně).
- David Grudl
- Nette Core | 8218
Trošku jsem framework upravil, aby v případě podobných fatálních chyb zařval vždy.
- Jan Tvrdík
- Nette guru | 2595
_Martin_ napsal(a):
Asi by nebylo od věci více zpropagovat Requirements Checker.
Chtělo by to vytvořit stránku se slovním popisem požadavků na běh FW, kde se na Requirements Checker upozorní a odkaz na celou tuto stránku pak dát na stránku se stažením frameworku.
- _Martin_
- Generous Backer | 679
Jan Tvrdík napsal(a):
_Martin_ napsal(a):
Asi by nebylo od věci více zpropagovat Requirements Checker.
Chtělo by to vytvořit stránku se slovním popisem požadavků na běh FW, kde se na Requirements Checker upozorní a odkaz na celou tuto stránku pak dát na stránku se stažením frameworku.
Stačilo by tohle?
- karelk
- Člen | 2
Zdravím, mám podobný problém jako kolega výše, akorát na localu, popřípadě hostmonsteru mi vše funguje, jen na serveru, kde mám aplikaci nasadit, ne.
Formulář se vykreslí, zadám údaje, dám submit, ale data z formuláře neprojdou přes
<?php
// jestliže byl formulář odeslán
if ($form->isSubmitted()) {
$values = $form->getValues();
// a jestliže jsou všechny položky vyplněny správně
if ($form->isValid()) {
// zde se nic nevykoná
?>
$values je pak prázdná a nette hlásí, že jsem nezadal žádná data.
Server má php 5.2.9, moc víc se díky zablokovanému phpinfo() nedozvím, kromě:
disable_functions = shell_exec, exec, system, passthru, proc_close,
proc_open, proc_get_status, proc_nice, proc_open, proc_terminate,
shell_exec, dl, popen, pclose, chown, disk_free_space, disk_total_space,
diskfreespace, fileinode, max_execution_time, set_time_limit,
highlight_file, show_source, phpinfo, chgrp, symlink
max_execution_time = 90
max_input_time = 90
memory_limit = 32M
post_max_size = 17M
magic_quotes_gpc = On
include_path= „.:/usr/pkg/lib/php:inc:phplib:include“
upload_tmp_dir = /tmp/php
upload_max_filesize = 20M
allow_url_fopen = No
mysql.allow_persistent = Off
register_globals= Off
Přikládám ještě screen z requirements checkeru, který imho vypadá dobře (alespoň iconv je v pořádku). http://jdem.cz/bnuy3 Zkoušel jsem Nette 0.8 i 0.9, jak ve verzi s prefixy, tak i bez nich, jak minified, tak standard verzi.
Díky za jakýkoliv tip!
- David Grudl
- Nette Core | 8218
Tak vypadá jako problém s iconv. Zkus kdyžtak uplne poslední verzi Requirements Checkeru.
- karelk
- Člen | 2
David Grudl napsal(a):
Tak vypadá jako problém s iconv. Zkus kdyžtak uplne poslední verzi Requirements Checkeru.
Tak poslední verze RC už hlásí problém s iconv. PhpInfo hlásí:
iconv
iconv support enabled
iconv implementation unknown
iconv library version unknown
Directive Local Value Master Value
iconv.input_encoding ISO-8859-1 ISO-8859-1
iconv.internal_encoding ISO-8859-1 ISO-8859-1
iconv.output_encoding ISO-8859-1 ISO-8859-1
Stejne tak testovaci skript
<?php
echo iconv("ISO-8859-2","UTF-8","Pokusný text");
?>
provede konverzi správně.
Co se musí u iconv nastavit, aby fungoval „standardně“?
Díky
Editoval kravčo (18. 8. 2009 15:56)