八/091
快速从drupal5升级到drupal6
从drupal5升级到drupal6的必要性有必要先说明下(听着有点绕口):一年前drupal6刚出来的时候大家都不建议升级,因为最大的问题就是相关模块支持太少,但到现在drupal6已经相当成熟,包括更严格的菜单路径映射功能(drupal5的时候菜单系统出现很多安全问题),更好的jquery加强站点UE,以前设置权重值很是麻烦,而现在只要进行拖动保存后就可以了,另外很多api更加细化,人性化和简单化。BTW,能升级到windows7的用户赶紧升级吧,因为比XP好用很多,我没有枪手嫌疑,因为我是个忠实的Linux用户。
关于升级服务器端部署问题这篇文章将不涉及,前面文章有介绍过,并且我记得在drupal.org上有篇文章是专门介绍如何从drupal5直接升级到drupal6的,我这里只是介绍模块开发人员要学习和参考的东西。
首先,菜单系统。我想这是在drupal6中最大的变化,首先$items这个序列化数组的键完全不同了,从callback 和 callback arguments变成了page callback,access也变成了access_callback以及access_arguments(包括title属性),这就意味着开发人员可以更好的定制drupal的菜单系统。而且drupal6引入的path arguments更好的规范了drupal的动态菜单,配合load后缀函数方面页面传递参数,这里改动比较复杂,大家参考官方文档。
数据库层改动不大,接下来说说form api几个地方的改动,几个hook的参数发生了改变,form_alter , form_validate, form_submit,第一个变成了三个参数,最后一个参数才是form_id,并且为了性能问题,因为之前form_alter要检测所有的form,加入了modulename_form_formname_alter函数。第二个参数数组发生了变化,现在都用$form_state['value']['element_name']判断,其中element_name是form数组中定义的表单元素。第三个提交后返回地址更加方便,直接修改$form['redirect']的值为内部链接就可以了,不用drupal_goto函数(其实也是对drupal_goto的再次包装),不过记得传递进来的是地址引用,而不是值。
在使用上来看,很多模块都更新了,操作更加方面,所以建议大家升级到drupal6系统。
七/091
drupal的WAP页面
要给站点提供一些wap访问的简单页面,数据在drupal的db中已经有了,网上找了找没有相关模块,只能自己动手了。
在站点根目录下创建文件wap.php
$output = ''; switch ($_GET['op']) { case 'list': $pid = ( isset($_GET['id']) ? intval($_GET['id']) : '' ); $result = // fetch from database. $output .= ''; foreach ($result as $key => $val) { $output .= ' '; $output .= '<a href="?'. htmlentities('op=view&id='. $key) . '">'.$val. '</a>'; $output .= ' '; } $output .= ''; break; default: break; } $output .= ''; print $output;
一个简单的功能就有了,可以分离模板,包含别的功能进来,做更多的处理。
六/091
【转载】drupal的性能问题
原文地址: http://www.bloggern.com/3577.html
我因为工作原因,曾经对Drupal做过比较全面的测试。当时的环境是双服务器(DB server+Web Server),硬件配置都是单CPU+4G。数据库里面有几千条记录。用JMeter对各种情况下(开/关各种cache模块,logged user/anonymous user)不同页面的读取和写入操作都进行过测试。 测试的结论可能和很多人印象中不一样。都说Drupal对数据库要求高,但事实上,无论是cache还是非cache模式,DB server的压力都是相当小的(CPU在10%以下),而Web Server的CPU在80%以上。跟踪所有的db query的执行时间后,也证明了这一点(全部db query的执行时间只占页面生成时间的一小部分)。所以结论是,Drupal在大量logged user并发情况下的瓶颈,在于执行Drupal代码的CPU时间。
六/094
关于drupal区块的小问题
drupal模块开发中经常用到区块的概念,将一些相关数据放到区块中,配合权限验证,将用户能看到的信息以区块的形式展示到用户浏览器中。不过区块是跟节点无关了,如果要根据当前节点页面的特性针对性的在区块中显示内容,我的做法是:
if (arg(0) == ‘node’ && is_numeric(arg(1)) { // 初步设想是仅仅当路径是’ node / 3 ‘,类似这样的地址时显示
$node = node_load(arg(1));
if (!$node->teaser) // 初步设想是节点以全节点方式显示的时候才有效(提高一点效率)
}
在调试的过程中发现,arg函数是和drupal内置的path模块无关的。也就是说如果给某个节点设置了path,比如给公司的帮助页面设置了path : www.target.com/help,那么arg(0)我们取到的还是node,而不是help。
另外, $node对象中的teaser属性指的是节点的摘要,而不是“是否以全文的方式显示”,这个跟nodeapi钩子,以及hook_view中的$teaser形式参数是不一样的,后者确确实实指的是“是否以全文的方式显示”,也就是说上面的判断是错误的。
五/090
drupal搜索结果页面定制
drupal默认的搜索结果页面往往不是我们想要的,尤其对搜索没有结果的时候那一堆无聊的提示信息简直是很差劲的用户体验,因此,我们必须对其定制。看看search模块中这段代码:
if ($results) { $results = theme('box', t('Search results'), $results); } else { $results = theme('box', t('Your search yielded no results'), search_help('search#noresults')); }
很简单,用box模板来展示结果了,因此我们可以在box.tpl.php中写上:</p>
if ( t('Your search yielded no results') == $title) { // your html code. }
至于对有搜索结果页面的定制就很简单了,drupal提供了主题覆写函数phptemplate_search_page()