Vlastní systém chybových zpráv

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tepster
Člen | 28
+
0
-

Zdravím,

Formuláře samotné nabízejí možnost validace – nastavím jim addRule() a už se mi zobrazuje chybová zpráva při špatném vyplnění. Ale já bych potřeboval, abych si tyto zprávy mohl více nastavovat – z hlediska designu třeba chci, aby měla každá jinou barvu apod. Jak na to? Jak co nejjednodušeji udělat, aby Formulář zprávy nepsal do Flash zpráv, ale někam jinam a já si mohl určit, kdy a jak se vypíší? Ideální by bylo, kdybych mohl u každé položky formuláře (v PHP) nastavit tu danou zprávu – mít třeba novou metodu setMessage(), díky které bych mohl nastavit barvu a jiné věci – je tohle možné udělat? Přidat metodu formulářovým prvkům?

Děkuji za rady

akadlec
Člen | 1326
+
+1
-

Tak barvičky a styly si můžeš ovlivnit přímo v renderu, záleží jak s formem pracuješ. Form chybové zprávy nezobrazuje jako flash ale jako vlastní, takže řešením je si ty zprávy z formu na konci vyzobnout a před tvému zpracování třeba pomocí flash. Já toto konkrétně taky řešil protože jsem chtěl mít veškeré hlášky na jednom místě a zobrazované jedním způsobem. Prvně jsem je cpal do nettich flash messages a vykresloval v komponentě, ale to mě nevyhovovalo kvůli modálů apod. tak jsem si na to udělal službu s extensions no a ve formulářích se to vyřešil tak že mám ve všech registrovanou událost onsubmit a tam si to přeliju:

	public function submit(Application\UI\Form $form)
	{
		// Form have some error messages
		if ($form->hasErrors()) {
			// Add form errors to flash messages
			foreach ($form->getErrors() as $error) {
				// ...add flash message to parent control
				$form->getParent()->flashMessage($error, "warning");
			}

			// Add flag that form is not ok
			$form->getPresenter()->payload->formOk = FALSE;

		// Form is without errors
		} else {
			// Add flag that form is ok
			$form->getPresenter()->payload->formOk = TRUE;
		}
	}

tim ty chybové hlášky z formuláře vyzobu a naliju je do flash zpráviček a mám to tak vše konzistentní.

Tepster
Člen | 28
+
0
-

ve formulářích se to vyřešil tak že mám ve všech registrovanou událost onsubmit

Jak se tohle dělá?

akadlec
Člen | 1326
+
+1
-

Jednoduše, jak definuješ události formuláře tak si tam přidáš submit akci jak jsem ji uvedl výše.


class HomepagePresenter extends UI\Presenter
{

    // ...

    protected function createComponentRegistrationForm()
    {
        $form = new UI\Form;
        $form->addText('name', 'Jméno:');
        $form->addPassword('password', 'Heslo:');
        $form->addSubmit('login', 'Registrovat');
        $form->onSuccess[] = array($this, 'registrationFormSucceeded');
        $form->onSubmit[] = array($this, 'submitForm');
        return $form;
    }

    // volá se po úspěšném odeslání formuláře
    public function registrationFormSucceeded(UI\Form $form, $values)
    {
        // ...
        $this->flashMessage('Byl jste úspěšně registrován.');
        $this->redirect('Homepage:');
    }

    public function submitForm(UI\Form $form)
    {
	    // Form have some error messages
	    if ($form->hasErrors()) {
    	    // Add form errors to flash messages
	        foreach ($form->getErrors() as $error) {
        	    // ...add flash message to parent control
    	        $form->getParent()->flashMessage($error, "warning");
	        }

        	// Add flag that form is not ok
    	    $form->getPresenter()->payload->formOk = FALSE;

	    // Form is without errors
	    } else {
        	// Add flag that form is ok
    	    $form->getPresenter()->payload->formOk = TRUE;
	    }
	}
}