Předání form, erroru z továrničky
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Tymikes
- Člen | 63
Zdravim, mám form továrničku. Funguje, ale jediný problém je v předání form resp. erroru. Zatím to řeším tak, že prostě v presenteru zachytím error a vypíšu ho, ale pokud má více validačních chyb, tak můžu zobrazit jen jednu, kterou si napíšu v presenteru. Potřebuju proto nějakou způsobem předat ten form.
Je to tato část v prezenteru
$form->onError[] = function (/*Zde předat form z továrničky*/) {
$this->redirect('this');}
<?php
namespace App\Forms;
use Nette;
use Nette\Application\UI\Form;
use App\Model;
class CategoryForm extends \Nette\Object
{
private $kategoriekepozitar;
private $user;
public function __construct(Model\KategorieRepozitar $kategoriekepozitar, Nette\Security\User $user) {
$this->kategoriekepozitar = $kategoriekepozitar;
$this->user = $user;
}
public function create()
{
$form = new Form;
$form->getElementPrototype();
$form->addText('kategorie', 'Název Kategorie:')
->setRequired("Vyplňte prosím název")
->addRule(Form::MAX_LENGTH, 'Název kategori je příliš dlouhý', 15)
->addRule(Form::RANGE, 'Kategorie musí začínat písmenem a může obsahovat jen písmena, čísla a znaky "-", "_".', '/^[a-z][a-z0-9_-]+$/i');
$form->addSubmit('pridat', 'Přidat');
$form->onValidate[] = array($this, 'duplikaceKategorie');
$form->onSuccess[] = array($this, 'addCategory');
return $form;
}
public function duplikaceKategorie($form)
{
$kategorie = $form->getValues()->kategorie;
if ($this->kategoriekepozitar->getBy(array('nazev_kategorie' => $kategorie))) {
$form->addError('Kategorie existuje');
}
}
public function addCategory($form)
{
$kategorie = $form->getValues()->kategorie;
$this->kategoriekepozitar->insert(array('uzivatel_id' => $this->user->id, 'nazev_kategorie' => $kategorie));
}
}
V presenteru
protected function createComponentCategoryForm()
{
$form = $this->categoryForm->create();
$form->onSuccess[] = function (CategoryForm $form) {
$this->flashMessage('Kategorie byla přidána', 'alert-success');
$this->redirect('this');};
$form->onError[] = function (CategoryForm $form) {
$this->flashMessage('Kategorie již existuje', 'alert-warning');
$this->redirect('this');}
;
return $form;
}
Editoval Tymikes (23. 3. 2016 18:48)
- David Matějka
- Moderator | 6445
formularove errory se bezne nevykresluji pres flashMessage, navic redirect ti zpusobi smazani hodnot formulare.
pokud pouzivas automaticke renderovani, tak se errory zobrazi (muzes treba jejich vzhled upravit nastavenim rendereru). pri manualnim renderovani je musis vykreslit, viz treba https://doc.nette.org/cs/forms#…