Lokalizovaný dátum v cakePHP
CakePHP má niekoľko skvelých funkcií pre dátum a čas, bohužiaľ, tieto funkcie nie sú lokalizované. My si dnes ukážeme, ako si s tým dokážeme ľahko poradiť.
1. krok – vytvoríme helper
V prvom kroku vytvoríme Helper s názvom DateHelper, ktorý umiestníme do súboru app/views/helpers/date.php a umiestníme do neho na začiatok nasledujúci kód
loadHelper('Time');
class DateHelper extends TimeHelper
{
function niceShort($date_string = null, $format = 'd. m. Y')
{
$date = ife($date_string, @$this->fromString($date_string), time());
if ($this->isToday($date))
{
$ret = __('DATE_TODAY',true)." " . date("H:i", $date);
}
elseif ($this->wasYesterday($date))
{
$ret = __('DATE_YESTERDAY',true)." " . date("H:i", $date);
}
else
{
$ret = date($format, $date);
}
return $this->output($ret);
}
}
?>
Aby som vysvetlil, prečo táto trieda nededí z AppHelper, ako to býva zvyčajne pri vytváraní vlastných helperov, ale dedí práve z triedy TimeHelper. Tentokrát chceme predefinovať už existujúcu metódu v triede TimeHelper a to konkrétne metódu niceShort(). Kedže táto metóda je definované práve v triede TimeHelper a využíva aj iné metódy z tejto triedy, musíme dediť práve z tejto triedy, aby naše nová metóda mohla využívať funkcionalitu z tejto triedy.
Zrejme to nebolo moc jednoduché vysvetlenie, ale všetko bude jasné z následujúcich kódov.
2. krok – lokalizácia
Ako som už spomínal, cakePHP disponuje metódami pre formátovanie dátumu a času, ale žiaľ tieto metódy nie sú lokalizované, takže ak by sme chceli slovne vypísať dnešný dátum ako dnes tak by sme dostali dátum Today. Preto si tieto lokalizované popisky času uložíme do nášho jazykového súboru.
Do súboru app/locale/tvoj_jazyk/LC_MESSAGES/default.po uložíme nasledujúci kód
msgid "DATE_TODAY"
msgstr "dnes"
msgid "DATE_YESTERDAY"
msgstr "včera"
3. krok – zobrazujeme lokalizovaný dátum
Posledný krok, aby sme mohli náš lokalizovaný dátum zobraziť je umiestniť nasledujúci kód do controlleru, ktorý bude používať náš helper. Pre náš príklad si to môžeme vložiť do súboru app/controllers/articles_controllers.php
var $helpers = array("Date");
Následne môžeme v našich view súboroch zobrazovať dátum napríklad takýmto spôsobom
echo $date -> niceShort($article["create"]);
V ďalšom článku si ukážeme, ako zobrazovať dátum a čas zaujímavým slovným spôsobom, ako to môžeme vidieť pri článkoch na tomto blogu.
Rád privítam vaše námety a pripomienky v diskusii k článku.
Súvisiace články
-
Kategórie
- Tipy a triky (28)
- Články (8)
- Fantom CMS (4)
- Zábava (2)
- Začíname s CakePHP (6)
-
Najčítanejšie články
-
Novinky
-
Seriál o CakePHP na www.debug.sk
15. 10. 2008
Od 7. októbra vychádza nový seriál o CakePHP na serveri zameranom na programovanie s názvom Debug.sk Autorom seriálu je autor tohto webu a kto by mal záujem, môžete daný seriál podporiť jeho prečítaním.
-
-
Nálepky
-
Nedávne komentáre
-
Rss kanály

Komentáre k článku
Nový komentár
Titulok: API a coding standards
Autor: Jitka aka poLK
Vytvorený: 16. 10. 2007 08:28
Ano, takto muze vypadat jedno z moznych reseni. Dobra zprava je, ze lokalizace tridy TimeHelper je na ceste (AFAIK). A jako obvykle, nemohu si odpustit par drobnych pripominek ke kodu ;)
1. Preferovany zpusob pro ‚natazeni‘ tridy helperu je pouzit globalni funkci z basics.php:
Pokud presto trvate na pouziti uses(), pak je bezpecnejsi pouzivat konstantu DS misto prosteho lomitka jako oddelovace adresaru:
2. Prestoze je ternalni operator stale (uz jen docasne) na nekolika mistech kodu CakePHP pouzit, neni to preferovany zpusob – viz https://trac.cakephp.org/…ingStandards#… Pokud chcete mit onen vyraz na jednom radku, pouzijte ife() z basics.php:
3. Pokud je konstanta DATE_FORMAT pouzita pouze v prototypu metody DateHelper::niceShort(), neni IMO nezbytna:
Titulok: Post Scriptum
Autor: Jitka aka poLK
Vytvorený: 16. 10. 2007 11:19
4. Doporucuji vyhnout se deklaraci pouziti helperu ve tride AppController v pripade, ze DateHelper (vyzadujici nacteni 2 souboru) nebude pouzit ve vsech kontrolerech aplikace.
Titulok: RE: API a coding standards
Autor: Tibor
Vytvorený: 16. 10. 2007 12:52
1. Opravene, helper sa nacitava pomocou preferovanej metody
2. Opravene. Konvencie cakePHP treba dodrziavat. Priznam sa, ze som este nemal cas prestudovat tuto kapitolu o cakePHP :-( Takze namiesto ternarneho operatora sa pouziva nasledujuci kod
3. Konstanta DATE_FORMAT nie je zbytocna v subore bootstrap.php, pretoze je podla mna vzdy lepsie konfigorovat celu aplikaciu na jednom mieste, ako to upravovat vo viacerych suboroch. A tym padom je tu aj moznost nastavovat dane hodnoty napr. pohodlne cez administracne rozhranie…
4. Opravene. Ako ukazku som teda pouzil app/controllers/articles_controllers.php. Kod predtym vyplyval z toho, ze v tomto blogu dany helper pouziva vacsina controllerov a v neposlednom rade sa snazym drzat pravidla DRY.
Titulok: Konstanty v CakePHP
Autor: Jitka aka poLK
Vytvorený: 16. 10. 2007 17:36
Ad 2) Dodrzenim vsech ustanoveni (‚{‘, ‚elseif‘ a ‚else‘ nikoli na novem radku) bude vas DateHelper o 9 radku kratsi ;)
Ad 3) Ale no tak – jak chcete v admin rozhrani nastavovat hodnotu konstanty definovane v bootstrap.php? Snad ne tak, ze bude ten soubor writeable pro webserver? ;) Jde mi o to, ze se nejedna o kod nezbytny pro funkcnost helperu ktery publikujete – a kvuli ctenarum vaseho blogu z rad CakePHP novacku by bylo IMHHO docela fer na to upozornit. A mimochodem – jiste jste si vsiml poslednich zmen v souboru app/config/core.php (changesets 5752 nebo 5768). Od pouzivani konstant se upousti a prechazi se na pouzivani singletonu Configure. A tim se razem dostavame nekam jinam – a jiste mi date z pravdu, ze komplikovat vas ukazkovy DateHelper (pouzitim Configure::read() a odkazem na nutnost modifikace bootstrap.php) je pro demonstraci vaseho reseni pro lokalizovane datumy celkem off topic.
Jen nazor – nic vic, samozrejme :)
Titulok: RE: Konstanty v CakePHP
Autor: Tibor
Vytvorený: 18. 10. 2007 00:13
Ad 2) Ano :-) ale myslim si, ze ukazka kodu je takto prehladnejsia a na prvy pohlad citelnejsia…
Ad 3) No napr. tak, ze by si to zvolili len jedenkrat pri instalacii a potom uz by samozrejme writable nebol… A uznavam, ze to tam pre jednoduchu ukazku skutocne netreba, takze som clanok upravil…
Dakujem za cenne pripomienky