Input type date nezobrazuje hodnotu z databáze

scientific
Člen | 93
+
0
-

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.

nightfish
Člen | 472
+
0
-

@scientific Jak vypadá vygenerovaný HTML kód s předvyplněným datumem? Protože <input type="date" value="2017-06-01"> by mělo normálně fungovat.

mystik
Člen | 291
+
0
-

Jsk nastavujes tu hodnotu v php?

scientific
Člen | 93
+
0
-

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

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 | 472
+
+1
-

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

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

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 | 291
+
+1
-

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

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.

mystik
Člen | 291
+
+2
-

Pridavalo se to tam proto ze db vrstva date/datetime sloupce prevede na objekt DateTime. A ten se na string prevadi defaultne vcetne casu.

dms
Člen | 87
+
+1
-

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