Używaj formatu daty Timeago mniej niż 24 godziny temu

8

Chciałbym użyć modułu Timeago jako formatu daty. Jednak gdy czas temu przekroczył 24 godziny, chciałbym, aby wyświetlał inny format (np. 4 lutego 2013 r.) Podobny do Twittera lub Dribbble.

Próbowałem ulepszyć kod, ale moje umiejętności mnie zawiodły: /

Czy jest może lepszy moduł dla tej przyczyny? Czy też muszę tworzyć własne?

Znalazłem ten kod, który pokazuje, jak chcę, aby działał, jednak nie mam pojęcia, jak zaimplementować to w Drupal.

Każda pomoc jest mile widziana, dzięki.

Alex
źródło
Byłoby to świetne żądanie funkcji dla modułu Timeago, jeśli nie zostało już o to poproszone.
beth
@ bet Właśnie przejrzałem problemy z modułem i wydaje się, że nie został o to poproszony. Stworzę problem jutro (dzisiaj nie ma na to czasu), chyba że chcesz to zrobić :)
Alex
Jakie poprawki próbowałeś zrobić w kodzie? Gdzie ta data pojawia się na twojej stronie?
beth
@ bet Próbowałem, aby kod w pliku jquery.timeago.js działał tylko wtedy, gdy zmienna sekund była mniejsza niż 86400 (24h). Jednak muszę sprawić, aby cały moduł nie uruchamiał się, w przeciwnym razie inne formaty nie będą wyświetlane, ponieważ nadal je zastępuje.
Alex
Stworzyłem problem, który można znaleźć tutaj
Alex

Odpowiedzi:

1

Czy użytkownicy naprawdę siedzą na stronie przez wystarczająco długi czas, aby te daty musiały być aktualizowane za pomocą javascript? Większość z nich kliknie coś i w pewnym momencie przeładuje całą stronę. Więc może rozwiązanie php też jest opcją?

Możesz osiągnąć rozwiązanie php za pomocą modułu Custom Formatters .

Jeśli utworzysz nowy niestandardowy program formatujący typu php, z następującym kodem (upewnij się, że jest to typ datestamp):

$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;

Podczas tworzenia formatyzatora upewnij się, że wybierasz typ pola „datestamp”. Po utworzeniu formatyzatora, a następnie na karcie zarządzania wyświetlaniem typu zawartości ustaw pole, aby używać tego formatyzatora.

Jeśli nie masz daty zapisanej jako osobne pole, możesz zastosować niestandardowy formatyzator do czasu modyfikacji węzła, instalując moduł Display Suite .

Jeśli nie chcesz używać żadnego z tych modułów, ale chcesz włamać php do swojego motywu lub czegoś takiego, nadal możesz użyć tej samej logiki powyżej z funkcjami format_interval i format_date.

Mam nadzieję, że to może pomóc.

alexkb
źródło
0

Gdziekolwiek użyjesz timeago do wyświetlenia sformatowanej daty, czy fragment kodu podobny do tego, który znajduje się poniżej, załatwi sprawę?

// 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);
Amarnath Ravikumar
źródło
Czy to powinno być zastosowane do pliku .module? Naprawdę nie wiem, gdzie to położyć.
Alex
Musisz znaleźć, gdzie w pliku .module timeago stosowane są nowe daty, a następnie możesz wypróbować sugestię @Amarnath lub coś podobnego, na przykład instrukcję if otaczającą faktyczne zastosowanie nowych dat i warunek matematyka mówi, że jeśli data jest większa niż 24 godziny temu, zrób to.
CR47,
0

Utwórz moduł MyCustom

myCustom.module zawiera

/**
 * 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');
}

Utwórz myCustom.install i zawiera

/**
 * @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');  
}

Stosowanie :

echo myCustom_format_date(1392532844);
Rupesz
źródło
2
Witaj. Czy możesz opublikować wyjaśnienie? Ta strona jest przeznaczona na odpowiedzi , a nie na kod .
Mołot
Tak oczywiście. Zależy mi na dalszej odpowiedzi.
Rupesh