zend_framework

Небольшой lifehack zendhack, по получению списка названий месяцев\дней для отображения в view.

Как нам всем известно русский язык очень сильно отличается от других языков, а самое главное он кардинально отличается от английского. В Zend_Framework, как и во многих других фреймворках локализация и функции локализации сделаны с оглядкой на английский язык. Иногда это становится причиной проблем.

Проблема

Я столкнулся со следующей, мне необходимо было вывести список названий месяцев в году, все бы хорошо, но в русском языке названия месяцев могут быть не только в именительном падеже, но и в родительном, в отличие от английского (February, Февраль -> Февраля). А Zend_Framework в результате следующего кода:

$datearray = array('year' => $date->toString("yyyy"), 'month' => '2');
$other_date = new Zend_Date($datearray);
$other_date->get(Zend_Date::MONTH_NAME);

выводит только месяц в родительном падеже.

Решение

Покопавшись в классе Date метода для вывода месяца в именительном падеже я не нашел. Тогда я полез в xml файл с переводом (Zend/Locale/Data/ru.xml) и там увидел, что раздел с месяцами в именительном падеже присутствует. Посмотрев как обычные методы Zend_Date получают информацию из файла с переводом, я нашел способ как можно вывести имя месяца.

Zend_Locale_Data::getContent("ru_RU", 'month', array('gregorian', 'stand-alone', 'wide', $i));

где $i – номер месяца без лидирующего нуля (1..12)
Кстати таким образом можно выводить любые данные из файла с переводом, просто идя по DOM структуре XML файла.

 
zend_framework

В любом нормальном проекте не избежать форматирования даты, чтобы не тратить время на реализацию своих методов и функций я хочу рассказать как быстро отформатировать дату средствами MySQL и Zend_Date.

Форматирование с помощью Zend_Date.

Для быстрого форматирования даты при выводе ее пользователю я предлагаю создать помощник вида.
Для этого создаем простой viewHelper (application/view/helpers), я назвал его DateHelper:

<?php
/**
 *
 * @author Roman
 * @version
 */
require_once 'Zend/View/Interface.php';
/**
 * DateHelper helper
 *
 * @uses viewHelper Zend_View_Helper
 */
class Zend_View_Helper_DateHelper
{
    /**
     * @var Zend_View_Interface
     */
    public $view;
    /**
     *
     */
    public function dateHelper($date_value, $format)
    {
        $locale = Zend_Registry::get('Zend_Locale');
        $date = new Zend_Date($date_value, false, $locale);
        return $date->toString($format);
    }
    /**
     * Sets the view field
     * @param $view Zend_View_Interface
     */
    public function setView (Zend_View_Interface $view)
    {
        $this->view = $view;
    }
}

Теперь мы можем использовать его в view скрипте следующим образом:

$unformated_data = "2011-01-30 12:21:11";
$this->dateHelper($unformated_data, "dd MMMM"); ?>

Дата будет отформатирована в “30 January“. Для того чтобы дата выводилась с учетом локали (языка) нужно в файле Bootstrap.php добавить метод:

protected function _initLocale()
{
    $locale = new Zend_Locale('ru_RU');
    Zend_Registry::set('Zend_Locale', $locale);
}

В данном случае наш помощник вида выведет “30 января“. Модификаторы даты можно посмотреть тут.

Форматирование средствами СУБД MySQL.

Если вы получаете дату из базы, то не стоит забывать о встроенном форматировании даты в MySQL и других СУБД.

DATE_FORMAT('2011-01-30 12:21:11', '%d %M') AS FIELD_1

Функция DATE_FORMAT вернет нам “30 January“, подробнее модификаторы можно посмотреть тут