我一直在试图了解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网站。
提前多多感谢。
答案 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方法更容易,因为学习曲线较少。
希望有所帮助。