0 Пользователей и 1 Гость просматривают эту тему.
  • 9 Ответов
  • 1778 Просмотров
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Всем привет!

Решил я сделать отображение даты публикации в формате (как пример) 01:17 минут назад. Для этого, в переопределенном файле
Код
templates/my_template/html/layouts/joomla/content/info_block/publish_date.php
я прописал вот такой код:
Код
<span uk-icon="icon: calendar"></span>
<time datetime="<?php echo JHtml::_('date', $displayData['item']->publish_up, 'c'); ?>" itemprop="datePublished">
<?php
$time_ago        = strtotime($displayData['item']->publish_up);
$current_time    = time();
$time_difference = $current_time - $time_ago;
$seconds         = $time_difference;

$minutes = round($seconds / 60); // 60 secund
$hours   = round($seconds / 3600); //3600 secund w 60 minutah * 60 secund

if ($seconds <= 60){
echo JText::_('COM_CCK_JUST_NOW');
} else if ($minutes <= 60){
if ($minutes == 1){
echo JText::_('COM_CCK_JUST_NOW');
} else if ($minutes <= 4 || $minutes >= 22 && $minutes <= 24 || $minutes >= 32 && $minutes <= 34 || $minutes >= 42 && $minutes <= 44 || $minutes >= 52 && $minutes <= 54){
echo $minutes . " " . JText::_('COM_CCK_MINUTES'). " " . JText::_('COM_CCK_AGO');
} else if ($minutes >= 5 && $minutes <= 20 || $minutes >= 25 && $minutes <= 30 || $minutes >= 35 && $minutes <= 40 || $minutes >= 45 && $minutes <= 50 || $minutes >= 55 && $minutes <= 60){
echo $minutes . " " . JText::_('COM_CCK_MINUT'). " " . JText::_('COM_CCK_AGO');
} else if ($minutes == 21 || $minutes == 31 || $minutes == 41 || $minutes == 51){
echo $minutes . " " . JText::_('COM_CCK_MINUTE'). " " . JText::_('COM_CCK_AGO');
}
} else if ($hours <= 24){
if ($hours <= 9) {
echo "0" . $hours . ":" . $minutes . " " . JText::_('COM_CCK_AGO');
}
else {
echo $hours . ":" . $minutes . " " . JText::_('COM_CCK_AGO');
}
} else {
echo "<span>" . JHtml::_('date', $displayData['item']->publish_up, JText::_('DATE_FORMAT_LC2')). "</span>";
}
?>
</time>
в итоге, если статья была опубликована менее 60-ти минут, то отображается все отлично! Например: 31 минута назад или 50 минут назад...

Теперь я хочу сделать так, что если статья опубликована более часа назад, то отображалось время в таком формате: ##:## минут назад (т. е. 01:17 минут назад)... Но что-то у меня не получается с вот этим кодом:
Код
} else if ($hours <= 24){
if ($hours <= 9) {
echo "0" . $hours . ":" . $minutes . " " . JText::_('COM_CCK_AGO');
}
else {
echo $hours . ":" . $minutes . " " . JText::_('COM_CCK_AGO');
}
т. е. часы выводит - все ОК! А вот с минутами - беда... Я понимаю что у меня минуты в UNIX формате и мне нужно их преобразовать как-то в человеческий вид... Но вот как это сделать - не пойму...

Помогите пожалуйста!

Заранее благодарю за ответы!
*

NewUsers

  • Живу я здесь
  • 2307
  • 215 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Код: php
$publish_up = new DateTime($this->item->publish_up);
$datetime = $publish_up->diff(new DateTime('now'));

if($datetime->format('%H') > 0)
{
echo $datetime->format('%H:%I').' backwards<br>';
}
else
{
echo $datetime->format('%I').' minutes backwards<br>';
}
Занимаюсь создание расширений для Joomla 3.10.x и 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Работа с DOM деревом на PHP
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
NewUsers, сорри, не совсем понял этот код...
*

NewUsers

  • Живу я здесь
  • 2307
  • 215 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
NewUsers, сорри, не совсем понял этот код...
Ну а если так http://php.net/manual/ru/datetime.diff.php
Занимаюсь создание расширений для Joomla 3.10.x и 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Работа с DOM деревом на PHP
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Ну а если так http://php.net/manual/ru/datetime.diff.php
Честно сказать - с очень большим трудом...

Т. е. Вы предлагаете мне просто вернуть значение разницы между датами в формате часы : минуты : секунды... Если я правильно конечно понял...

Но мне нужно получить отдельно часы и отдельно минуты, т. е. к сожалению, в русском языке, час имеет 3-и склонения (час, часА и часОВ) и для верного отображения этих слов, мне нужно будет использовать условие (как у меня реализовано с минутами выше в коде)...

Я просто не пойму, как приведенный Вами код использовать для этой задачи...
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Ну поищи склонения, чего велосипед изобретать, думаешь первый решаешь эту задачу? Запрос Google "php pluralize russian github"
https://gist.github.com/atma/973925
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Ок. По-другому поставлю вопрос:
почему в этом участке кода:
Код
if ($minutes == 1){
echo JText::_('COM_CCK_JUST_NOW');
} else if ($minutes <= 4 || $minutes >= 22 && $minutes <= 24 || $minutes >= 32 && $minutes <= 34 || $minutes >= 42 && $minutes <= 44 || $minutes >= 52 && $minutes <= 54){
echo $minutes . " " . JText::_('COM_CCK_MINUTES'). " " . JText::_('COM_CCK_AGO');
} else if ($minutes >= 5 && $minutes <= 20 || $minutes >= 25 && $minutes <= 30 || $minutes >= 35 && $minutes <= 40 || $minutes >= 45 && $minutes <= 50 || $minutes >= 55 && $minutes <= 60){
echo $minutes . " " . JText::_('COM_CCK_MINUT'). " " . JText::_('COM_CCK_AGO');
} else if ($minutes == 21 || $minutes == 31 || $minutes == 41 || $minutes == 51){
echo $minutes . " " . JText::_('COM_CCK_MINUTE'). " " . JText::_('COM_CCK_AGO');
}
минуты отображаются как положено (например: 17, 28, 54), а во втором участке:
Код
} else if ($hours <= 24){
if ($hours <= 9) {
echo "0" . $hours . ":" . $minutes . " " . JText::_('COM_CCK_AGO');
}
else {
echo $hours . ":" . $minutes . " " . JText::_('COM_CCK_AGO');
}
отображаются как 1037... Я так понимаю, цифра 1037 - это UNIX формат...? Как мне эти 1037 привести в нормальный вид?

Пробую вот так:
Цитировать
date("i", $minutes)
получаю 01 и все... Время идет, а 01 - остается...
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Немного пободавшись с кодом, написал вот такой код:

Код
<?php defined('JPATH_BASE') or die;
$date_now = new DateTime('now');
$publish_up_date = new DateTime($displayData['item']->publish_up);

$diff_date = date_diff($date_now, $publish_up_date);

$print_min = $diff_date->format('%i');
$print_hours = $diff_date->format('%H');

$jtext_minut = JText::_('COM_CCK_MINUT'). " " . JText::_('COM_CCK_AGO');
$jtext_minute = JText::_('COM_CCK_MINUTE'). " " . JText::_('COM_CCK_AGO');

$jtext_hour = JText::_('COM_CCK_HOUR');
$jtext_hours = JText::_('COM_CCK_HOURS');
$jtext_hour = JText::_('COM_CCK_HOUR');
?>

<span uk-icon="icon: calendar"></span>
<time datetime="<?php echo JHtml::_('date', $displayData['item']->publish_up, 'c'); ?>" itemprop="datePublished">
<?php
$publish_time_ago = strtotime($displayData['item']->publish_up);
$current_time = time();
$time_difference = $current_time - $publish_time_ago;

$seconds = $time_difference;
$minutes = round($seconds / 60); // 60 secund
$hours = round($seconds / 3600); //3600 secund w 60 minutah * 60 secund
$days = round($seconds / 86400); //86400 = 24 * 60 * 60;

$minutes_interval = $minutes >= 2 && $minutes <= 4 || $minutes >= 22 && $minutes <= 24 || $minutes >= 32 && $minutes <= 34 || $minutes >= 42 && $minutes <= 44 || $minutes >= 52 && $minutes <= 54;
$minut_interval = $minutes == 0 || $minutes >= 5 && $minutes <= 20 || $minutes >= 25 && $minutes <= 30 || $minutes >= 35 && $minutes <= 40 || $minutes >= 45 && $minutes <= 50 || $minutes >= 55 && $minutes <= 60;
$minute_interval = $minutes == 1 | $minutes == 21 || $minutes == 31 || $minutes == 41 || $minutes == 51;

$jminutes = $print_min >= 2 && $print_min <= 4 || $print_min >= 22 && $print_min <= 24 || $print_min >= 32 && $print_min <= 34 || $print_min >= 42 && $print_min <= 44 || $print_min >= 52 && $print_min <= 54;
$jminut = $print_min == 0 || $print_min >= 5 && $print_min <= 20 || $print_min >= 25 && $print_min <= 30 || $print_min >= 35 && $print_min <= 40 || $print_min >= 45 && $print_min <= 50 || $print_min >= 55 && $print_min <= 60;
$jminute = $print_min == 1 || $print_min == 21 || $print_min == 31 || $print_min == 41 || $print_min == 51;

if ($seconds <= 60){
echo "<span>". JText::_('COM_CCK_JUST_NOW'). "</span>";
} else if ($minutes <= 60){
if ($minutes == 1){
echo "<span>". JText::_('COM_CCK_JUST_NOW'). "</span>";
} else if ($minutes_interval){
echo "<span>". $minutes . " " . $jtext_minutes . "</span>";
} else if ($minut_interval){
echo "<span>". $minutes . " " . $jtext_minut . "</span>";
} else if ($minute_interval){
echo "<span>". $minutes . " " . $jtext_minute . "</span>";
}
} else if ($hours <= 3){
if ($hours == 1 && $jminutes) {
echo "<span>". $hours . " " . $jtext_hour . " " . $print_min . " " . $jtext_minutes . "</span>";
} else if ($hours == 1 && $jminut){
echo "<span>". $hours . " " . $jtext_hour . " " . $print_min . " " .  $jtext_minut . "</span>";
} else if ($hours == 1 && $jminute){
echo "<span>". $hours . " " . $jtext_hour . " " . $print_min . " " .  $jtext_minute . "</span>";
} else if ($hours < 3 && $jminutes){
echo "<span>". $hours . " " . $jtext_hours . " " . $print_min . " " . $jtext_minutes . "</span>";
} else if ($hours < 3 && $jminut){
echo "<span>". $hours . " " . $jtext_hours . " " . $print_min  . " " .  $jtext_minut . "</span>";
} else if ($hours < 3 && $jminute){
echo "<span>". $hours . " " . $jtext_hours . " " . $print_min  . " " .  $jtext_minute . "</span>";
}
} else if ($days <= 2){
    if ($days == 1){
    echo "<span>". JText::_('COM_CCK_TODAY_AT'). " " . JHtml::_('date', $displayData['item']->publish_up, JText::_('DATE_FORMAT_LC12')). "</span>";
            } else if ($days == 2) {
    echo "<span>" . JText::_('COM_CCK_YESTERDAY_IN'). " " . JHtml::_('date', $displayData['item']->publish_up, JText::_('DATE_FORMAT_LC12')). "</span>";
    }
} else {
echo "<span>" . JHtml::_('date', $displayData['item']->publish_up, JText::_('DATE_FORMAT_LC2')). "</span>";
}
?>
</time>
все работает кроме вот этой части кода:
Код
} else if ($days <= 2){
    if ($days == 1){
    echo "<span>". JText::_('COM_CCK_TODAY_AT'). " " . JHtml::_('date', $displayData['item']->publish_up, JText::_('DATE_FORMAT_LC12')). "</span>";
            } else if ($days == 2) {
    echo "<span>" . JText::_('COM_CCK_YESTERDAY_IN'). " " . JHtml::_('date', $displayData['item']->publish_up, JText::_('DATE_FORMAT_LC12')). "</span>";
    }
} else {
echo "<span>" . JHtml::_('date', $displayData['item']->publish_up, JText::_('DATE_FORMAT_LC2')). "</span>";
}
Если сделать
Код
var_dump($days);
то на выходе получаю (в зависимости от даты публикации статьи):
Код
float(1) или float(314) или float(1247)
т. е., просчет разницы дней от даты публикации до сегодняшней секунды - идет, но вот вывод... Вывод отображается как "сегодня 23:14"... Хотя статья была размещена 16-01-2019 23:14:00 (а сейчас 17-01-2019 19:53:00). Если изменить дату публикации на 15-01-2019 23:14:00, то на сайте отображается как "вчера в 23:14"

Почему не работает - не пойму... В чем моя ошибка?

P. S.
    Да! Я понимаю что это не самое элегантное решение, и этот код можно смело назвать ***кодом... Поэтому, буду благодарен, если кто-то поможет мне сделать этот код более элегантным!
« Последнее редактирование: 17.01.2019, 20:56:22 от Dgikar »
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Joomla не установлена. Ставить влом. Поэтому просто php 5.4+
Код
$date_publish = '2019-01-17 23:04:23';
$start_time = new \DateTime($date_publish);
$end_time = new \DateTime();
$date_interval = $start_time->diff($end_time);

$data = [];
foreach ($date_interval as $key=>$val){
    if($val){
        switch ($key){
            case 'y':
                $data[$key] = $val.' '.plural_form($val, ['год', 'года', 'лет']);
                break;
            case 'm':
                $data[$key] = $val.' '.plural_form($val, ['месяц', 'месяца', 'месяцев']);
                break;
            case 'd':
                $data[$key] = $val.' '.plural_form($val, ['день', 'дня', 'дней']);
                break;
            case 'h':
                $data[$key] = $val.' '.plural_form($val, ['час', 'часа', 'часов']);
                break;
            case 'i':
                $data[$key] = $val.' '.plural_form($val, ['минута', 'минуты', 'минут']);
                break;
            case 's':
                $data[$key] = $val.' '.plural_form($val, ['секунда', 'секунды', 'секунд']);
                break;
        }
    }
}

function plural_form($n, $forms)
{
    $n = abs($n) % 100;
    $n1 = $n % 10;
    if ($n > 10 AND $n < 20) return $forms[2];
    if ($n1 > 1 AND $n1 < 5) return $forms[1];
    if ($n1 == 1) return $forms[0];
    return $forms[2];
}

$str = join(', ',$data);
echo "Прошло {$str}";
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Все, вопрос - закрыт! Всего лишь за 5-ть суток...

А всего лишь нужно было заюзать
Код
JHtml::_
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как программно получить весь документ страницы?

Автор ut4utc

Ответов: 13
Просмотров: 1144
Последний ответ 10.09.2019, 19:07:14
от icom
Как сделать в 1 строку - Категорию, Родительскую категорию, дату?

Автор regnik

Ответов: 17
Просмотров: 1143
Последний ответ 09.01.2018, 22:16:59
от regnik
Как получить параметры стиля шаблона?

Автор Spam

Ответов: 9
Просмотров: 4293
Последний ответ 07.07.2017, 12:30:06
от tomclancys
Helix3 как отключить дату и категории в SP Simple Portfolio?

Автор muria

Ответов: 2
Просмотров: 2411
Последний ответ 16.03.2017, 18:48:11
от muria
Дата публикации шаблона от YooTheme

Автор DimaBalzhik

Ответов: 1
Просмотров: 965
Последний ответ 16.03.2016, 16:32:15
от AlekVolsk