AppForm POST/GET chyba?

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

Zdravím, jsem začátečník v Nette, ale narazil jsem na zajímavé chování, spíše špatné. A nebo to ještě neumím napsat lépe :-)

Mám presenter s AppFormen, nastavená metoda ,,post'' a i přesto se data posílají přes GET. Což by nemělo. Nevadilo by mi to, pokud by tam nebyla textarea, která obsahuje hodně textu a při ukládání zařve samotné HTTP

Request-URI Too Large

The requested URL's length exceeds the capacity limit for this server.

Kód v presenteru:

    protected function createComponentImportForm() {
        $form = new AppForm;
        //$form->setTranslator($this->translator);
        $form->setMethod('post');
        $form->addTextArea('import', 'XML', 80, 30)
                    ->addRule(AppForm::FILLED, 'Musíte zadat validní XML data.');
        $form->addProtection('Prosím vyplňte formulář znovu (vypršelů bezpečnostní token.');
        $form->addSubmit('save', 'Importovat data'); //->getControlPrototype()->class('default');
        $form->onSubmit[] = array($this, 'ImportFormSubmitted');
        return $form;
    }

renderování stránky s textareou a importem

    public function renderImport($formvalues) {
        $form = $this->getComponent('importForm');
        if (is_array($formvalues)) $form->setDefaults($formvalues);
    }

Děkuji za nápady na vyřešení

Verze: Nette Framework 0.9.1 (revision dc607f0 released on 2009–09–18)

Ondřej Mirtes
Člen | 1536
+
0
-

Vždyť přeci odesílání metodou POST je defaultní, tak jaktože se ti to rve do GETu?

Aha, jak plníš ty $formvalues v renderImport? :) Každopádně nastavení defaultních hodnot patří do továrničky anebo do action metody. Ten tvůj kód vlastně nedělá nic – jen znovuvyplní formulář odeslanými hodnotami, což je zbytečné. Čeho vlastně chceš dosáhnout?

Do adresy se ti odeslané hodnoty nějak dostanou, když pak na ně odkazuješ v render metodě (její parametr se odesílá v adrese, to jo). Ale tento parametr tam sktuečně nemá co dělat :)

HonzaMac
Člen | 40
+
0
-

LastHunter napsal(a):

Vždyť přeci odesílání metodou POST je defaultní, tak jaktože se ti to rve do GETu?

Ano, a to mě zaráží.

Aha, jak plníš ty $formvalues v renderImport? :) Každopádně nastavení defaultních hodnot patří do továrničky anebo do action metody. Ten tvůj kód vlastně nedělá nic – jen znovuvyplní formulář odeslanými hodnotami, což je zbytečné. Čeho vlastně chceš dosáhnout?

Chtěl bych dosáhnout toho, aby formuláři i po úspěšném odeslání zůstal předvyplněný. A i v případě špatného. Nahrávám XML data přes formulář a musím je ověřovat a provádět s něma operace. Proto když jsou špatné, chci, aby je nemusel psát znovu.

Do adresy se ti odeslané hodnoty nějak dostanou, když pak na ně odkazuješ v render metodě (její parametr se odesílá v adrese, to jo). Ale tento parametr tam sktuečně nemá co dělat :)

Dostanou se tam takto. Tohle jsem našel zde na fóru

    public function ImportFormSubmitted(AppForm $form) {
        if ($form['save']->isSubmittedBy()) {
            $val = $form->getValues();
            $xml = $val['import'];
            $xh = new XML();
            if (($ret = $xh->import($xml, 'users', 'id_user')) === 0) {
                $this->flashMessage('XML bylo naimportováno úspěšně.', 'success');
            } else {
                $this->flashMessage('XML je chybné, nebo se nepodařilo importovat data.', 'error');
                $this->flashMessage('Chyba: ' . $ret, 'info');
                //$this->flashMessage('Chyba: ' . print_r($ret,1), 'info');
            }
        }
        $this->redirect('import', array($form->getValues()));
    }

Už jsem přišel na problém s parametrem :-) ten redirect mluví za vše :-)
Ale tak mi poraďte, jak vyplnit ten formulář i po odeslání? Asi to dát do renderImport(), že? Ale co tam dát? Děkuji za pomoc, ale nedokázal jsem to tady najít. Navíc polovina dokumentace nefunguje, původní tutoriál zmizel :-(

HonzaMac
Člen | 40
+
0
-

LastHunter napsal(a):

Vždyť přeci odesílání metodou POST je defaultní, tak jaktože se ti to rve do GETu?

Ano, a to mě zaráží.

Aha, jak plníš ty $formvalues v renderImport? :) Každopádně nastavení defaultních hodnot patří do továrničky anebo do action metody. Ten tvůj kód vlastně nedělá nic – jen znovuvyplní formulář odeslanými hodnotami, což je zbytečné. Čeho vlastně chceš dosáhnout?

Chtěl bych dosáhnout toho, aby formuláři i po úspěšném odeslání zůstal předvyplněný. A i v případě špatného. Nahrávám XML data přes formulář a musím je ověřovat a provádět s něma operace. Proto když jsou špatné, chci, aby je nemusel psát znovu.

Do adresy se ti odeslané hodnoty nějak dostanou, když pak na ně odkazuješ v render metodě (její parametr se odesílá v adrese, to jo). Ale tento parametr tam sktuečně nemá co dělat :)

Dostanou se tam takto. Tohle jsem našel zde na fóru

    public function ImportFormSubmitted(AppForm $form) {
        if ($form['save']->isSubmittedBy()) {
            $val = $form->getValues();
            $xml = $val['import'];
            $xh = new XML();
            if (($ret = $xh->import($xml, 'users', 'id_user')) === 0) {
                $this->flashMessage('XML bylo naimportováno úspěšně.', 'success');
            } else {
                $this->flashMessage('XML je chybné, nebo se nepodařilo importovat data.', 'error');
                $this->flashMessage('Chyba: ' . $ret, 'info');
                //$this->flashMessage('Chyba: ' . print_r($ret,1), 'info');
            }
        }
        $this->redirect('import', array($form->getValues()));
    }

Už jsem přišel na problém s parametrem :-) ten redirect mluví za vše :-)
Ale tak mi poraďte, jak vyplnit ten formulář i po odeslání? Asi to dát do renderImport(), že? Ale co tam dát? Děkuji za pomoc, ale nedokázal jsem to tady najít. Navíc polovina dokumentace nefunguje, původní tutoriál zmizel :-(

redhead
Člen | 1313
+
0
-

Takhle ale AppForm už funguje v základu, psát teda nikam nic nemusíš.

Tvým úkolem je naplnit form default hodnotama, o validaci i o vyplnění špatně i dobře vyplněného formu (správnými hodnotami) se stará sám.

Zkus si to. Render metodu můžeš smazat (pokud tam máš jen ten kód co si uvedl). A mělo by to jít správně.

Ondřej Mirtes
Člen | 1536
+
0
-

Při špatném vyplnění tam ty hodnoty zůstávají. Případně, pokud chceš vyhodit chybu v závislosti na něčem v modelu, tak takto:

try {
	$this->model->process($form->values);
} catch (SomeModelException $e) {
	$form->addError($e->getMessage()));
}

Pokud je tam chceš mít i po správném odeslání, tak bych je asi ukládal do session či databáze…

A podle kódu obslužné metody vidím, že to do databáze i ukládáš, tak není problém si to odtamtud vytáhnout.