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.