Utiliser le format de date Timeago il y a moins de 24h seulement

8

Je voudrais utiliser le module Timeago comme format de date. Cependant, lorsque le temps passé a dépassé 24h, j'aimerais qu'il affiche un autre format (par exemple, 4 février 2013) un peu comme Twitter ou Dribbble.

J'ai essayé de modifier le code, mais mes compétences m'ont laissé tomber: /

Y a-t-il peut-être un meilleur module pour cette cause? Ou dois-je créer le mien?

J'ai trouvé ce code qui montre comment je veux qu'il fonctionne, mais je n'ai aucune idée de comment l'implémenter sur drupal.

Toute aide est appréciée, merci.

Alex
la source
Ce serait une excellente demande de fonctionnalité pour le module Timeago si ce n'est pas déjà fait.
beth
@beth Je viens de regarder les problèmes du module et il ne semble pas avoir été demandé. Je vais créer un problème demain (pas de temps pour ça aujourd'hui) à moins que vous ne vouliez le faire :)
Alex
Quels ajustements avez-vous tenté d'apporter au code? Où cette date apparaît-elle sur votre site?
beth
@beth J'ai essayé de faire exécuter le code du fichier jquery.timeago.js uniquement si la variable secondes était inférieure à 86400 (24h). Cependant, je dois faire en sorte que le module entier ne fonctionne pas, sinon il n'affichera pas les autres formats, car il les remplace toujours.
Alex
J'ai créé un problème qui peut être trouvé ici
Alex

Réponses:

1

Les utilisateurs sont-ils vraiment assis sur une page assez longtemps pour que ces dates soient mises à jour via javascript? La plupart d'entre eux cliquent sur quelque chose et finissent par recharger toute la page à un moment donné. Alors peut-être qu'une solution php est également une option?

Vous pouvez obtenir la solution php en utilisant le module Custom Formatters .

Si vous créez un nouveau formateur personnalisé de type php, avec le code suivant (assurez-vous qu'il s'agit d'un type d'horodatage):

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

Lors de la création du formateur, assurez-vous de sélectionner le type de champ «horodatage». Une fois le formateur créé, dans l'onglet Gérer l'affichage de votre type de contenu, définissez le champ pour utiliser ce formateur.

Si votre date n'est pas stockée dans un champ séparé, vous pourrez peut-être appliquer le formateur personnalisé à l'heure de modification du nœud, en installant le module Display Suite .

Si vous ne souhaitez utiliser aucun de ces modules mais souhaitez pirater du php dans votre thème ou quelque chose, vous pouvez toujours utiliser la même logique ci-dessus avec les fonctions format_interval et format_date.

J'espère que cela peut vous aider.

alexkb
la source
0

Partout où vous utilisez timeago pour afficher une date formatée, un extrait comme celui ci-dessous fera-t-il l'affaire pour vous?

// 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
la source
Est-ce censé être appliqué à un fichier .module? Je ne peux pas vraiment savoir où le mettre.
Alex
Vous auriez besoin de trouver où dans le fichier timeago .module les nouvelles dates sont appliquées et ensuite vous pourriez essayer ce que @Amarnath était une suggestion, ou quelque chose de similaire, comme une instruction if entourant l'application réelle des nouvelles dates et la condition étant mathématiques disant si la date est supérieure à 24 heures, faites-le.
CR47
0

Créer un module MyCustom

myCustom.module contient

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

Créez myCustom.install et il contient

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

Utilisation:

echo myCustom_format_date(1392532844);
Rupesh
la source
2
Bonjour. Pourriez-vous poster une explication? Ce site est destiné aux réponses , pas au code .
Mołot
Oui bien sûr. Je m'en soucierai pour plus de réponse.
Rupesh