Хак functions.php (время, отображаемое возле поста)

2.05K
.
# Jesk (03.12.2016 / 01:52)
Пример
(23 Окт 2016 в 10:04)
(Сегодня в 00:01)
(Вчера в 20:56)
(8 секунд назад)
(23 секунды назад)
Вечером посмотрю (если раньше никто не сделает)
.
JohnCMS

ДоХтор, Ок заранее спасибо)

.
# Jesk (03.12.2016 / 12:31)
ДоХтор, Ок заранее спасибо)
Это отдельная функция, вернее - пара функций, которые можно прикрутить к любому скрипту. Если тебе нужен именно метод functions::display_date() из Джона, то я запилю этот код в его тело.
code (+/-)
/**
8 секунд назад
23 секунды назад
Сегодня в 21:43
Вчера в 22:43
23 Окт 2016 в 10:04
*/

// 8 секунд назад
echo MyTime(time() - 8) .'<br />';

// 23 секунды назад
echo MyTime(time() - 23) .'<br />';

// Сегодня в 21:40
echo MyTime(time() - 3600) .'<br />';

// Вчера в 22:36
echo MyTime(time() - (3600 * 24)) .'<br />';

// 23 Окт 2016 в 10:04
$tm = mktime(8, 04, 00, 10, 23, 2016);
echo MyTime($tm) .'<br />';


function MyTime($times = null) {
    $time = time();
    $label = $time - $times;
    
    $shift = (core::$system_set['timeshift'] 
            + core::$user_set['timeshift']) * 3600;
    
    $w = 'секунд';
    $arrSec = [$w .'у', $w .'ы', $w];
    $w = 'минут';
    $arrMin = [$w .'у', $w .'ы', $w];
    $back = ' назад';
    
    if ($label == 0) {
        $timesp = 'Только что';
    } elseif ($label < 60) {
        $timesp = pl($label, $arrSec) . $back;
    } elseif ($label < 3600) {
        $timesp = pl(intval($label / 60), $arrMin) . $back;
    } else {
        $today = date('j M Y', $time + $shift);
        $yesterday = date('j M Y', strtotime('-1 day'));
        $timesp = date('j M Y в H:i', $times + $shift);
        $timesp = str_replace($today, 'Сегодня', $timesp);
        $timesp = str_replace($yesterday, 'Вчера', $timesp);
        $timesp = strtr(
            $timesp, 
            [
                'Jan' => 'Янв',
                'Feb' => 'Фев',
                'Mar' => 'Марта',
                'May' => 'Мая',
                'Apr' => 'Апр',
                'Jun' => 'Июня',
                'Jul' => 'Июля',
                'Aug' => 'Авг',
                'Sep' => 'Сент',
                'Oct' => 'Окт',
                'Nov' => 'Ноября',
                'Dec' => 'Дек'
            ]
        );
    }
    
    return $timesp;
}

function pl($int, $arr) {
    if ($int > 10 && $int < 15) {
        $out = ' '. $arr[2];
    } elseif (($int % 10) == 1) {
        $out = ' '. $arr[0];
    } elseif (($int % 10) > 1 && ($int % 10) < 5) {
        $out = ' '. $arr[1];
    } else {
        $out = ' '. $arr[2];
    }
    
    return $int . $out;
}
.
JohnCMS

ДоХтор, Мне именно на

functions::display_date()
нужно допилишь)
.
# Jesk (04.12.2016 / 00:34)
ДоХтор, Мне именно на functions::display_date() нужно допилишь)
Замени код метода functions::display_date() на этот вариант
functions::display_date() (+/-)
public static function display_date($times)
{
    $pl = function ($int, $arr) {
        if ($int > 10 && $int < 15) {
            $out = ' '. $arr[2];
        } elseif (($int % 10) == 1) {
            $out = ' '. $arr[0];
        } elseif (($int % 10) > 1 && ($int % 10) < 5) {
            $out = ' '. $arr[1];
        } else {
            $out = ' '. $arr[2];
        }
        
        return $int . $out;
    };
    
    $time = time();
    $label = $time - $times;
    
    $shift = (self::$system_set['timeshift'] 
            + self::$user_set['timeshift']) * 3600;
    
    $w = 'секунд';
    $arrSec = [$w .'у', $w .'ы', $w];
    $w = 'минут';
    $arrMin = [$w .'у', $w .'ы', $w];
    $back = ' назад';
    
    if ($label == 0) {
        $timesp = 'Только что';
    } elseif ($label < 60) {
        $timesp = $pl($label, $arrSec) . $back;
    } elseif ($label < 3600) {
        $timesp = $pl(intval($label / 60), $arrMin) . $back;
    } else {
        $today = date('j M Y', $time + $shift);
        $yesterday = date('j M Y', strtotime('-1 day'));
        $timesp = date('j M Y в H:i', $times + $shift);
        $timesp = str_replace($today, 'Сегодня', $timesp);
        $timesp = str_replace($yesterday, 'Вчера', $timesp);
        $timesp = strtr(
            $timesp, 
            [
                'Jan' => 'Янв',
                'Feb' => 'Фев',
                'Mar' => 'Марта',
                'May' => 'Мая',
                'Apr' => 'Апр',
                'Jun' => 'Июня',
                'Jul' => 'Июля',
                'Aug' => 'Авг',
                'Sep' => 'Сент',
                'Oct' => 'Окт',
                'Nov' => 'Ноября',
                'Dec' => 'Дек'
            ]
        );
    }
    
    return $timesp;
}
.
JohnCMS

ДоХтор, Ок спасибо

.
JohnCMS

ДоХтор, Работает)

.
Udesign

ДоХтор, у меня не работает этот код http://johncms.com/forum/index ... 12384
заменял на этот

public static function display_date($var)
    {
        $shift = (self::$system_set['timeshift'] + self::$user_set['timeshift']) * 3600;
        if (date('Y', $var) == date('Y', time())) {
            if (date('z', $var + $shift) == date('z', time() + $shift))
                return self::$lng['today'] . ', ' . date("H:i", $var + $shift);
            if (date('z', $var + $shift) == date('z', time() + $shift) - 1)
                return self::$lng['yesterday'] . ', ' . date("H:i", $var + $shift);
        }

        return date("d.m.Y / H:i", $var + $shift);
    }


вызов функцию
functions::display_date($row['time'])
.
(\/)____o_O____(\/)

Udesign, где вызывал? может там $res['time']

.
ДоХтор
# Udesign (04.12.2016 / 10:48)
ДоХтор, у меня не работает этот код http://johncms.com/forum/index ... 85120
заменял на этот

public static function display_date($var)
{
$shift = (self::$system_se
Скорее всего ты где-то допустил ошибку, т.к. я проверял код на локалке - проблем не было. Если хочешь, скинь свой файл с функциями (можно в лс, если не хочешь его распространения в паблике), я пропишу код и скину обратно.
Всего: 40