DateTimeControl – addRule s prazdnym stringom

spown
Člen | 5
+
0
-

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:

https://github.com/…eControl.php#L88

m.brecher
Generous Backer | 871
+
0
-

@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
+
0
-

@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)

spown
Člen | 5
+
+2
-

@mbrecher dakujem za rady, riesenie nejake mam, skor mi islo o textaciu chybovej hlasky v nette, ktora nedava zmysel

„Value must be DateTimeInterface|string|int|null, string given.“

Editoval spown (4. 10. 10:09)

David Grudl
Nette Core | 8227
+
0
-

@spown a máš návrh jak ji vylepšit?

nightfish
Člen | 518
+
+3
-

@DavidGrudl Vypůjčil bych si pseudotyp z PHPStanu a napsal hlášku jako „Value must be DateTimeInterface|non-empty-string|int|null, string given.“

Editoval nightfish (6. 10. 10:55)