Bun Wong's Blog

专注于 Web 应用程序开发

PHP

标题中文转换成英文文件名

2010/08/05 •

因为要考虑到 SEO,今天按需求给项目写了个简单的函数,把文章标题和商品标题转换成英文文件名,

转换规则是:

中文中文 => Zhong-Wen-Zhong-Wen
中文chinese => Zhong-Wen-Chinese
chinese chinese => Chinese-Chinese

Drupal Taxonpage Module(6.x-0.3)

2010/04/28 •

伟大的分类学,被引入到 Drupal CMS 中,Everything is NODE,Every attribute is TERM 是很重要的 Drupal 思想,这与以往我们先有分类后有内容的概念不同,而这种低耦合的结构往往让处理内容来得更简单高效。

正因为 Drupal 中 Everything is NODE 思想,那么我们的页面生成,固然可以作为一个 Node,Drupal 默认包含的 Page 类型,是非开发人员最快捷的创建页面的方法;而对于开发人员则可以开发一个模块实现 hook_menu() 来生成页面。在项目中,页面的实现通常都是不负责开发的运营人员完成的,考虑到页面内容的维护难度,我们根据分类学,开发出这个名为 Taxonpage (Taxonomic page) 的模块,其大致功能是通过分类词来实现一个页面或者页面上的一个元素,并且负责渲染出该元素及内部的关联的 Node。

安装 Taxonpage 模块会产生一个名为 Page Elements 的词汇表,里面的每个分类词都对应一个页面上的元素,每个元素是可多继承的 (即非单根结构),这样可以直观看出页面的结构。

Taxonpage terms

每个元素,都必须设定一个渲染标识 (THEME NAME),用户可根据该标识定义模板,并递归产生其优先模板顺序,多继承和渲染标识特性可很好地解决模板重用的问题。当元素为根元素时,系统会自动根据其 PATH 值创建对应的 URL 页面,并且递归渲染其子元素。

Taxonpage settings

6.x-0.3 版本增加了页面元素的导入和导出功能,如下图。

Taxonpage Export/Import

如有任何问题或建议,可随时与本人交流 :)

Taxonpage 下载:taxonpage-6.x-0.3.zip

Drupal Debugger Module

2010/03/31 •

平时我们做调试信息输出,最常用的就是 var_dump,而在项目上线后,经常由于忘记删除 debug 信息而被客户提交致命缺陷……也有时 debug 页面并非可见的,如远程接口调试、后台运行的调试等,这也是 Debugger Module 要开发的原因 :)

Debugger  settings

Debugger 可设置日志输出类型,包括:不输出,输出到浏览器,输出到 Watchdog,输出到文件。

Debugger 下载:debugger-6.x-0.1.zip

Drupal 下 files 为符号连接目录的 imagecache 异常

2010/02/03 •

Drupal 可调用 file_create_path($source) 来返回 $source 的真实存在路径,而 file_create_path 函数内部是通过调用 file_check_location($source, $directory) 来检查 $source 是否存在于 $directory 内的,这里的 $directory 是 file_directory_path(),也就是我们熟悉的 sites/defailt/files 目录...

Drupal 渲染注册流程剖析

2009/12/19 •

昨天晚上遇到一个很纠结的问题,是关于 Drupal Theme 的 Template 文件路径问题。原则上只要 Theme 主题目录下存在同名的 tpl.php 的话,Drupal 将不再使用 Module 目录下的默认模板,出现的问题则不同,Drupal 找不到 Theme 目录下的文件而总是用原默认模板...

PHP MVC & BPF

2009/09/01 •

好久没有写技术文章,上段时间的工作比较忙,公司的需求分析快出来了,Brian 的合作项目 Deadline 一日一日逼近,压力啊压力啊...

又听到 PHPChina 的人在吵架了,CodeIgniter / Kohana, Yii, QeePHP / FleaPHP,到底谁是牛谁是猪,有必要争出个结果么,你自己想用啥就用啥,这才是 Open Source 的真谛啊,难怪 NINNY 姐这么无视那群家伙...

个人就 PHP MVC 框架而言,觉得兼容/功能跟性能总是成很大的反比...

关于 max/min 函数的运算规则

2009/08/05 •

今天群里又有人提问 min() 的用法,本以为很理解,就是求出一个集合之中的最小值,比如我们常用的对一个数组或者对一堆数值中调用 min()

min(array(3, 2, 1, 0));
min(3, 4, 5, 6);

因为要比较的值的类型都相同,运算结果也显然易见。而如下这种比较的值中存在不同类型的,的确比较少用

min(1, 1.1, 'a1', '1.1');

名字成分分析的小玩意

2009/08/04 •

昨天找一些 SNS 的案例,无意中回到一年多前曾留意过的 Geekaa.com,里面那个名字成分分析挺有意思的,它可以根据输入的名字 (里面是用帐户名) 来计算出你的成分,就类似人家街上算命卜卦的老先生一样,当然跟人家那样引经据典的忽悠你不同,也很无厘头,但相信还是一个很有趣的点子吧...

PHP 5.3.0 非官方升级手记

2009/07/13 •

上周五无聊下载来一个 PHP 5.3.0,尽管对这个 non-unicode 的 PHP 6 来说兴趣不大,只是作为一个 PHP FANS 和 DEVELOPER,不得不随时留意着 Zend 的动态,而最近 Zend Studio 7.0 也发布了,官方邮件说是支持 PHP 5.3 的语法,支持 Zend Framework 1.8,同样也是基于最新版本的 Eclipse 这样一个 IDE。我没去下载,毕竟不是免费的东东,而我一如既往支持我至爱的 PDT。

...

PHP 的 callback 类型

2009/06/01 •

在前一篇文章 深入 Drupal 引导流程 (3) - session_set_save_handler中,提及到一种 callback 类型,在 PHP 原生类型里面并没有一种类型叫做 callback,按照官方文档的说法,callback 仅仅是在文档里面提及到的虚构类型 (伪类型)。callback 就是回调的意思,顾名思义它常被以参数的方式传递给其他函数,让别人来调用自己。PHP 的 callback 可以包括全局函数和类方法。

...

深入 Drupal 引导流程 (3) - session_set_save_handler

2009/05/26 •

接下来是 Drupal 的会话阶段,Drupal 是采用 PHP 内置的会话机制,但是它重载了 PHP 内置的会话处理器 (PHP 内建处理是把会话保存为文件方式的),把会话数据保存在数据库内。

case DRUPAL_BOOTSTRAP_SESSION:
  require_once variable_get('session_inc', './includes/session.inc');
  session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy_sid', 'sess_gc');
  session_start();
  break;

...

深入 Drupal 引导流程 (2)

2009/05/20 •

这段时间一直在研究 Drupal 的源代码,哈哈,少时间来更新 Blog,今天我们再续 Drupal 的引导流程

case DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE:
  // Allow specifying special cache handlers in settings.php, like
  // using memcached or files for storing cache information.
  require_once variable_get('cache_inc', './includes/cache.inc');
  // If the page_cache_fastpath is set to TRUE in settings.php and
  // page_cache_fastpath (implemented in the special implementation of
  // cache.inc) printed the page and indicated this with a returned TRUE
  // then we are done.
  if (variable_get('page_cache_fastpath', FALSE) && page_cache_fastpath()) {
    exit;
  }
  break;

早期页面缓存阶段...

深入 Drupal 引导流程 (1)

2009/05/11 •

对于每个请求,Drupal 通过一系列的引导指令阶段来引导它自己。这些阶段在 bootstrap.inc 中定义

/**
* First bootstrap phase: initialize configuration.
*/
define('DRUPAL_BOOTSTRAP_CONFIGURATION', 0);
...

SPL autoload 初体验

2009/05/07 •

昨天终于把项目的东西赶了出来,有点累,但是满有成就感,哈…… Drupal 看了两周,算是对 HOOK 部分有了个大概了解,不得不感慨下老外的设计思想确实很值得我们去学习,为啥国人就做不出一个像样点的 CMS 来呢?!或者准确点来说 Drupal 压根不能归类于 CMS 吧,很建议大家去研究下,前段时间我就吐血推荐给标老大去玩玩,算是对开源界做点贡献,哈哈 :)

...

Drupal 生成缩略图功能

2009/04/25 •

提到 Drupal 生成缩略图,或者你第一次时间想到的会是 Image Module,但本文说的是并不是一些第三方的工具包。其实,尽管说 Drupal 内核的图片处理能力不算强,但对于生成缩略图的小功能还是应付有余,大家可以看看 Drupal 图片处理核心文件 includes/image.inc的说明。

Drupal 内置的缩略图方法有 4 种:resize, scale, crop, scale & crop,总有一款适合你 :)

...

Drupal 外部身份验证模组开发

2009/04/22 •

最近公司的项目是使用 Drupal 为基础的二次开发,估计最近几个月都以这个方向为主,作为 Drupal 的新手,现在也只能一边埋头看文档一边写些 Example 了。上头给了一个小需求,是把 Drupal 的登录模块修改成可以使用自己的验证方式和默认 Druapl 验证方式的切换。

Google 出来的结果很多都是 for Drupal 5.x 的,大家要注意啦, Drupal 6.x 和 5.x 的 HOOK 函数和参数表有很大的差别,所以建议大家多看看 Drupal API手册。后来绕了一大圈发现 Drupal 6.x 的默认模组 (modules) 里面,有一个叫 OpenId 的模组可以实现这个功能。当然,我们的外部身份验证需求通常不唯一的,比如可能是 Discuz! 论坛或者你当前站点的身份验证,制定一个外部身份验证模组正是我们今天的题目解决的问题。

...

几个 PHP 5.2 函数的旧版替代方法

2009/04/20 •

由于 Blog 虚拟主机的 PHP 版本是 5.1.6,因此有某些 PHP 5.2.0 才开始支持的函数或者常量还不能使用,这里放上改写的一些替代的方法

  • pathinfo

    pathinfo 的第二个参数可以传入常量来直接返回某部分的内容,包括 PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION, PATHINFO_FILENAME,其中 PATHINFO_FILENAME 用于返回文件名的正名 (就是除了扩展名的部分),在 PHP 5.2.0 才开始加上的,我们可以用一个简单的字符串处理方法来获取这个值

    ...

CodeIgniter Upload Fixing —— 上传任何文件类型

2009/03/25 •

昨天下班前遇到了一个很抓狂的东西,本来以为很快搞定的。我用 CodeIgniter Upload Library 上传一些文件,但是我不需要限制这些文件是否符合指定格式(因为这个是管理员后台,都是自己人上传),按照 CodeIgniter 官方文档的说法,allowed_types 的设置默认是 None 的,当时认为是不去设置 allowed_types 就会接受上传所有类型的文件了,谁知令人烦躁的是居然不设置这个就上传不了文件,把它换成 jpg|png|gif 就好了,但是又只能上传图片类型文件。

今天实在受不了,打开 CodeIgniter 的代码( system/libraries/Upload.php ),用 xdebug 跟踪,到 Line202

// Is the file type allowed to be uploaded?
if ( ! $this->is_allowed_filetype())
{
    $this->set_error('upload_invalid_filetype');
    return FALSE;
}

...

CodeIgniter 访问 $_GET

2009/03/12 •

在开启了 rewrite 的情况下,CI 会 unset 掉 $_GET 超级全局变量,在 config.php 里面,我们可以看到2个关键的设置

/*
|--------------------------------------------------------------------------
| URI PROTOCOL
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string. The default setting of "AUTO" works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'AUTO' Default - auto detects
| 'PATH_INFO' Uses the PATH_INFO
| 'QUERY_STRING' Uses the QUERY_STRING
| 'REQUEST_URI' Uses the REQUEST_URI
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
|
*/

$config['uri_protocol'] = "AUTO";

$config['enable_query_strings'] = FALSE;

...

开发服务器配置笔记 (Apache PHP MySQL SVN Trac)

2009/03/10 •

最近为新公司部署了一台内网的开发用服务器,主要配置了 Apache + PHP + MySQL,SVN 版本控制,Trac 项目管理,这里炒冷饭写一下…

  1. Apache

    官方下载 源代码,先安装 apr 和 apr-util

    cd srclib
    cd apr
    ./configure --prefix=/usr
    make
    make install

    ...

隐藏 Apache & PHP 的版本号

2009/02/24 •

有朋友问起,如何隐藏 HTTP header 中发送包含在 Server 信息里面的 Apache 和 PHP 版本号(譬如我们可以到 Firefox 的附加工具里面找 Live HTTP Headers),下面是做法:

Apache:
开启 httpd.con...

RGB 判别浅颜色 (Light Color)

2009/02/12 •

P4 Team 终于接到了 Elance.com 上的第一个活,恭喜下,对于这个 Project,团队里自然很重视。今天,Milestone1 里有一个关于 GD 库生成文字的 bug 需要 fix,大意是当用户选择浅颜色的时候给文字加一个边框,原因背景色是白色。

经大家讨论第一个方案,是把 RGB 的值求和,然后取一个值,当和大于等于此值就...

Magic Methods of PHP (2)

2009/02/09 •

关于 Constructors and Destructors

个人觉得构造函数和析构函数没有啥特别值得说的,都是一些容易遗漏的地方:

  • 子类的构造/析构函数默认不会调用父类的,需要显式地调用 parent::__construc...

Magic Methods of PHP (1)

2009/02/05 •

今天看了一下关于 PHP 的类内魔术函数,发现以前有不少地方是没有注意到的,算是系统地补习一下:

关于 Overloading

以前忽略了 inaccessible members 和 inaccessible methods,以...

无聊写的一个 CAPTCHA

2008/12/22 •

今天中午无聊了点,突发奇想写下了这个 Captcha 程序,或者网上已经有前辈写过,就当是练练手,加入 F2E 后我都很少写 PHP 了 :'(

Captcha

演示地址已死,源代码已死,心痛中…

技术交流会的演讲稿子: About PHP

2008/12/19 •

这周是“大烂鱼”小组的技术交流周,作为新加入的一分子(现在不知道是不是该叫“大笨烂鱼”了?),我理所当然也该选一个题目来进行讲述下。

毕竟新来还不久,对 F2E 同事们的技术底子还不是很了解,如果探讨前端的技术,就 HTML CSS JavaScript 一类,不用说的大家都是这方面的高手了...

Google Analytics

最近一个月访问数:544