Řešení pro čísla s desetinným místem

romanm
Člen | 27
+
0
-

Ahoj, trochu teď po upgradu na novější MariaDB (10.3) řešíme striktní režim databáze. Nechceme ho vypínat, ale spíš opravit aplikaci aby nemohla prasit jako do teď :)

Konkrétně teď řeším ukládání čísel s desetinným místem.

Aktuální stav

function komponenta()
{
...
$form->addText('price', 'Cena')
	->addRule(Form::FLOAT, 'Zadejte číslo');
...
}

function zpravujForm($values)
{
...
	$db->insert($values)
...
}

Za předpokladu že uživatel nezadá žádnou hodnotu do tohoto inputu, tak vrácený obsah je '' → a samozřejmě prázdný string neprojde do databáze, kde sloupec je decimal.

Jak řešíte formuláře s desetinnými místy a ukládání jejich dat? Napadá mě prostě tyto inputy ošetřovat ve zpracování

function zpravujForm($values)
{
...
	$values['price'] = $values['price'] ?: null;
	$db->insert($values)
...
}

Předem díky za rady nebo nakopnutí správným směrem

galab
Backer | 74
+
+4
-
$form->addText('price', 'Cena')
	->addRule(Form::FLOAT, 'Zadejte číslo');
	->setNullable();

https://doc.nette.org/…rms/controls#…

romanm
Člen | 27
+
0
-

áááá díky. Já si říkal, že jsem v doc k tomu viděl. Má blbost

Matúš Matula
Člen | 257
+
0
-

A ako osetrujete tu cenu samotnu? ze to bude mat ozaj validny format ceny, napr. ze tam neda niekto 4 desatinne miesta a pod.?

m.brecher
Generous Backer | 774
+
0
-

@MatúšMatula

A ako osetrujete tu cenu samotnu? ze to bude mat ozaj validny format ceny, napr. ze tam neda niekto 4 desatinne miesta a pod.?

HTML formulářové prvky nepodporují uspokojivě číselné typy jako integer nebo float. Typicky požadujeme např. pro vstup čísel do faktury float na dvě desetinná místa. Nejlepší řešení je neumožnit uživateli vložit více jak dvě desetinná místa maskováním vstupu a automaticky konvertovat na dvě desetinná místa pokud vloží jedno desetinné místo nebo integer (doplnit příslušné nuly). HTML to neumí a řešit to Nette validací není nejlepší řešení. Ideálním řešením by byl speciální Nette formulářový prvek na bázi html + trochu javascriptu. Možná už něco takového existuje někde na GitHubu, předpokládám, že každý Nette vývojář musí občas takovýto problém řešit.

dms
Člen | 88
+
0
-

Na to je přeci v HTML přímo input https://developer.mozilla.org/…input/number a pokud chci desetiny tak dám step atribut např step=0.01 pro 2 desetinná místa

m.brecher
Generous Backer | 774
+
0
-

@dms

Jó uniklo mě v dokumentaci html, že lze nastavit input type=„number“ step=„0.01“, příklad je zde:

https://developer.mozilla.org/…input/number#…

jenže toto nastavení ovládá vkládací šipky a nezabrání vložení nesprávné hodnoty třeba 6.001, že je hodnota nesprávná se pozná, až při validaci, není to tedy ono maskování vstupu, které je myslím ideální a navíc šipky vkládající hodnotu jsou tak malé, že je reálné použití šipek problematické

dms
Člen | 88
+
0
-

ano, není to ideální, ale na většinu věcí to postačuje a je to bez přidaného javascriptu :)