Используйте формат даты Timeago менее 24 часов назад

8

Я хотел бы использовать модуль Timeago в качестве формата даты. Однако, когда время назад превысило 24 часа, я хотел бы показать другой формат (например, 4 февраля 2013 г.), очень похожий на использование Twitter или Dribbble.

Я пытался настроить код, но мои навыки подводили меня: /

Возможно, есть лучший модуль для этой цели? Или я должен сделать свой собственный?

Я нашел этот код, который показывает, как я хочу, чтобы он работал, однако я понятия не имею, как реализовать это в Drupal.

Любая помощь приветствуется, спасибо.

Alex
источник
Это было бы отличным запросом для модуля Timeago, если он еще не был запрошен.
Бэт
@beth Я только что просмотрел проблемы для модуля, и он, похоже, не был запрошен. Я создам проблему завтра (времени для нее сегодня нет), если вы не захотите это сделать :)
Alex
Какие изменения вы пытались сделать с кодом? Где эта дата появляется на вашем сайте?
Бэт
@beth Я пытался заставить код в файле jquery.timeago.js работать, только если переменная секунд была меньше 86400 (24 ч). Тем не менее, я должен сделать так, чтобы весь модуль не работал, иначе он не будет показывать другие форматы, потому что он все еще переопределяет их.
Алекс
Я создал проблему, которую можно найти здесь
Alex

Ответы:

1

Действительно ли пользователи сидят на странице достаточно долго, что эти даты нужно обновлять с помощью javascript? Большинство из них нажмут на что-нибудь и в конечном итоге перезагрузят всю страницу. Так что, возможно, решение php тоже вариант?

Вы можете достичь решения php, используя модуль Custom Formatters .

Если вы создаете новый пользовательский форматер php-типа со следующим кодом (убедитесь, что это тип datetamp):

$element = array();
foreach ($variables['#items'] as $delta => $item) {
  $unixstamp = $item['value'];
  $time_since = mktime() - $unixstamp;
  if ($time_since < 86400) {
    $date_str = format_interval($time_since);
  }
  else {
    $date_str = format_date($unixstamp, 'custom', 'jS F Y');
  }

  $element[$delta] = array(
    '#type' => 'markup',
    '#markup' => $date_str,
  );
}
return $element;

При создании форматера убедитесь, что вы выбрали тип поля 'datetamp'. После создания средства форматирования на вкладке управления отображением вашего типа содержимого установите поле для использования этого средства форматирования.

Если ваша дата не хранится в отдельном поле, вы можете применить пользовательский форматер ко времени изменения узла, установив модуль Display Suite .

Если вы не хотите использовать какой-либо из этих модулей, но хотите взломать php в своей теме или что-то еще, вы можете использовать ту же логику, что и выше, с функциями format_interval и format_date.

Надеюсь, что это может помочь.

alexkb
источник
0

Где бы вы ни использовали timeago, чтобы показать отформатированную дату, подойдет ли фрагмент, подобный приведенному ниже, для вас?

// Assume $timestamp has the raw Unix timestamp that I'd like to display using
// the "timeago" date format supposing it is within the last 24 hrs and another date
// format - "my_date_format" otherwise.
$rule = ((REQUEST_TIME - $timestamp) <= 24 * 60 * 60);
$fallback = format_date($timestamp, 'my_date_format');
return ($rule ? timeago_format_date($timestamp, $fallback) : $fallback);
Амарнат Равикумар
источник
Это должно быть применено к файлу .module? Я не могу понять, где его поставить.
Алекс
Вам нужно будет найти, где в файле timeago .module применяются новые даты, а затем вы можете попытаться использовать то, что было предложено @Amarnath, или что-то подобное, например, выражение if, охватывающее фактическое применение новых дат и некоторое условие Математика говорит, что если дата больше, чем 24 часа назад, сделайте это.
CR47
0

Создать модуль MyCustom

myCustom.module содержит

/**
 * Implements hook_date_formats().
 */
function myCustom_date_formats() {
  $formats = array('g:i a', 'H:i', 'M j', 'j M', 'm/d/y', 'd/m/y', 'j/n/y', 'n/j/y');
  $types = array_keys(myCustom_date_format_types());
  $date_formats = array();
  foreach ($types as $type) {
    foreach ($formats as $format) {
      $date_formats[] = array(
        'type' => $type,
        'format' => $format,
        'locales' => array(),
      );
    }
  }
  return $date_formats;
}

/**
 * Implements hook_date_format_types().
 */
function myCustom_date_format_types() {
  return array(
    'myCustom_current_day' => t('MyCustom: Current day'),
    'myCustom_current_year' => t('MyCustom: Current year'),
    'myCustom_years' => t('MyCustom: Other years'),
  );
}

/**
 * Formats a timestamp according to the defines rules.
 *
 * Examples/Rules:
 *
 * Current hour: 25 min ago
 * Current day (but not within the hour): 10:30 am
 * Current year (but not on the same day): Nov 25
 * Prior years (not the current year): 11/25/08
 *
 * @param $timestamp
 *   UNIX Timestamp.
 *
 * @return
 *   The formatted date.
 */
function myCustom_format_date($timestamp) {
  if ($timestamp > ((int)(REQUEST_TIME / 3600)) * 3600) {
    return t('@interval ago', array('@interval' => format_interval(abs(REQUEST_TIME - $timestamp), 1)));
  }
  if ($timestamp > ((int)(REQUEST_TIME / 86400)) * 86400) {
    return format_date($timestamp, 'myCustom_current_day');
  }
  if ($timestamp > mktime(0, 0, 0, 1, 0, date('Y'))) {
    return format_date($timestamp, 'myCustom_current_year');
  }
  return format_date($timestamp, 'myCustom_years');
}

Создайте myCustom.install и он содержит

/**
 * @file
 * Install file for myCustom.module
 */

/**
 * Implements hook_install().
 */
function myCustom_install() {
  // Define default formats for date format types.
  variable_set("date_format_myCustom_current_day", 'g:i a');
  variable_set("date_format_myCustom_current_year", 'M j');
  variable_set("date_format_myCustom_years", 'n/j/y');
}

/**
 * Implements hook_uninstall().
 */
function myCustom_uninstall() {
  variable_del('date_format_myCustom_current_day');
  variable_del('date_format_myCustom_current_year');
  variable_del('date_format_myCustom_years');  
}

Применение :

echo myCustom_format_date(1392532844);
Rupesh
источник
2
Привет. Не могли бы вы опубликовать объяснение? Этот сайт предназначен для ответов , а не для кода .
Молот
Ну конечно; естественно. Я позабочусь об этом для дальнейшего ответа.
Рупеш