Drupal 7,关于主题的一般问题

时间:2011-08-25 11:56:13

标签: drupal drupal-7 drupal-modules drupal-themes

我一直在试图了解Drupal方式的噩梦!我在这里有一个例子,如果有人能告诉我实现结果的正确方法,我希望它能帮助我打开理解的大门。

所以我试图将节点创建日期改为类似于Stack Overflows格式。例如。这是“发布x小时前”或“发布于8月17日12:22”等。

我已经设法使用“node.tpl.php”文件创建了desiered效果。我使用节点变量“$ 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网站。

提前多多感谢。

1 个答案:

答案 0 :(得分: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方法更容易,因为学习曲线较少。

希望有所帮助。

相关问题