Globální formátování datumů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
nanuqcz
Člen | 822
+
0
-

Ahoj,
představme si, že jsem právě dokončil webovou aplikaci. Zde se pracuje s různými entitami, které se ukládají do DB a každá z nich obsahuje položku „created“ a „last_modified“ (datum). Všechny datumy teď zobrazuju ve formátu ‚YYYY-MM-DD‘, protože tak se ukládají i do databáze.

Co když se ale najednou rozhodnu, že všechny datumy chci zobrazovat (v šablonách, ve formulářích) ve formátu ‚DD.MM.YYYY‘? V současné době to umím udělat jen takto:

{****** Zobrazení v šabloně ******}
// Starý kód
Vytvořeno: {$values->created}
Naposledy upraveno: {$values->last_modified}

// Nový kód
Vytvořeno: {$values->created|date:'d.m.Y'}
Naposledy upraveno: {$values->last_modified|date:'d.m.Y'}
/****** Plnění formuláře ******/
// Starý kód
$this['form']->setDefaults($values);

// Nový kód
$this['form']->setDefaults($values);
$this['form']['created']->setDefaultValue($values->created->format('d.m.Y'));
$this['form']['last_modified']->setDefaultValue($values->last_modified->format('d.m.Y'));
/****** Ukládání hodnot do DB ******/
// Starý kód
$values = $form->values;

// Nový kód
$values = $form->values;
$values->created = DateTime::from($values->created);  // MySQL nedokáže správně uložit datum 'DD.MM.YYYY'
$values->last_modified = DateTime::from($values->last_modified);

A toto musím udělat pro všechny entity, které pracují s nějakým datumem, zvlášť! Pro všechny jejich výpisy, ukládání do DB apod. Neexistuje v Nette nějaká elegantnější cesta? Představoval bych si něco takového:

/****** Nastavení ******/
Nette\DateTime::setDefaultFormat('d.m.Y');  // nastavení metody __toString() - pro zobrazení v šablonách a ve formulářích
Nette\Forms\Controls\DateTimeInput::setDefaultFormat('Y-m-d');  // takováto hodnota vyleze z $form->getValues()

/****** Použití ******/
// Formuláře
$form->addDateTime('created', 'Vytvořeno');

// Šablony
//(netřeba změny)

Díky za názory

enumag
Člen | 2118
+
0
-

Pokud jde o šablony tak tam by to automaticky být dle mého názoru nemělo, maximálně bych si napsal vlastní helper jako zkratku.

V případě formulářů by dle mého názoru DateTimeInput měl jako value dostávat i vracet objekt DateTime a mít nějakou metodu setFormat.

nanuqcz
Člen | 822
+
0
-

enumag napsal(a):

Pokud jde o šablony tak tam by to automaticky být dle mého názoru nemělo, maximálně bych si napsal vlastní helper jako zkratku.

Přemýšlel jsem nad tím, a spíš než nastavovat třídu DateTime (jak jsem chtěl původně) mi přijde lepší nastavovat latte helper date. V šabloně by pak šlo napsat jen

{$values->created|date}

a defaultní formát onoho date by se nastavil třeba v config.neon, nebo někde…
(nebo třeba v @layout.latte pomocí nějakého makra? {dateFormat 'm.d.Y'} by se mi docela líbilo)

Zbytek se mi líbí, co jsi napsal ohledně toho DateTimeInput :-)

Editoval nanuqcz (5. 11. 2013 20:13)

enumag
Člen | 2118
+
0
-

Jestli nakonfiguruješ helper date nebo napíšeš vlastní helper je celkem detail (vlastní helper je imho čistší). :-)

llook
Člen | 407
+
+1
-

Helper date si můžeš nakonfigurovat globálně pomocí Nette\Templating\Helpers::$dateFormat.