1

Тема: Кракозябры в дате

При выводе даты создания новости с названиями месяцев появляются кракозябры.

http://i65.fastpic.ru/big/2015/0330/e3/16862ed5a249b994887103235b87dce3.jpg



и каждый раз при новом обновлении движка приходится вручную добавлять пару строк в файл ...\core\smarty\plugins\modifier.date_format.php для того, чтобы дата на русском языке отображалась правильно.

http://i66.fastpic.ru/big/2015/0330/33/21bc40b742d25600c732b1140ff59433.jpg


Вот исходный modifier.date_format.php

<?php
/**
 * Smarty plugin
 *
 * @package Smarty
 * @subpackage PluginsModifier
 */

/**
 * Smarty date_format modifier plugin
 *
 * Type:     modifier<br>
 * Name:     date_format<br>
 * Purpose:  format datestamps via strftime<br>
 * Input:<br>
 *          - string: input date string
 *          - format: strftime format for output
 *          - default_date: default date if $string is empty
 *
 * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual)
 * @author Monte Ohrt <monte at ohrt dot com>
 * @param string $string       input date string
 * @param string $format       strftime format for output
 * @param string $default_date default date if $string is empty
 * @param string $formatter    either 'strftime' or 'auto'
 * @return string |void
 * @uses smarty_make_timestamp()
 */
function smarty_modifier_date_format($string, $format=null, $default_date='', $formatter='auto')
{
    if ($format === null) {
        $format = Smarty::$_DATE_FORMAT;
    }
    /**
    * Include the {@link shared.make_timestamp.php} plugin
    */
    require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
    if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') {
        $timestamp = smarty_make_timestamp($string);
    } elseif ($default_date != '') {
        $timestamp = smarty_make_timestamp($default_date);
    } else {
        return;
    }
    
    if ($formatter=='strftime'||($formatter=='auto'&&strpos($format,'%')!==false)) {
        if (DS == '\\') {
            $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
            $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
            if (strpos($format, '%e') !== false) {
                $_win_from[] = '%e';
                $_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
            }
            if (strpos($format, '%l') !== false) {
                $_win_from[] = '%l';
                $_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
            }
            $format = str_replace($_win_from, $_win_to, $format);
        }

        return strftime($format, $timestamp);
    } else {
        return date($format, $timestamp);
    }
}

А вот измененный с поддержкой названия месяцев по русски:

<?php
/**
 * Smarty plugin
 *
 * @package Smarty
 * @subpackage PluginsModifier
 */

/**
 * Smarty date_format modifier plugin
 *
 * Type:     modifier<br>
 * Name:     date_format<br>
 * Purpose:  format datestamps via strftime<br>
 * Input:<br>
 *          - string: input date string
 *          - format: strftime format for output
 *          - default_date: default date if $string is empty
 *
 * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual)
 * @author Monte Ohrt <monte at ohrt dot com>
 * @param string $string       input date string
 * @param string $format       strftime format for output
 * @param string $default_date default date if $string is empty
 * @param string $formatter    either 'strftime' or 'auto'
 * @return string |void
 * @uses smarty_make_timestamp()
 */
function smarty_modifier_date_format($string, $format=null, $default_date='', $formatter='auto')
{
    if ($format === null) {
        $format = Smarty::$_DATE_FORMAT;
    }
    /**
    * Include the {@link shared.make_timestamp.php} plugin
    */
    require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
    if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') {
        $timestamp = smarty_make_timestamp($string);
    } elseif ($default_date != '') {
        $timestamp = smarty_make_timestamp($default_date);
    } else {
        return;
    }

 if($formatter=='rus')
    {
        $months = array (
            1 => 'января',
            2 => 'февраля',
            3 => 'марта',
            4 => 'апреля',
            5 => 'мая',
            6 => 'июня',
            7 => 'июля',
            8 => 'августа',
            9 => 'сентября',
           10 => 'октября',
           11 => 'ноября',
           12 => 'декабря');
        
        $format = str_replace("%m",$months[(int)date('m',$timestamp)],$format);
        $formatter='auto';
    }
    
    if ($formatter=='strftime'||($formatter=='auto'&&strpos($format,'%')!==false)) {
        if (DS == '\\') {
            $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
            $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
            if (strpos($format, '%e') !== false) {
                $_win_from[] = '%e';
                $_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
            }
            if (strpos($format, '%l') !== false) {
                $_win_from[] = '%l';
                $_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
            }
            $format = str_replace($_win_from, $_win_to, $format);
        }

        return strftime($format, $timestamp);
    } else {
        return date($format, $timestamp);
    }
}

Можно внести изменения в исходный файл на постоянной основе?

2

Re: Кракозябры в дате

Насколько я понял вы внесли изменения в стандартный файл Smarty core/smarty/plugins/modifier.date_format.php,
чтобы добавить поддержку русских месяцев и формата вывода "23 ноября 2015".

Оригинал мы изменять не можем, для поддержки простого обновления дистрибутива Smarty внутри ReadyScript с официального сайта Smarty.

Но это и не нужно, потому что у нас уже есть плагин, нашего производства, который делает то, что вам нужно.
Он называется "dateformat" (без подчеркивания) располагается в папке /core/smarty/rsplugins/modifier.dateformat.php, он поддерживает весь набор стандартных инструкций обычного плагина date_format + дополнен конструкциями:

  • %k - отображает сколько времени назад произошло событие "сегодня","вчера", "N дней назад", если больше месяца, то пишет дату "23.02.2010".

  • %v - отображает месяц на русском языке "января", "февраля",....

  • @time - возвращает время в формате ЧЧ:ММ

  • @date - возвращает дату в формате ДД.ММ.ГГГ

  • @sec - возвращает кол-во секунд

  • %datetime - возвращает дату и время в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС

Как этим пользоваться?

{$date = '2014-01-20 10:30:00'}

//Нужно вывести дату в форме "20 января 2014"
{$date|dateformat:"%d %v %Y"}

//Нужно вывести дату в форме "[Сегодня|Вчера|5 дней назад|20.01.2014], в 10:30".
{$date|dateformat:"%k, в @time"}

Повысить оценку Понизить оценку

3

Re: Кракозябры в дате

Спасибо. Полезная информация.