Input type date nezobrazuje hodnotu z databáze
- scientific
- Člen | 94
Ahoj, mám níže uvedený kód a přemýšlím, proč nejde dát datepicker i na editaci. Resp. jde tam dát tak, že změnim type=„text“ na type=„date“, ale potom se stane to, že se nepředvyplňuje pole již nastaveným datem v databázi. Že by to nebralo defaultní databázový formát DATETIME? Mohu to případně nějak přizpůsobit, aby ho to umělo detekovat správně?
{if $modelgallery_editing}
<div class="form_row">
<label>Datum narození</label>
<input n:name="narozeni" type="text" class="value" maxlength="10">
</div>
{/if}
Pole ukazuje „správně“, ale bez datapickeru hodnotu „2004–05–28“.
{if $modelgallery_editing}
<div class="form_row">
<label>Datum narození</label>
<input n:name="narozeni" type="date" class="value" maxlength="10">
</div>
{/if}
Pole ukazuje „špatně“, ale s datapickerem hodnotu „dd. mm. rrrr“, namísto aby to předvyplnilo „28. 4. 2004“, viz níže uvedený screenshot.
Tak ne screenshoty toto forum zřejmě neumí, jedině zřjmě URL, ale kdo na něj bude klikat. Tak Bez screenshotů no. Snad si to budete umět nějak představit.
Děkuji moc za radu.
- scientific
- Člen | 94
@nightfish: Ano, je to tak, když to tam zadám takto staticky tak to fugnuje, ale zadat nestaticky nevím jak vyplnit value=„co sem napsat, to bych musel asi tu hodnotu value teprve vytvořit protože "setrDefaults v případe type="date“ najednou nefunguje".
@mystik:
Níže uvedený kód je pouze ilustrační zejména zkrácený apod., ale měl by odrážet skutečný stav.
if (isset($this->template->gallery)) {
$gallery = $this->template->gallery;
$form->setDefaults(array(
'programgallery_id' => $gallery['id'],
'name' => $gallery['name'],
'narozeni' => $gallery['narozeni'],
....
'is_active' => $gallery['active'],
));
}
To by se mělo přes
$this->template->gallery =
$this->admin->getGallery($gallery_id);
tahat z následujícího:
public function getGallery($id)
{
$query = $this->database->query('
SELECT
gallery.id,
videos_gallery.videos_id AS video_id,
gallery.name,
DATE_FORMAT(gallery.narozeni, "%Y-%m-%d") AS narozeni,
...
gallery.active
FROM gallery
LEFT JOIN videos_gallery ON videos_gallery.gallery_id = gallery.id
WHERE gallery.id = ?
', intval($id))->fetch();
return $query;
}
Editoval scientific (12. 1. 2023 13:30)
- Ozzrel
- Generous Backer | 54
No schválně jsem kouknul jak to používám já a tohle normálně běhá:
$form->addText('birthday', 'Datum narození:')
->setHTMLType('date')
->setRequired(TRUE);
if (!is_null($row->birthday)) $form->setDefaults(['birthday' => $row->birthday->format('Y-m-d')]);
Normálně to vyvolá nativní datepicker podle platformy/browseru atp.
- nightfish
- Člen | 518
@scientific Na první pohled tam nic špatného nevidím. Takže si
dumpni pole, které ti leze do setDefaults()
, abys ověřil, že je
tam datum ve správném formátu. Pak si ještě ověř, že si výchozí
hodnotu na formulářovém prvku narozeni
nepřepisuješ někde
jinde (jiným voláním setDefaults()
na formuláři nebo
setDefaultValue()
na formulářovém prvku).
- m.brecher
- Generous Backer | 871
@scientific
Jestli máš v databázi datetime tak ten s html inputem date fungovat nebude. Potřebuješ převést datetime na formát ‚yyyy-mm-dd‘ – jak píše @Ozzrel , nic ostatního input date neumí zobrazit.
A pozor na to, že $values z nette formulářů vrací pro prvek date/datetime-local OBJEKT DateTime, který je TAKÉ potřeba ručně zformátovat na ‚yyyy-mm-dd‘ !!!
Pošli sem html kód formuláře ze stránky pro ten případ, kdy nezobrazuje datum, tam bude vidět jaké je opravdické values ;).
Editoval m.brecher (12. 1. 2023 13:53)
- mystik
- Člen | 312
Tipnul bych si, že ti tam možná nějak leze datetime včetně času což nefunguje pokud to je typ date. Dumpni co posíláš do setDefaults a koukni jak vypadá vygenerované HTML.
Btw v létě jsme dělal sadu date/time inputů v rámci https://github.com/…master/.docs#… můžeš to zkusit použít, pokud se ti to nechce řešit samotnému, nebo kouknout jak je to řešené.
- mystik
- Člen | 312
Co tak koukam na tvuj kod neni problem v tom, že ty sice v dotazu prevedes datatime z databaze na string, ale nechas tomu stejny nazev sloupce jak mel ten datetime? Je mozne, ze databazova vrstvsa je tim zmatena a prevede ti ten sloupec zase na datatime protoze ve strukture db ten sloupec ma takovy typ.
Zkus to prejmenovat na naroreniString jestli to nepomuze.
- scientific
- Člen | 94
Vrátil jsem tam type=„date“ a ono to funguje. V DB mám date nikoliv datetime, neboť time mě zrovna nezajímá. Ale stejně mi to tam někde přesto sázeno k tomu 00:00:00, pak jsem si zde na foru v jiném vlákně přečetl, že to funguje jen pokud je to ve formátu yyyy-mm-dd, tak jsem vyrobil to DATE_FORMAT(gallery.narozeni, „%Y-%m-%d“) AS narozeni.
To proč mi to nefungovalo bylo nejspíš díky špatnému promazávání CloudFlare cache.
Už to tedy funguje, děkuji všem.
- dms
- Člen | 94
@mystik tvoje datepickery jsou super a hodně easy to use. Jenom je škoda že tohle neumí nette už v základu (klidně v ještě více ořezané formě – jen validace na vstupu z requestu a processing DateTimeInterfacu zpět na výstup do správného formátu). Ještě chybí color picker a bude to komplet :)