首先,感觉作者对三个模块具体用处不是很清楚。虽然它们都与网站显示有着千丝万缕的关系。不过在此我阐述下各个模块之间的区别。
Drupal涉及到内容显示的概念由: region,block,view mode,field formatter,form element。
我们在处理显示内容方面,会经常用到以下模块:views,ds,panels,context.
views:严格来说是一个sql数据查询配置器。至于在显示方面的处理,内嵌了fields,Rendered entity两种,这两种都是解决将搜索出来的数据库(Row)显示的问题。当然还有很多模块,扩展了这方面的内容。比如以json方式显示。fields和Rendered entity方式的大致区别:fields方式比较灵活。而另外一种则是调用了view mode这个概念,比较有利于内容显示的规范化,并且声称了一个比较好的东西:一个带齿轮的快捷菜单。
ds: 是对drupal的view mode 和field formatter 的强化工具。它主要是处理entity如何显示的问题。当然它也有自己的layout系统,但是都是基于entity上的。
panels: 是一个自带功能强大的显示工具。完全将drupal的region和block概念放到一边,用自己的一套系统处理显示的问题。
context:是对drupal的region和block的强化工具。
至于field formatter,form element 这两个drupal概念,field formatter 由比较好的模块进行扩展,但是我比较喜欢自己开发field formatter。 form element 貌似只能用代码创建。
上述概念都是drupal系统提供的,换句话来说就是drupal way。
如果你是熟悉php但是不熟悉drupal或者不想用上述概念,完全以php的代码方式输出(此方法最为灵活):
只要用hook_menu定义一个网站入口,接下来就会产生如下类似的代码:
$edate = $node->field_date[LANGUAGE_NONE][count($node->field_date[LANGUAGE_NONE]) - 1]['value'];
// last occurrence event end_date time needs tobe displayed as end time
$etime = $node->field_date[LANGUAGE_NONE][count($node->field_date[LANGUAGE_NONE]) - 1]['value2'];
$edate = explode(" ", $edate);
//for non-recursive events get 'To' date as end date
if ($node->field_date[LANGUAGE_NONE][0]['rrule'] == NULL) {
$new_end_date = format_date(strtotime($etime), 'custom', 'D, M j, Y');
}
else {
$new_end_date = format_date(strtotime($edate[0]), 'custom', 'D, M j, Y');
}
$etime = explode(" ", $etime);
$new_end_time = format_date(strtotime($etime[1]), 'custom', 'H:i');
$markup = explode(' . ', $node->content['field_date'][0]['#markup']);
我个人比较喜欢: ds+views+context组合。 而panels不利于开发。在某些方面比较繁琐且不好控制。