Choď na navigáciu
Nálepky: CakePHP php

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/hel­pers/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_ja­zyk/LC_MESSAGES/de­fault.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/controller­s/articles_con­trollers.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.

Povedz o článku aj ostatným - www.pridej.cz

Hodnotenie článku: 30%
Počet hodnotení: 50

zlýdobrý

Komentáre k článku

Nový komentár

  1. 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:

    loadHelper('Time');

    Pokud presto trvate na pouziti uses(), pak je bezpecnejsi pouzivat konstantu DS misto prosteho lomitka jako oddelovace adresaru:

    uses('view' . DS . 'helpers' . DS . 'time');

    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:

    $date = ife($date_string, @$this->fromString($date_string), time());

    3. Pokud je konstanta DATE_FORMAT pouzita pouze v prototypu metody DateHelper::ni­ceShort(), neni IMO nezbytna:

    function niceShort($date_string = null, $format = 'd. m. Y')
  2. 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.

  3. Titulok: RE: API a coding standards
    Autor: Tibor
    Vytvorený: 16. 10. 2007 12:52

    1. Opravene, helper sa nacitava pomocou preferovanej metody

    loadHelper('Time');

    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

    $date = ife($date_string, @$this->fromString($date_string), time());

    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/controller­s/articles_con­trollers.php. Kod predtym vyplyval z toho, ze v tomto blogu dany helper pouziva vacsina controllerov a v neposlednom rade sa snazym drzat pravidla DRY.

  4. 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 :)

  5. 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