4
八/09
1

剖析ubercart

ubercart是一套很好的搭建电子商务平台代码,被很好的以模块形式应用到了drupal上,接合drupal的强大功能很容易生成电子商务站点。

下载了最新版本的模块看了看,代码量确实巨大。要先学会怎么用,再去看代码我想工作效率会更高,所以启用模块建了几个产品试试,购物车和付费平台什么的功能都走通了之后开始挑几个重要的代码段看了看。因为我要实现一个充值后增加userpoints积分的功能,找了半天终于找到一个相关模块,但是问题很多,issue页面也有人提出了类似的问题。没办法只能靠自己了,了解product模块和feature相关特性后,很轻松的就找到了问题所在。大家需要类似功能的可以参考下。

http://drupal.org/node/514534

解决办法在评论里面,不过我没有测试,只是看到代码流程没有问题了。首先建立一个feature,将产品节点绑定到这个feature里面,再实现order这个hook,在里面判断当订单完成状态后,使用userpoints模块的接口给购买用户增加分数。至于points的分类和数目完全可以自己在后台设置,还是不错的功能,只是纳闷作者为什么这么粗心,错了一个变量,错了一个表名。

关键字:
1
八/09
0

快速从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系统。

关键字:
16
七/09
1

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&amp;id='. $key) . '">'.$val. '</a>';
      $output .= '
 
';
    }
    $output .= '';
    break;
 
  default:
    break;
}
$output .= '';
print $output;

一个简单的功能就有了,可以分离模板,包含别的功能进来,做更多的处理。

关键字:
9
六/09
0

【转载】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时间。

2
六/09
4

关于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形式参数是不一样的,后者确确实实指的是“是否以全文的方式显示”,也就是说上面的判断是错误的。

关键字: