AppForm POST/GET chyba?
- HonzaMac
- Člen | 40
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
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
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
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
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
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.