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
+
0
-

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
+
+2
-

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#…

Tymikes
Člen | 63
+
0
-

Nojo, zase jsem je zapomněl vykreslit. -.-

akadlec
Člen | 1326
+
0
-

@DavidMatějka: „formularove errory se bezne nevykresluji pres flashMessage“
s tím bych si dovolil lehce nesouhlasit. Pokud se centralizuje zobrazování hlášek je to imho přehlednější. Výjimku bych dal pro chyby jednotlivých controlů které se vypíší přímo ve formu.