Jak na Apache, aby nette-forms fungovalo?

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

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

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

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.

iqtq
Člen | 20
+
0
-

No mám pocit že se tu podobné věci řeší dost často (myšleno „nefungující“ formuláře). Mě se něco podobného stávalo když jsem formulář nedefinoval ve správném úseku. Každopádně z kódu by se dalo vyčíst víc.

David Grudl
Nette Core | 8218
+
0
-

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

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

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

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

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 ?

David Grudl
Nette Core | 8218
+
0
-

Jakou přesně to píše nebo generuje chybu?

neo.taa
Člen | 14
+
0
-

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

Spíš tam zkus vypsat $httpRequest->isMethod('post') a $httpRequest->getPost(). Můžeš zpřístupnit výpis phpinfo()? Třeba někam uploadnout.

neo.taa
Člen | 14
+
0
-

Tak volání $httpRequest->isMethod('post') vrací něco jako TRUE,

ale volání $httpRequest->getPost() zase zhavaruje bez jakékoli chybového hlášení.

No a co přesně z phpinfo() bych měl poslat ?

David Grudl
Nette Core | 8218
+
0
-

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

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

_Martin_
Generous Backer | 679
+
0
-

Asi by nebylo od věci více zpropagovat Requirements Checker.

neo.taa
Člen | 14
+
0
-

Díky, ale bylo to dílo, už to funguje.

Doinstaloval jsem si balíček php-iconv.xxxx-něco---.rpm a už ten příklad funguje, vypíše odesladé data z formuláře.

Super, jdu se v Nette vzdělávat dál.

neo.taa
Člen | 14
+
0
-

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

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

Trošku jsem framework upravil, aby v případě podobných fatálních chyb zařval vždy.

neo.taa
Člen | 14
+
0
-

ok díky za pomoc

Jan Tvrdík
Nette guru | 2595
+
0
-

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

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?

David Grudl
Nette Core | 8218
+
0
-

Super! Dal jsem odkaz na stránku download.

karelk
Člen | 2
+
0
-

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

Tak vypadá jako problém s iconv. Zkus kdyžtak uplne poslední verzi Requirements Checkeru.

karelk
Člen | 2
+
0
-

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)