Form: Prázdné hodnoty
- mancze
- Člen | 58
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?
- Patrik Votoček
- Člen | 2221
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
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
NULL
y.
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
NULL
y pomůže, naopak nikoliv.
Nebo mi uniká nějaké triviální řešení? =)
- mancze
- Člen | 58
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! :-)
- kravčo
- Člen | 721
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
$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)