AddFilter ve formuláři už není dostupný?

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

Koukám že ve verzi 2.2.7 neni možnost u prvku formuláře přidat addFilter. Teda je možnost ale je jako deprecated.

.
.
$form->addText('name', 'Jméno', NULL, 64)
->addFilter('strtolower');
.
.

Ani jsem si nevšiml od jaké verze to tam není a čím to nahradit.

Editoval webdata (26. 1. 2015 15:46)

jan.reges
Člen | 10
+
0
-

Taky jsem na to právě narazil a koukám, že to již v následující verzi 2.3.0 začne vyhazovat i E_USER_DEPRECATED (https://github.com/…5cedfe24485d)

Metodu addFilter() používáme poměrně často na místech, kde nechceme být na zadávání hodnot/formátu tak striktní (kvůli UX), ale do DB chceme uložit data v jednotném formátu (příkladem je např. možnost zadat cenu formátem „1.23“ i „1,23“, ukládat všechny e-mailové adresy lowercase, atd.)

Jde to samozřejmě řešit i na úrovni handleru a zpracování jednotlivých hodnot. Bylo ale fajn, že jsem již na úrovni deklarace prvků mohl nastavit, jak chci hodnoty naformátovat/doladit, když přešli validací.

David Grudl
Nette Core | 8282
+
+2
-

V podstatě stačí nahradit addFilter za addRule:

$form->addText('name', 'Jméno', NULL, 64)
	->addRule(function($control) {
		$control->setValue( strtolower($control->getValue()) );
		return TRUE;
	});

Výhodou je, že pak lze filtr zařadit kamkoliv, do větví atd. Složitější zápis se dá řešit pomocnou fcí:

class Helpers
{
	static function filter($callback)
	{
		return function($control) use ($callback) {
			$control->setValue( $callback($control->getValue()) );
			return TRUE;
		};
	}

a pak použít

$form->addText('name', 'Jméno', NULL, 64)
	->addRule(Helpers::filter('strtolower'));
Caine
Člen | 216
+
+1
-

Imho, to je ale hodne neintuitivni, podobne jako kdyz si chce clovek generovat latte ze stringu a ne ze souboru..

Tomáš Votruba
Moderator | 1114
+
0
-

Zneužití addRule ke změně hodnoty je opravdu velmi neintuitivní.

Metodu addFilter používáme stejně jako @jan.reges. Pro nezasvěcené programátory bude addRule u polí, kde může být zadáno cokoliv, zbytečně WTF.

jan.reges
Člen | 10
+
0
-

Davide, děkuji za hint.

Intuitivní to není a u metody na nastavování validace bych modifikace hodnoty něcekal a už vůbec ne, že můžu předávat 2 druhy callbacků – jeden pro vlastní validační pravidlo a druhý pro modifikaci hodnoty.

Praktické důvody ale chápu a budu to tak používat.

David Grudl
Nette Core | 8282
+
+6
-

Odstranil jsem deprecated message, s tím, že se to bude řešit při validaci. https://github.com/…127b4db38c9f

Tomáš Votruba
Moderator | 1114
+
0
-

@DavidGrudl Parádní, díky!

jan.reges
Člen | 10
+
0
-

@DavidGrudl Děkuji :-)) Vyřešil jsi to optimálně!

David Grudl
Nette Core | 8282
+
+4
-

Btw, teď to jde dávat i do podmínek https://github.com/…oadData.phpt#…