Меню показать Меню скрыть
Современные
проекты
от ПаЛыЧа
Белокопытов Константин Белокопытов Константин
9 мес. назад

Работа с датой. Недостающий функционал.

Это продолжение статьи «Недостающий функционал или как расширить Joomla без хаков», скорее часть 2.

Что мы видим в Joomla «из коробки»? Правильно! Узконаправленность разработчиков.

Вот мы создали категории, добавили статьи, вывели все это красивенько на сайте. И решили показать дату создания. Если ваш сайт предназначен для зарубежной публики, то проблем не возникает: Febrary 06, 2017. Но мы же суровые российские программисты, еще суровее только в Челябинске ;) Включаем в Joomla русскоязычный перевод: 06 Февраль 2017. Ааааааа.... 

Ладно, понимаем, что разработчики Joomla «просто люди» и без напильника и молотка не обойтись.

Задача: сделать так, чтобы в блоге, статье и в модуле «Последние статьи» дата создания отображалась в приятном виде, т.е. 6 февраля 2017г.

Вспоминаем прошлую статью и создаем наш вспомогательный класс:

/**
 * @package    Joomla.Framework
 * @subpackage  DateHelper
 * @copyright  Copyright (C) 2016 - 2017.
 * @license    GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * See COPYRIGHT.php for copyright notices and details.
 */
// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();
/**
 * Class DateHelper
 *
 * @static
 * @package  Joomla.Framework
 * @subpackage  DateHelper
 * @since    1.5
 */
abstract class DateHelper
{
    /**
     * rdate
     *
     * @param $format
     * @param null $datetime
     * @param int $case
     * @param bool $upper
     * @return null|string
     */
    public static function rdate($format, $datetime = null, $case = 0, $upper = true)
    {
        $res = null;
        if ($datetime != '0000-00-00' && $datetime != '0000-00-00 00:00:00') {
            if ($datetime === null)
                $datetime = time();
            else {
                $datetime = strtotime($datetime);
            }
            static $loc =
                    'Январ,ь,я,е,ю,ём,е
                Феврал,ь,я,е,ю,ём,е
                Март, ,а,е,у,ом,е
                Апрел,ь,я,е,ю,ем,е
                Ма,й,я,е,ю,ем,е
                Июн,ь,я,е,ю,ем,е
                Июл,ь,я,е,ю,ем,е
                Август, ,а,е,у,ом,е
                Сентябр,ь,я,е,ю,ём,е
                Октябр,ь,я,е,ю,ём,е
                Ноябр,ь,я,е,ю,ём,е
                Декабр,ь,я,е,ю,ём,е';
            if (is_string($loc)) {
                $months = array_map('trim', explode("\n", $loc));
                $loc = array();
                foreach ($months as $monthLocale) {
                    $cases = explode(',', $monthLocale);
                    $base = array_shift($cases);
                    $cases = array_map('trim', $cases);
                    $loc[] = array(
                            'base' => $base,
                            'cases' => $cases,
                    );
                }
            }
            $m = (int)date('n', $datetime) - 1;
            $F = $loc[$m]['base'] . $loc[$m]['cases'][$case];
            $format = strtr($format, array(
                    'F' => $F,
                    'M' => substr($F, 0, 3),
            ));
            $res = ($upper ? date($format, $datetime) : mb_strtolower(date($format, $datetime), 'UTF-8'));
        }
        return $res;
    }
    /**
     * time_elapsed_string
     *
     * @param $datetime
     * @param bool $full
     * @return string
     */
    public static function time_elapsed_string($datetime, $full = false)
    {
        $now = new DateTime;
        $ago = new DateTime($datetime);
        $diff = $now->diff($ago);
        $diff->w = floor($diff->d / 7);
        $diff->d -= $diff->w * 7;
        $string = array(
                'y' => 'г.',
                'm' => 'мес.',
                'w' => 'нед.',
                'd' => 'д.',
                'h' => 'ч.',
                'i' => 'мин.',
                's' => 'сек.',
        );
        foreach ($string as $k => &$v) {
            if ($diff->$k) {
                $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? '' : '');
            } else {
                unset($string[$k]);
            }
        }
        if (!$full) $string = array_slice($string, 0, 1);
        return $string ? implode(', ', $string) . ' назад' : 'сейчас';
    }
}

В данный класс я добавил функцию из статьи «Относительная дата и время на PHP».

Размещаем файл по пути /libraries/palpalych/belkod/date/helper.php.

В шаблоне статьи вставляем строчку:

jimport('palpalych.belkod.date.helper');

В коде шаблона материала находим вывод даты создания (например $row->created) и меняем код на следующий:

<?php echo DateHelper::rdate('d F Yг.', $row->created, 1, false); ?>

Результат: 06 февраля 2017г.

Параметры функции rdate:

  • $format — формат даты;
  • $datetime — ваша дата из таблицы или из другого источника. По-умолчанию null, что подразумевает текущие дату и время;
  • $case — склонение названия месяца, по-умолчанию — 0;
  • $upper — первая буква месяца заглавная или нет, по-умолчанию — true (заглавная).

Добавить комментарий

Наверх