Verwenden Sie das Timeago-Datumsformat nur für weniger als 24 Stunden

8

Ich möchte das Timeago- Modul als Datumsformat verwenden. Wenn die Zeit vor 24 Stunden überschritten wurde, möchte ich, dass ein anderes Format (z. B. 4. Februar 2013) angezeigt wird, ähnlich wie bei Twitter oder Dribbble.

Ich habe versucht, den Code zu optimieren, aber meine Fähigkeiten haben mich im Stich gelassen: /

Gibt es möglicherweise ein besseres Modul für diese Ursache? Oder muss ich meine eigenen machen?

Ich habe diesen Code gefunden, der zeigt, wie er funktionieren soll, habe jedoch keine Ahnung, wie ich ihn in Drupal implementieren soll.

Jede Hilfe wird geschätzt, danke.

Alex
quelle
Dies wäre eine großartige Funktionsanforderung für das Timeago-Modul, wenn es nicht bereits angefordert wurde.
Beth
@beth Ich habe gerade die Probleme für das Modul durchgesehen und es scheint nicht angefordert worden zu sein. Ich werde morgen ein Problem erstellen (heute keine Zeit dafür), es sei denn, Sie möchten es tun :)
Alex
Welche Änderungen haben Sie am Code vorgenommen? Wo erscheint dieses Datum auf Ihrer Website?
Beth
@beth Ich habe versucht, den Code in der Datei jquery.timeago.js nur auszuführen, wenn die Sekundenvariable kleiner als 86400 (24 Stunden) war. Ich muss jedoch dafür sorgen, dass das gesamte Modul nicht ausgeführt wird, da sonst die anderen Formate nicht angezeigt werden, da sie immer noch überschrieben werden.
Alex
Ich habe ein Problem erstellt, das hier
Alex

Antworten:

1

Sitzen Benutzer wirklich lange genug auf einer Seite, damit diese Daten über Javascript aktualisiert werden müssen? Die meisten von ihnen klicken auf etwas und laden irgendwann die ganze Seite neu. Vielleicht ist eine PHP-Lösung auch eine Option?

Sie können die PHP-Lösung mithilfe des Moduls Benutzerdefinierte Formatierer erreichen .

Wenn Sie einen neuen benutzerdefinierten Formatierer vom Typ PHP mit dem folgenden Code erstellen (stellen Sie sicher, dass es sich um einen Datenstempeltyp handelt):

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

Stellen Sie beim Erstellen des Formatierers sicher, dass Sie den Feldtyp 'Datenstempel' auswählen. Nachdem der Formatierer erstellt wurde, legen Sie auf der Registerkarte Anzeige verwalten Ihres Inhaltstyps das Feld für die Verwendung dieses Formatierers fest.

Wenn Sie Ihr Datum nicht als separates Feld gespeichert haben, können Sie den benutzerdefinierten Formatierer möglicherweise auf die geänderte Zeit des Knotens anwenden, indem Sie das Display Suite- Modul installieren .

Wenn Sie keines dieser Module verwenden möchten, aber etwas PHP in Ihr Thema oder etwas anderes hacken möchten, können Sie immer noch dieselbe Logik wie oben mit den Funktionen format_interval und format_date verwenden.

Hoffe das kann helfen.

alexkb
quelle
0

Überall dort, wo Sie timeago verwenden, um ein formatiertes Datum anzuzeigen, wird ein Snippet wie das folgende den Trick für Sie tun?

// 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
quelle
Soll dies auf eine .module-Datei angewendet werden? Ich kann nicht wirklich herausfinden, wo ich es hinstellen soll.
Alex
Sie müssten herausfinden, wo in der timeago .module-Datei die neuen Daten angewendet werden, und dann können Sie versuchen, was @Amarnath vorgeschlagen hat, oder etwas Ähnliches, wie eine if-Anweisung, die sich um die tatsächliche Anwendung der neuen Daten dreht, und die Bedingung ist eine Wenn das Datum größer als 24 Stunden ist, tun Sie dies.
CR47
0

Erstellen Sie ein MyCustom-Modul

myCustom.module enthält

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

Erstellen Sie myCustom.install & es enthält

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

Verwendungszweck :

echo myCustom_format_date(1392532844);
Rupesh
quelle
2
Hallo. Könnten Sie eine Erklärung posten? Diese Seite ist für Antworten gedacht , nicht für Code .
Mołot
Ja, sicher. Ich werde mich um weitere Antworten kümmern.
Rupesh