Use o formato de data Timeago por menos de 24 horas atrás

8

Eu gostaria de usar o módulo Timeago como um formato de data. No entanto, quando o tempo atrás exceder as 24h, eu gostaria que ele mostrasse outro formato (por exemplo, 4 de fevereiro de 2013), como o Twitter ou o Dribbble.

Tentei ajustar o código, mas minhas habilidades me decepcionaram: /

Existe possivelmente um módulo melhor para essa causa? Ou tenho que fazer o meu próprio?

Eu encontrei este código que mostra como eu quero que ele funcione, no entanto, eu não tenho idéia de como implementá-lo no drupal.

Qualquer ajuda é apreciada, obrigado.

Alex
fonte
Essa seria uma ótima solicitação de recurso para o módulo Timeago, se ainda não tiver sido solicitado.
Beth
@ bet Acabei de olhar para os problemas do módulo e ele não parece ter sido solicitado. Vou criar um problema amanhã (sem tempo para isso hoje) a menos que queira fazê-lo :)
Alex
Quais ajustes você tentou fazer no código? Onde esta data aparece no seu site?
Beth
@ beth Eu tentei fazer o código no arquivo jquery.timeago.js ser executado apenas se a variável segundos fosse menor que 86400 (24h). No entanto, eu tenho que fazer com que o módulo inteiro não seja executado, caso contrário ele não mostrará os outros formatos, porque ainda os está substituindo.
Alex4
Eu criei um problema que pode ser encontrado aqui
Alex

Respostas:

1

Os usuários realmente ficam na página por um tempo suficiente para que essas datas precisem ser atualizadas via javascript? A maioria deles clica em algo e acaba recarregando a página inteira em algum momento. Então, talvez, uma solução php também seja uma opção?

Você pode obter a solução php usando o módulo Custom Formatters .

Se você criar um novo formatador personalizado do tipo php, com o seguinte código (verifique se é do tipo de data e hora):

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

Ao criar o formatador, selecione o tipo de campo 'datestamp'. Depois que o formatador é criado, na guia gerenciar exibição do seu tipo de conteúdo, defina o campo para usar esse formatador.

Se você não tiver sua data armazenada como um campo separado, poderá aplicar o formatador personalizado à hora da modificação do nó, instalando o módulo Display Suite .

Se você não quiser usar nenhum desses módulos, mas quiser invadir algum php em seu tema ou algo assim, ainda poderá usar a mesma lógica acima com as funções format_interval e format_date.

Espero que possa ajudar.

alexkb
fonte
0

Onde quer que você esteja usando o timeago para mostrar uma data formatada, um trecho como o abaixo fará o truque para você?

// 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
fonte
Isso deve ser aplicado a um arquivo .module? Eu realmente não consigo descobrir onde colocá-lo.
8283 Alex
Você precisaria encontrar onde, no arquivo .module timeago, as novas datas são aplicadas e, em seguida, tentar o que @Amarnath foi sugerido, ou algo semelhante, como uma declaração if envolvendo o aplicativo real das novas datas e a condição sendo alguma matemática dizendo que se a data for maior que 24 horas atrás, faça isso.
CR47
0

Criar um módulo MyCustom

myCustom.module contém

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

Crie myCustom.install e ele contém

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

Uso:

echo myCustom_format_date(1392532844);
Rupesh
fonte
2
Olá. Você poderia postar uma explicação? Este site é destinado a respostas , não a códigos .
Mołot 16/02
Sim, claro. Vou cuidar disso para obter mais respostas.
Rupesh