自定义日期格式(使用php逻辑回调)

Alb*_*ski 5 drupal drupal-6 drupal-7

我想创建一个动态的PHP日期格式.示例:显示节点的时间(如果它是今天发布的),仅显示当天的旧日/月.我希望这种格式可以像Drupal中的其他预定义日期格式一样在整个Drupal中使用(不仅仅是在主题级别).

我找到了hook_date_format_types的(仅限D7)钩子,但即使是那个似乎也不允许我可以定义这个PHP逻辑的回调.

有谁知道哪个钩子会使这成为可能?或者这样做的模块?

ber*_*kes 1

在 Drupal6 中,format_date()日期和时间是硬编码的。另外,format_date()不允许回调,但它允许自定义字符串。这就是您可以应用技巧的地方:您可以调用返回字符串的函数,而不是对其中的字符串进行硬编码。

function mydate_format($timestamp) {
  $now = time();
  if (($now - $timestamp) < (60*60*24)) {
    return "H:i";
  }
  else {
    return "d:m:Y";
  }
}

print format_date($timestamp, 'custom', mydate_format($timestamp));
Run Code Online (Sandbox Code Playgroud)

第二种选择是重新定义日期时间戳,但这既简单又有限。日期格式是用variable_get()定义的,但不传递时间戳;因此,您基于时间戳值切换格式的示例是不可能通过这种方式实现的。

在settings.php中:

$conf['date_format_long'] = $conf['debug'] ? 'r' : 'l, F j, Y - H:i';
Run Code Online (Sandbox Code Playgroud)

这将从一个值切换到另一个值,具体取决于您的 settings.php 是否将“debug”标志设置为 TRUE。如前所述:其用途是有限的,因为您无法获得任何上下文。

第三种选择是使用Date API,它提供在线可配置的时间格式。但这既笨拙又不安全(在数据库中输入可执行的 PHP)。它还依赖于一个非常大的模块集。并且与第一个解决方案具有相同的缺点:您不能使用 format_date,但必须使用修改后的函数调用,而不是format_date(). 请参阅Drupal.org 日期主题手册中的所有选项。

在所有情况下, Drupal都不会为缓存内容调用此函数。如果你想让日期真正动态化,你要么需要完全避免缓存,要么在客户端 JavaScript 中实现日期格式。

TL;DR:如果不更改主题级别的某些代码,就无法拥有动态日期格式。使用回调函数生成“自定义”日期格式是最简单、有效的解决方案。