DateTimeControl – addRule s prazdnym stringom
- spown
- Člen | 5
Zdravim,
narazil som na jednen „problem“ s DateTimeControl.
Urobil som si vlastnu validaciu, ktoru pridavam cez addRule
ukazka ako to vyzera:
$form->addDate('dateTo', 'do')
->setRequired()
->addRule(
[DateValidators::class, 'validateIntervalEnd'],
'Datum "do" nemoze byt mensi ako "do"',
$postData['dateFrom'] ?? null
);
Problem nastava, ked tam poslem dateFrom ako prazdny string tj. mam $postData[‚dateFrom‘] = '';
Pri vykreslovani mi to potom pada na chybovej hlaske „Value must be DateTimeInterface|string|int|null, string given.“ ktora nedava z logiky uplne zmysel… cele to sposobuje nasledujuci riadok:
- m.brecher
- Generous Backer | 871
@spown
Aniž bych nějak do hloubky do problému vnikl zkusil bych vyměnit operátor ?? za ?:, aby prázdný řetězec převedl na null, myslím že to asi problém nevyřeší, ale budeš o krok dál.
$form->addDate('dateTo', 'do')
->setRequired()
->addRule(
[DateValidators::class, 'validateIntervalEnd'],
'Datum "do" nemoze byt mensi ako "do"',
$postData['dateFrom'] ?: null
);
- m.brecher
- Generous Backer | 871
@spown
Pokud nepomůže výměna operátoru ?? za ?:, navrhuji validátor přepracovat, nepředávat komplikovaně hodnotu $postData, ale předat odkaz na druhý datový input ‘dateFrom’, pro předání callable použij syntax PHP 8.1
přepracovaný validátor:
use DateTimeImmutable;
use Nette\Forms\Controls\DateTimeControl;
class Validator
{
public static function validateDateFromTo(DateTimeControl $inputDateTo, DateTimeImmutable $dateFrom): bool
{
$dateTo = $inputDateTo->getValue(); // získáš datum jako DateTimeImmutable
// $valid = ....... porovnáš dva DateTimeImmutable objekty - snadné
return $valid;
}
}
Použití ve formuláři:
$form->addDate('dateFrom', 'Datum od')
->setRequired('Datum od je povinné');
$form->addDate('dateTo', 'Datum do')
->setRequired('Datum do je povinné')
->addRule(
Validator::validateDateFromTo(...), // modení first class callable syntax PHP 8.1
'Datum "do" nemoze byt mensi ako datum "od"',
$form['dateFrom'], // předáme referenci na druhý input
);
Editoval m.brecher (2. 10. 19:53)