Как я могу указать, сколько уровней должна пройти функция timespan () в Codeigniter? - PullRequest
2 голосов
/ 10 апреля 2010

Я использую функцию Codeigniter «timespan ()», чтобы дать понятную человеку фразу того, сколько времени прошло с момента события: «5 дней, 3 часа, 12 минут, 1 секунда», но мне не нужно спуститься на минутный или второй уровень.

Есть ли способ отключить это?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2010

Краткий ответ: нет.

Метод timespan () не предоставляет никаких средств для настройки уровня детализации в выходных данных. CodeIgniter, тем не менее, позволяет довольно легко переопределить встроенные функции, чтобы они делали то, что вам нравится.

Возможно, есть более элегантное решение (см. Ниже), но вот что я придумал. Создайте файл с именем MY_date_helper.php в application / helpers и поместите в него следующую модификацию timespan ():

<?php
// Adds a third argument to timespan() that stops display of minutes/
// seconds in the final output
function timespan($seconds = 1, $time = '', $display_mins_secs = true)
{
    $CI =& get_instance();
    $CI->lang->load('date');

    if ( ! is_numeric($seconds))
    {
        $seconds = 1;
    }

    if ( ! is_numeric($time))
    {
        $time = time();
    }

    if ($time <= $seconds)
    {
        $seconds = 1;
    }
    else
    {
        $seconds = $time - $seconds;
    }

    $str = '';
    $years = floor($seconds / 31536000);

    if ($years > 0)
    {   
        $str .= $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')).', ';
    }   

    $seconds -= $years * 31536000;
    $months = floor($seconds / 2628000);

    if ($years > 0 OR $months > 0)
    {
        if ($months > 0)
        {   
            $str .= $months.' '.$CI->lang->line((($months   > 1) ? 'date_months' : 'date_month')).', ';
        }   

        $seconds -= $months * 2628000;
    }

    $weeks = floor($seconds / 604800);

    if ($years > 0 OR $months > 0 OR $weeks > 0)
    {
        if ($weeks > 0)
        {   
            $str .= $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')).', ';
        }

        $seconds -= $weeks * 604800;
    }           

    $days = floor($seconds / 86400);

    if ($months > 0 OR $weeks > 0 OR $days > 0)
    {
        if ($days > 0)
        {   
            $str .= $days.' '.$CI->lang->line((($days   > 1) ? 'date_days' : 'date_day')).', ';
        }

        $seconds -= $days * 86400;
    }

    $hours = floor($seconds / 3600);

    if ($days > 0 OR $hours > 0)
    {
        if ($hours > 0)
        {
            $str .= $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')).', ';
        }

        $seconds -= $hours * 3600;
    }

    // don't display minutes/seconds unless $display_mins_secs
    // == true
    if ($display_mins_secs)
    {
        $minutes = floor($seconds / 60);

        if ($days > 0 OR $hours > 0 OR $minutes > 0)
        {
            if ($minutes > 0)
            {   
                $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', ';
            }

            $seconds -= $minutes * 60;
        }

        if ($str == '')
        {
            $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', ';
        }
    }

    return substr(trim($str), 0, -1);
}

?>

CodeIgniter автоматически найдет этот файл и будет использовать вашу функцию timespan () вместо встроенной версии. В разделе «Расширение помощников» на этой странице предлагается немного больше информации о том, как это работает.

Чтобы воспользоваться «расширенной» функцией timespan (), просто передайте третий аргумент false, например:

$ variable = timespan ($ secs, $ time, false);

Возможно, есть более элегантное решение, возможно, с использованием нативного объекта DateTime в PHP (см. здесь ), но из вопроса я думаю, что приведенная выше модификация timespan () более точно соответствует вашим потребностям.

1 голос
/ 29 сентября 2013

Я знаю, что это старая ветка, но я только нашел ее и был почти решением для того, что я искал. Я просто хотел иметь ограничение по количеству. Я сделал небольшую модификацию в скрипте, где я делаю $ str как массив и добавляю каждый год, месяц, день и т. Д. Затем я прохожу массив до заданного предела. После этого я просто взрываю "," и возвращаю результат.

Может быть, кто-то еще может наслаждаться этим сценарием?

<?php
// Adds a third argument to timespan() that limits the text string at given level
function timespan($seconds = 1, $time = '', $limit=null)
{
    $CI =& get_instance();
    $CI->lang->load('date');

    if ( ! is_numeric($seconds))
    {
        $seconds = 1;
    }

    if ( ! is_numeric($time))
    {
        $time = time();
    }

    if ($time <= $seconds)
    {
        $seconds = 1;
    }
    else
    {
        $seconds = $time - $seconds;
    }

    $str = array();
    $years = floor($seconds / 31536000);

    if ($years > 0)
    {   
        $str[] = $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year'));
    }   

    $seconds -= $years * 31536000;
    $months = floor($seconds / 2628000);

    if ($years > 0 OR $months > 0)
    {
        if ($months > 0)
        {   
            $str[] = $months.' '.$CI->lang->line((($months   > 1) ? 'date_months' : 'date_month'));
        }   

        $seconds -= $months * 2628000;
    }

    $weeks = floor($seconds / 604800);

    if ($years > 0 OR $months > 0 OR $weeks > 0)
    {
        if ($weeks > 0)
        {   
            $str[] = $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week'));
        }

        $seconds -= $weeks * 604800;
    }           

    $days = floor($seconds / 86400);

    if ($months > 0 OR $weeks > 0 OR $days > 0)
    {
        if ($days > 0)
        {   
            $str[] = $days.' '.$CI->lang->line((($days   > 1) ? 'date_days' : 'date_day'));
        }

        $seconds -= $days * 86400;
    }

    $hours = floor($seconds / 3600);

    if ($days > 0 OR $hours > 0)
    {
        if ($hours > 0)
        {
            $str[] = $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour'));
        }

        $seconds -= $hours * 3600;
    }

    $minutes = floor($seconds / 60);

    if ($days > 0 OR $hours > 0 OR $minutes > 0)
    {
        if ($minutes > 0)
        {   
            $str[] = $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute'));
        }

        $seconds -= $minutes * 60;
    }

    if ($str == '')
    {
        $str[] = $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second'));
    }

    // Only show number of array elements depending on limit.
    if($limit)
    {
        $i = 0;
        foreach($str as $level)
        {
            if($i >= $limit)
                unset($str[$i]);
            $i++;
        }
    }

    $return = implode(', ', $str);

    return trim($return);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...