->addFilter – může vracet NULL?

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

Ahoj, mám na inputu, do kterého pomocí bootstrap datepickeru vkládám datum, pověšený filtr, který mi po odeslání datum převede do objektu vhodného pro uložení do DB. Ale řeším, jestli lze ten filtr nějak přesvědčit, aby vracel NULL, pokdu je datum prázdné (hodnota není záměrně povinná).

Vypadá to nějak takto:

<?php
$objednavkaContainer->addText('datum_vyhotoveni', 'Datum vyhotovení')
		->setRequired(FALSE)
		->setAttribute('data-date', '1')
	    ->setAttribute("placeholder", "dd.mm.rrrr")
		->setAttribute('class', 'form-control')
		->addRule($form::PATTERN, "Datum musí být ve formátu dd.mm.rrrr", "(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d\d")
		->addFilter(function ($value) {	return trim($value) ? Nette\Utils\DateTime::from($value) : null; });
?>

Po odeslání formuláře se však i s tímto kódem hodnota datum_vyhotoveni nastaví na prázdný string, což pak zkolabuje při pokusu zapsat to do DB.

Invalid datetime format: 1292 Incorrect date value: '' for column ‚datum_vyhotoveni‘…

<?php
UPDATE `objednavka`
SET `stav`='O', `id_zakaznik`=1, `expres`=1, `datum_prijeti`='2016-11-13 00:00:00',
`datum_vyhotoveni`='', `zp_dopravy`='Česká pošta', `zp_platby`='dobírka', `poznamka_int`='',
`poznamka_ext`='', `eshop_cobj`='', `eshop_id`=''
WHERE (`id_objednavka` = '4')
?>

Lze to řešit nějak jinak, než mít v modelu ošetření?

<?php
if (trim($values['datum_vyhotoveni'])):
	$values['datum_vyhotoveni'] = Nette\Utils\DateTime::from($values['datum_vyhotoveni']);
else:
	$values['datum_vyhotoveni'] = null;
endif;
?>

Pokud ne, tak je ten filtr v tomto případě asi zbytečné na ten prvek věšet. Je imo jedno, kde se ta hodnota formátuje…

David Grudl
Nette Core | 8082
+
+7
-

V nejnovější verzi by mělo jít nastavit ->setNullable() a pak místo prázdného řetězce bude vracet NULL.

RadaR
Člen | 46
+
0
-

David Grudl napsal(a):

V nejnovější verzi by mělo jít nastavit ->setNullable() a pak místo prázdného řetězce bude vracet NULL.

Funguje jak víno. Díky moc Davide!