Form: Prázdné hodnoty

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

Při využívání Formů mi přijde dosti otravná práce z prázdnými hodnotami. Místo tohoto kódu:

$data['sequence'] = Tools::arrayGet($values, 'name', -1);

musím nyní psát:

if (array_key_exists('sequence', $values) && !empty($values['sequence'])) {
	$data['sequence'] = $values['sequence'];
}
else {
	$data['sequence'] = -1;
}

Kratším zápisem by bylo použití ternárního operátoru, ale to je na můj vkus přílis nepřehledné. Také by šlo vynechat kontrolování array_key_exists(), ale při práci s klíčema poli jsem poněkud skeptický, tak to raději uvádím.

Výše uvedená cesta detekce nepřítomnosti uživatelského vstupu mi přijde dosti nepříjemná. Je nějaký důvod, proč se prádné hodnoty nekonvertují na null automaticky? Případně nešlo by Formu (nebo FormControlům) nastavit pravidlo na nullování prázdných hodnot?

David Grudl
Nette Core | 8218
+
0
-

To nějak nepobírám. Zkus konkrétní příklad.

Patrik Votoček
Člen | 2221
+
0
-

Musel jsem si to 4× přečíst abych to pochopil a pořád jsem nejistý jestli jsem to pochopil správně. Takže jak jsem to pochopil já.

Jde ti o to aby když nastavíš setEmptyValue() ti getValue() vrátilo pokud je aktuální hodnota == $emptyValue NULL. Nevím jestly to dělá musel bych to otestovat a to teď nemůžu (po delší době jsem se vrhnul na reinstall NTB :-/). Pokud nedělá tak by stálo za to zvážit zda je to žádoucí. Nebo to řešit nějákou metodou která nastaví že to tak chceš.

Ale co jsem nepochopil je:

mancze napsal(a):

Při využívání Formů mi přijde dosti otravná práce z prázdnými hodnotami. Místo tohoto kódu:

$data['sequence'] = Tools::arrayGet($values, 'name', -1);

musím nyní psát:

if (array_key_exists('sequence', $values) && !empty($values['sequence'])) {
	$data['sequence'] = $values['sequence'];
}
else {
	$data['sequence'] = -1;
}

co ti brání napsat metodu arrayGet($arr, $key, $default)? Která by obsahovala kód níže?

mancze
Člen | 58
+
0
-

Jde o to, že když se odešle formulář, tak nevyplněné hodnoty inputů|text nejsou rovny NULL, ale prázdnému ''. To dělá neplechu, když hodnoty do databáze ukládám. Musím ručně procházet všechny prázdné hodnoty, které prázdné být mohou, a měnit je na NULLy.

Tools::arrayGet mi nepomůže, protože řeší případ nenastavených indexů, ne prázdných hodnot.

Nedokážu si představit případ, kdy chci do db skutečně uložit '' místo NULL. A pokud takový případ existuje, pak bych řekl, že je v menšině vůči ostatním případům :). Navíc arrayGet mi už na nastavení prázdného řetězce z NULLy pomůže, naopak nikoliv.

Nebo mi uniká nějaké triviální řešení? =)

kravčo
Člen | 721
+
0
-

V prípade, že používaš dibi, mohol by ti pomôcť modifikátor %sn, ktorý prázdny string do databázy ukladá ako NULL.

mancze
Člen | 58
+
0
-

kravco napsal(a):

V prípade, že používaš dibi, mohol by ti pomôcť modifikátor %sn, ktorý prázdny string do databázy ukladá ako NULL.

A když se jedná o numerické hodnoty?

Já rozumím, že existuje tuna funkčních řešení, která problém vyřeší. Ale proč bych se měl nad něčím takovým pozastavovat? Přece používám Nette framework! :-)

David Grudl
Nette Core | 8218
+
0
-
foreach ($values as & $val) if ($val === '') $val = NULL;
kravčo
Člen | 721
+
0
-

Môj pohľad na vec je taký, že pokiaľ mám vo formulári textové políčko, a zostane prázdne (alebo ho vyprázdnim) a formulár odošlem, dostanem z neho prázdny reťazec. Ako štandardné správanie to považujem za absolútne prirodzené.

Na funkcionalitu, ktorú potrebuješ poslúži napr. veľmi jednoduchá úprava TextInputu:

class CustomTextInput extends TextInput
{
    public function getValue()
    {
        if ($this->value === '') { // this covers set empty value
            return NULL;
        }

        return $this->value;
    }
}

function Form_prototype_addCustomText(...)
{
    // ...
}

Form::extensionMethod(...);

mancze napsal(a):

A když se jedná o numerické hodnoty?

Tu je otázka, ktorá numerická hodnota sa má na NULL preložiť. Niekomu sa môže hodiť 0, niekomu napr. −1.

Za momentálneho stavu je asi najschodnejšie riešenie napríklad niečo takéto:

$form = new Form;
$form->addCustomText('number', 'Number of smth:')
    ->setEmptyValue('-1');
// ...

Tento (možno trochu nepohodlný) spôsob by mohol odstrániť hybrid medzi validátorom a filtrom, ak sa o ňom ešte uvažuje… Možno o ňom na PS niečo padlo…

BigCharlie
Člen | 283
+
0
-
$form = new Form;
$form->addCustomText('number', 'Number of smth:')
    ->setEmptyValue('-1');
// ...

Tento (možno trochu nepohodlný) spôsob by mohol odstrániť hybrid medzi validátorom a filtrom, ak sa o ňom ešte uvažuje… Možno o ňom na PS niečo padlo…

Mně by spíš z hlediska definice formulářů připadalo logické takovéto řešení:

$form = new Form;
$form->addText('number', 'Number of smth:')
	->setDefaultValue(NULL);

Název metody setDefault napovídá, že je to defaultní hodnota. Očekával bych tedy, že pokud do pole nikdo nic nevyplní, měl bych dostat opět NULL. A pokud bych explicitně nenastavil žádnou defaultní hodnotu, byla by u textových polí (a textarey) rovna prázdnému řetězci.

Edit: Tímto samozřejmě nepopírám, že nyní je návrat prázdného řetězce standardní (tedy podle normy). Ale bylo by to pěkné.

Editoval BigCharlie (28. 10. 2009 14:55)