Po odoslaní formuláru sa stiahne súbor
- bodhy
- Člen | 4
Zdarvím.
Mám nasledovný problém s formulárom – užívateľ vyplní formulár a keď ho dá odoslať, priehliadač Google Chrome namiesto odoslania začne sťahovať súbor. Čiastočne pomáha vypnutie cachovania v prihliadači, ale nie vždy. Niektoré formuláre som vyriešil ukončením funkcie niecoFormSucceeded() php funkciou die(), čo ale nie je podľa mňa východisko. Na servery mám PHP7.0 a používam verziu Nette 2.4.
Problém so sťahovaním môže ešte spôsobovať použitý redirect na Presenter:default.
Ďakujem za rady.
- bodhy
- Člen | 4
action:
public function actionHelpTexts() {
$this->template->items = $this->database->table('doc_texts')->select('*')->where('id_user = ?', $this->id_user)->order('caption');
$this->template->helpTextsForm = $this->createComponentHelpTextsForm();
}
componentForm:
protected function createComponentHelpTextsForm() {
$form = new UI\Form($this, 'htextsForm');
$renderer = $form->getRenderer();
$renderer->wrappers['controls']['container'] = NULL;
$renderer->wrappers['pair']['container'] = 'div';
$renderer->wrappers['label']['container'] = NULL;
$renderer->wrappers['control']['container'] = NULL;
$form->getElementPrototype()->action = $this->link($this->template->p.':'.$this->template->m, array('lang' => $this->lng)).'?do=htextsForm-submit';
$form->getElementPrototype()->class = 'dialogForm';
$this->template->frm_return = '';
$form->addHidden('id_text');
$form->addText('caption', $this->translator->translate('Názov/popis textu'))
->setAttribute('class', 'mdl-textfield__input');
$form->addTextArea('content', $this->translator->translate('Text'))
->setAttribute('rows', '10')
->setAttribute('cols', '50')
->setAttribute('data-height', '275')
->setAttribute('class', 'mdl-textfield__input html-editor');
$form->addSubmit('submit', $this->translator->translate('Uložiť'));
$form->onSuccess[] = [$this, 'HelpTextsFormSucceeded'];
return $form;
}
Success:
public function HelpTextsFormSucceeded($form) {
$values = $form->getValues();
$values['id_user'] = $this->id_user;
try {
if ((int)$values['id_text'] <= 0) {
$ret = $this->database->table('doc_texts')->insert($values);
} else {
$ret = $this->database->table('doc_texts')->where('id_text = ? AND id_user = ?', $values['id_text'], $values['id_user'])->update($values);
}
if ($ret !== false) {
$this->flashMessage($this->translator->translate('Záznam bol úspešne uložený.'), 'success');
} else {
$this->flashMessage($this->translator->translate('Počas ukladania záznamu vznikol problem.'), 'danger');
}
$this->redirect('Setup:helpTexts', array('lang' => $this->template->lng));
} catch (\Exception $e) {
if ( $e->getMessage() != '' ) $this->flashMessage($this->translator->translate('Počas ukladania záznamu vznikol problem. (' . $e->getMessage() . ')'), 'danger');
}
}
- David Matějka
- Moderator | 6445
a to chytani vyjimky je velmi nestastne. nekolik tipu:
- nezobrazuj uzivateli text vyjimky. ten je urceny pro programatora. v lepsim pripade tomu uzivatel nebude rozumet, v horsim pripade tam uniknou treba nejake citlive udaje
- kdyz uz chybu chytas, tak ji nezapomen zalogovat – treba pomoci
Tracy\Debugger::log($e)
. jak to mas ted ty, tak sice uzivatel bude mit „hezkou“ hlasku, ale jako programator se nic o chybe nedozvis - jak uz zminil Milo, nechytej obecnou exception, ale tu, kterou ocekavas, ze muze nastat
- a nejdulezitejsi rada: proste se na to chytani chyb vykasli. stejne neodchytis vsechny mista, kde k tomu muze dojit. a kdyz se na to vykasles, nette chybu zachyti, zaloguje a ty zobrazis obecnou 500 stranku