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

Lokalizovaný dátum v cakePHP - 2. časť

V minulom článku som písal o lokalizovanom dátume. Dnes si ukážeme, ako môžeme zobrazovať lokalizovaný dátum veľmi zaujímavým slovným popisom.

Tento článok je pokračovaním článku Lokalizovaný dátum v cakePHP a preto je nevyhnutné si uvedený článok prečítať.

Cieľom tohto článku je ukázať, ako môžeme zobrazovať dátumy slovným spôsobom tak, ako to môžeme vidieť na tomto blogu.

1. krok – metóda pre zobrazenie dátumu

Do našej vytvorenej triedy DateHelper si pridáme nasledujúcu metódu

function timeAgoInWords($datetime_string, $format = DATE_FORMAT, $backwards = false)
{
        $datetime = $this->fromString($datetime_string);

        $in_seconds = $datetime;

        if ($backwards) {
                $diff = $in_seconds - time();
        } else {
                $diff = time() - $in_seconds;
        }

        $months = floor($diff / 2419200);
        $diff -= $months * 2419200;
        $weeks = floor($diff / 604800);
        $diff -= $weeks * 604800;
        $days = floor($diff / 86400);
        $diff -= $days * 86400;
        $hours = floor($diff / 3600);
        $diff -= $hours * 3600;
        $minutes = floor($diff / 60);
        $diff -= $minutes * 60;
        $seconds = $diff;

        if ($months > 0) {
                // over a month old, just show date (mm/dd/yyyy format)
                $relative_date = date($format, $in_seconds);
                $old = true;
        } else {
                $relative_date = '';
                $old = false;

                if ($weeks > 0) {
                        // weeks and days
                        $relative_date .= ($relative_date ? ', ' : '') . $weeks . ' ' . ($weeks > 1 ? __('DATE_WEEKS',true) : __('DATE_WEEK',true));
                        $relative_date .= $days > 0 ? ($relative_date ? ' '.__('DATE_SEPARATOR',true).' ' : '') . $days . ' ' . ($days > 1 ? __('DATE_DAYS',true) : __('DATE_DAY',true)) : '';
                } elseif ($days > 0) {
                        // days and hours
                        $relative_date .= ($relative_date ? ', ' : '') . $days . ' ' . ($days > 1 ? __('DATE_DAYS',true) : __('DATE_DAY',true));
                        $relative_date .= $hours > 0 ? ($relative_date ? ' '.__('DATE_SEPARATOR',true).' ' : '') . $hours . ' ' . ($hours > 1 ? __('DATE_HOURS',true) : __('DATE_HOUR',true)) : '';
                } elseif ($hours > 0) {
                        // hours and minutes
                        $relative_date .= ($relative_date ? ', ' : '') . $hours . ' ' . ($hours > 1 ? __('DATE_HOURS',true) : __('DATE_HOUR',true));
                        $relative_date .= $minutes > 0 ? ($relative_date ? ' '.__('DATE_SEPARATOR',true).' ' : '') . $minutes . ' ' . ($minutes > 1 ? __('DATE_MINUTES',true) : __('DATE_MINUTE',true)) : '';
                } elseif ($minutes > 0) {
                        // minutes only
                        $relative_date .= ($relative_date ? ', ' : '') . $minutes . ' ' . ($minutes > 1 ? __('DATE_MINUTES',true) : __('DATE_MINUTE',true));
                } else {
                        // seconds only
                        $relative_date .= ($relative_date ? ', ' : '') . $seconds . ' ' . ($seconds != 1 ? __('DATE_SECOND',true) : __('DATE_SECONDS',true));
                }
        }

        $ret = $relative_date;
        // show relative date and add proper verbiage
        if (!$backwards && !$old) {
                $ret = __('DATE_AGO',true) . ' ' . $ret;
        }
        return $this->output($ret);
}

2. krok – lokalizovaný popis dátumu

Ďalším krokom je umiestniť preklady popisov dátumu do nášho jazykového súboru app/locale/tvoj_ja­zyk/LC_MESSAGES/de­fault.po

msgid "DATE_TODAY"
msgstr "dnes"

msgid "DATE_YESTERDAY"
msgstr "včera"

msgid "DATE_WEEKS"
msgstr "týždňami"

msgid "DATE_WEEK"
msgstr "týždňom"

msgid "DATE_SEPARATOR"
msgstr "a"

msgid "DATE_DAYS"
msgstr "dňami"

msgid "DATE_DAY"
msgstr "dňom"

msgid "DATE_HOURS"
msgstr "hodinami"

msgid "DATE_HOUR"
msgstr "hodinou"

msgid "DATE_MINUTES"
msgstr "minútami"

msgid "DATE_MINUTE"
msgstr "minútou"

msgid "DATE_SECOND"
msgstr "sekundov"

msgid "DATE_SECONDS"
msgstr "sekundami"

msgid "DATE_AGO"
msgstr "pred"

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 -> timeAgoInWords($article["create"]);

Dúfam, že vám bol tento mini seriál aspoň trochu užitočný a dúfam, že sa v budúcnosti dočkáme natívnej podpory lokalizovaného dátumu priamo v CakePHP.

Rád uví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: 29%
Počet hodnotení: 41

zlýdobrý

Komentáre k článku

Nový komentár

  1. Titulok: Preddefinovane konstanty a plural forms
    Autor: Jitka aka poLK
    Vytvorený: 18. 10. 2007 08:57

    Jak uz jsem napsala, TimeHelper bude do vydani 1.2 stable prepracovan. Vase ukazka z nej vychazi (tudiz kopiruje vsechny jeho slabiny), takze dnes jen pro informaci:

    1. na zacatku souboru cake/basics.php jsou definovany konstanty, ktere je mozno pouzit namisto ‚hardcoded‘ poctu sekund v kalkulaci $diff
    2. vytvaret preklady pro jednotlive tvary podstatnych jmen (hodinami/hodinou atd) a zobrazovat je pomoci funkce __() je sice funkcni reseni, nicmene: mate-li ve vasich *.po souborech korektne nastaven parametr ‚Plural-Forms‘, spravna cesta vede pres vyuziti globalni funkce __n()