6
十一/11
1

用Drupal快速实现mobile平台服务端

用Drupal很容易实现一个API,让手机平台或者其他系统使用json的格式进行通信。
<?php
define('API_ERRORNO_INVALID_ACTION', 1);
define('API_ERRORNO_INVALID_PARAM', 2);
define('API_ERRORNO_NO_RECORD', 3);
define('API_ERRORNO_INVALID_NAME', 4);
define('API_ERRORNO_USER_BLOCKED', 5);
define('API_ERRORNO_LOGIN_FAILED', 6);

// 根据错误代码返回错误信息
function api_message_wrapper($errno) {
  $message = array(
    API_ERRORNO_INVALID_ACTION => '非法的请求动作',
    API_ERRORNO_INVALID_PARAM => '非法的请求参数',
    API_ERRORNO_NO_RECORD => '查找不到数据',
    API_ERRORNO_INVALID_NAME => '非法的手机号码',
    API_ERRORNO_USER_BLOCKED => '当前用户已经被禁用',
    API_ERRORNO_LOGIN_FAILED => '登陆失败',
  );
  return isset($message[$errno]) ? $message[$errno] : '未知的错误';
}

// 验证合法的action
function api_action_route($action) {
  $valid_actions = array(
      'login' => 'login',
      'register' => 'register',
      'getCardInfos' => 'get_card_info',
  );
  return isset($valid_actions[$action]) ? $valid_actions[$action] : false;
}

function api_menu() {
  $items['api'] = array(
    'page callback' => 'api_dispatch',
    'access callback' => TRUE,
    //'access arguments' => array('使用API'),
    'type' => MENU_CALLBACK,
    'file' => 'api.functions.inc',
  );
  return $items;
}

// 成功返回
function api_response_sucess($data) {
  drupal_json(array('ERRNO' => 0, 'DATA' => $data));
}

// 失败返回
function api_response_error($errno) {
  if ($errno && is_numeric($errno)) {
    drupal_json(array(
      'ERRNO' => $errno,
      'MSG' => api_message_wrapper($errno),
    ));
  }
}

// API调度入口
function api_dispatch() {
  if (!isset($_POST['ACTION']) || !api_action_route($_POST['ACTION'])) {
    api_response_error(API_ERRORNO_INVALID_ACTION);
  }
  elseif (!isset($_POST['PARAM'])) {
    api_response_error(API_ERRORNO_INVALID_PARAM);
  }
  else {
    $param = json_decode($_POST['PARAM']);
    call_user_func('api_call_'.  api_action_route($_POST['ACTION']), $param);
  }
}
关键字:
8
七/11
0

用yii框架开发web应用

好久没写博客了,都是在微博中堕落了,加上最近特别忙,入手了一台MBP。更换了工作平台,准备看些新的适合web2.0的高性能纯面向对象框架,yii就是我想要的了。

官方文档比较齐全,有多语言在线文档和两本pdf书籍以及一个用yii搭建blog程序的向导。学习曲线不算曲折,很快就上手用它来写东西。特性一大堆,刚开始不可能熟悉所有的,只是看了数据库和用户验证以及表单部分,一般的web应用就能应付了。至于怎么让yii更好的为你工作,完全深入它的很多机制只能在接下来的时间中慢慢熟悉。对于从别的mvc模式的框架转移到yii,几乎不用花费太多时间。有两个图看明白了概念也就清晰了,一个是路由处理的流程图,一个是mvc加上组件以及其他附属品的结构图。

繁忙的生活让我最近颓废了好多,以前2个星期一本书的习惯已经荒废了半年了,打算10-1后振作下,坚持下去这个习惯。近期打算翻译一些网络安全书籍,给drupal社区提交一些开源模块,尝试一些新鲜的东西。

关键字:
23
十二/10
0

Drupal编程总结

从2007年末接触Drupal开始,已经3年时间了。Drupal已经从5.x版本升级到了7.x,模块开发也发生了很多变化。

1. 在查询数据库的时候,考虑到一些特殊情况尽量使用静态变量,这相当于drupal的第一层缓存,在drupal的很多load相关函数中到处可见。比如:

function terrysco_get_group($lgid, $reset = false) {

// 使用静态变量做缓存

static $linkedin = array();

if ($reset) {

$terrysco = array();

}

if (!isset($terrysco[$lgid]) && is_numeric($lgid)) {

$terrysco[$lgid] = db_fetch_array(db_query(‘SELECT * FROM {linkedin_groups} WHERE lgid = %d’, $lgid));

}

return isset($terrysco[$lgid]) ? $terrysco[$lgid] : false;

}

这样,在要处理一个大的结果集的时候,在循环中调用该函数,就不会每次循环都查询数据库了。

2. 深入理解drupal的hook机制,用好module_invoke_all来设计你的模块机制,大大增强扩展性。其他方面,多想想怎么和别的模块工作的更好,不要进行hack的工作,要给别的模块留下更改你输出主题,更改你返回数据的机会。

3. 多使用表单给用户进行参数配置,将这些配置用variable_set存起来随时使用,生成配置表单的时候可以使用system_settings_form()将表单数组包装起来,省去了写提交函数的部分。另外,将一些数据分析后可以适当存储在session或者cookie中,不一定非要写数据库。

4. 不要过于依赖node机制。node给我们提供了很多方便,很多第三方模块装上后就能很好的工作,比如fivestar,views之类的东西,但也要考虑实际项目需要。很多小的数据如果量很大,不建议放在node表中。而且node表以nid作为auto_increment的primary key,给我们日后做扩展留下了很多麻烦。

5. 不要过于依赖第三方模块。第三方模块的一个共同点就是功能强大,代码质量还算不错,但是正因为如此,模块开发者考虑到的是通用性,一个大的模块可能很多功能我们使用不了,这时候就不要偷懒了,自己动手吧。而且很多第三方模块是有问题的,自己细心研究下就能发现很多。

6. Drupal本身支持快速切换数据库,这就使得我们可以在开始的时候就做好设计,看看是否将某些业务分离。当然,如果是中小型的项目就不用了。

未完待续。。。

关键字:
11
十/10
2

CakePHP Application Development

花了三天时间看完了《CakePHP Application Development》这本PDF文档,感叹作者的耐心,何奇的淡定。且不说我这个用了PHP做应用5年的人,就算是一个PHP不怎么了解的人估计都能看懂。这本书从头到尾都在案例之后进行分析,我觉得好处在于对初学者来说在cakephp这个框架能打好基础,对cakephp的个方面了解比较透彻。虽然从头到尾300多页感觉如果精简的话可能只有100多页,但是我不认为多余的是废话。只有对技术比较刨根问底的人才能把一门技术写的请清楚楚,让看客们也请清楚楚,明明白白。比起其他一些作者,写出来的东西都是一律而过来得更为实在。

cakephp是基于MVC这个模式来组织代码的,所以此书最重要的三章应该就是分别介绍controller,model和view的三章。早就听说cakephp是ror的php版本,虽然说法有些夸张,但是在cake里面还是能看到很多ror的思想和影子。很多人也说cake的Model实现方式过为复杂,我想只是使用群体不一样,具体的项目具体对待。

这次是因为一个中型项目而让我对cakephp产生要了解的想法。因为虽然php的framework很多,但是不像java阵营那样,php相关的框架大都是毁誉参半的,而且个别流行的框架也没有强大的社区支持。从众多的php框架中我选择了国产的thinkphp,相当于官方的zend framework以及轻量级的codeigiter,最后就是本文主要介绍的cakephp。选择的过程是个纠结的过程,因为框架的选择角度太多了,但从代码风格上来说,我更趋向于cake的代码。仔细研究了下,发现cake做的很人性化,这里人性化的意思是作者很像是个做产品的人,因为从很多地方都体现出了cake的方便和人性化。比如scaffold这个基本功能,在codeigiter里面也有,cake里面只需要在controller里面声明一个scaffold属性就行了,相当简单。

大家都知道,较高的便利性下面都隐藏着大量的命名约定。因为你只有遵守了框架作者的约定和设计思想,你才会得到很大的便利。因为作者在设计的时候,如果考虑使用者各种各样的习惯,设计出来的东西谁都用着不舒服了,只有使用者遵循一定的规则,框架就能带来强大的生产力,这也就是cake的脚本可以跑起来的前提条件。cake拥有一个小型的“shell”,叫做bake,ROR和Djangle都有类似的支持。只要我们在controller,model和views以及数据库设计的时候遵循了cake的命名约定,那么这一些都可以用bake来帮你处理。

我用cakephp建立了一个简单的定餐应用,发现确实像口号中所说那样:rapid development。大概一个下午,就做出了一个成熟的定餐系统应该有的所有功能。这样我就不用羡慕很多java开发者可以使用成熟的框架了,没办法自己对java也挺了解的,为什么就没法在实际应用中应用呢?总觉得太重。

搜索cakephp的时候,在网上看到一些中文资料,但质量都不是很好,强烈建议对cakephp有兴趣的朋友看看这本书,从头到尾没有一个晦涩的单词,通俗易懂。而且后面几章作者通过一个实例小应用配合cake的一些特性进行了说明,这写特性有分页,ajax,认证机制,cookie,session,rss订阅。在这写应用中,cake都显得极为方便。正如那句话:a piece of cake。

本书是面向cakephp新手的书,看完后我觉得还需要对官方文档详细阅读后才能达到用cakephp来开发复杂应用的程度。因为用户群不同,这本书只是介绍了cake的一些基础理论,而了解了这写,使用者可以在官方文档中自助式查询需要的东西。

关键字:
29
三/10
2

CodeIgniter 入门

终于花了1个半星期的时间看完了“CodeIgniter 1.7”这本书,300多页,不过内容还算丰富。从web开发的各个方面介绍了CodeIgniter这个PHP框架,章节的安排跟那本“Pro Drupal Development”类似。看完本书后,感觉codeigniter确实能弥补一些目前的PHP框架开发现状,目前来说基于PHP的CMS比较全,国外流行的有drupal,joomla,CMSMS等等,国内的就更数不胜数了。但提到framework,大家都想到zend framework,研究过一段时间这个框架,感觉过于庞大了,至于剩下的cakePHP,thinkPHP,国内的FleaPHP都没有涉及过,第一个接触的正式PHP框架(正式是针对drupal来说)就是CodeIgniter了。

使用drupal2年多,已经身心疲惫。总是感觉还不是那么的灵活,性能还不是那么的好,总想对它控制得更多,但我们能做的只有hook。不可否认,drupal在快速搭建一些中小型站点确实是不错的选择,模块很多,社区很活跃,但是如果用来开发一些大型的应用就显得力不从心了,比如我们开发一个万人活跃用户的SNS社区,一个多应用服务器架构的系统。drupal本身是面向过程的PHP通过HOOK机制组织起来的,这时我们就迫切需要一款MVC的面向对象设计的框架。codeigniter正是如此。

比较喜欢CI(codeigniter的简称)的一些设计理念,第一个就是从不强迫用户,CI为开发者提供了很多功能(helper,plugin,library等等),方便开发者,但它不强迫你使用这些功能,你完全可以自定义开发自己的功能模块,甚至可以很方便的集成第三方工具进来,不像drupal,你必须对drupal机制要很了解,才能做一些比较深入的工作。另外,CI的定制性很高,你可以参考CI的文档对其任意定制,足以迷惑用户是不是CI开发出来的站点。

网上有一个老外做的视频,20分钟用CI搭建一个blog系统,虽说有些夸张,但功能也太简陋了,不管是安全性还是UE都没有考虑太多,我做过一个测试,3-4个小时开发出来一套多用户blog系统是完全可行的。

此外,CI为我们提供了很多类库,涵盖的功能如下:

  • 文件下载
  • 邮件发送,可包含附件
  • 表单
  • FTP
  • 分页

。。。

CodeIgniter,值得学习。