0

我一直在做一场噩梦,试图理解 Drupal 的方式!我在这里有一个例子,如果有人可以向我展示实现我的结果的正确方法,我希望它能帮助我打开理解之门。

所以我试图改变节点创建日期,使其看起来类似于堆栈溢出格式。EG 这是“X 小时前发布”或“8 月 17 日 12:22 发布”等。

我已经设法使用“node.tpl.php”文件创建了预期的效果。我已经使用节点变量“$created”和以下代码实现了这一点。

    $showCreate = round((time() - $created) / 60);
if ($showCreate < 60) {
    $showCreate = $showCreate . "mins ago." ;
} else {
    $showCreate = round($showCreate / 60);
    if ($showCreate > 24) {     
        $createMonth  = format_date($created, 'custom', 'M');
        $createDate   = format_date($created, 'custom', 'd');   
        $createTime   = format_date($created, 'custom', 'H:i');
        switch ($createDate) {
            case 1:
            case 21:
            case 31:
                $createDate = $createDate . "st";
                break;
            case 2:
            case 22:
                $createDate = $createDate . "nd";
                break;
            case 3:
            case 23:
                $createDate = $createDate . "rd";
                break;
            default:
                $createDate = $createDate . "th";
                break;
        }
        $showCreate = $createMonth . " " . $createDate . " at " . $createTime;
    } else {
        $showCreate = $showCreate . "hrs ago." ;    
    }
}

这是实现这一目标的“正确”方法吗?或者你会使用一些钩子和预处理函数吗?我更愿意将它包装成一个 MOdule,这样我就可以将它直接应用到我的其他 drupal 站点。

提前非常感谢。

4

1 回答 1

1

在 Drupal 7 中有很多不同的方法可以做到这一点,我想这取决于你在做什么。

如果您正在编写模块,那么您想使用hook_node_view来更改呈现的内容。

这是上面页面中的一些示例代码:

function hook_node_view($node, $view_mode, $langcode) {
  $node->content['my_additional_field'] = array(
    '#markup' => $additional_field, 
    '#weight' => 10, 
    '#theme' => 'mymodule_my_additional_field',
  );
}

如果您正在编写主题,那么您想在主题的 template.php 文件中使用 hook_preprocess_node,如下所示:

function mytheme_preprocess_node(&$vars) {
  $node = $vars['node'];

  $vars['my_created_date'] = my_date_extraction_function($node->created);
}

然后在您的 node.tpl.php 中,您将拥有可用的变量 $my_created_date,您可以使用它来代替原始创建日期。

显然,您可以在这里发挥您的想象力,您添加到 $vars 数组的任何内容都将在 node.tpl.php 中可用,并且您可以完全访问 mytheme_preprocess_node() 中的节点对象。

如果您之前没有使用过 hook_node_view 或渲染 API,您可能会发现使用 preprocess_node 方法更容易,因为学习曲线较少。

希望有帮助。

于 2011-08-25T13:07:09.253 回答