标题中文转换成英文文件名
2010/08/05 •因为要考虑到 SEO,今天按需求给项目写了个简单的函数,把文章标题和商品标题转换成英文文件名,
转换规则是:
中文中文 => Zhong-Wen-Zhong-Wen
中文chinese => Zhong-Wen-Chinese
chinese chinese => Chinese-Chinese
因为要考虑到 SEO,今天按需求给项目写了个简单的函数,把文章标题和商品标题转换成英文文件名,
转换规则是:
中文中文 => Zhong-Wen-Zhong-Wen
中文chinese => Zhong-Wen-Chinese
chinese chinese => Chinese-Chinese
伟大的分类学,被引入到 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 的词汇表,里面的每个分类词都对应一个页面上的元素,每个元素是可多继承的 (即非单根结构),这样可以直观看出页面的结构。

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

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

如有任何问题或建议,可随时与本人交流 :)
Taxonpage 下载:taxonpage-6.x-0.3.zip
平时我们做调试信息输出,最常用的就是 var_dump,而在项目上线后,经常由于忘记删除 debug 信息而被客户提交致命缺陷……也有时 debug 页面并非可见的,如远程接口调试、后台运行的调试等,这也是 Debugger Module 要开发的原因 :)

Debugger 可设置日志输出类型,包括:不输出,输出到浏览器,输出到 Watchdog,输出到文件。
Debugger 下载:debugger-6.x-0.1.zip
Drupal 可调用 file_create_path($source) 来返回 $source 的真实存在路径,而 file_create_path 函数内部是通过调用 file_check_location($source, $directory) 来检查 $source 是否存在于 $directory 内的,这里的 $directory 是 file_directory_path(),也就是我们熟悉的 sites/defailt/files 目录...
昨天晚上遇到一个很纠结的问题,是关于 Drupal Theme 的 Template 文件路径问题。原则上只要 Theme 主题目录下存在同名的 tpl.php 的话,Drupal 将不再使用 Module 目录下的默认模板,出现的问题则不同,Drupal 找不到 Theme 目录下的文件而总是用原默认模板...
好久没有写技术文章,上段时间的工作比较忙,公司的需求分析快出来了,Brian 的合作项目 Deadline 一日一日逼近,压力啊压力啊...
又听到 PHPChina 的人在吵架了,CodeIgniter / Kohana, Yii, QeePHP / FleaPHP,到底谁是牛谁是猪,有必要争出个结果么,你自己想用啥就用啥,这才是 Open Source 的真谛啊,难怪 NINNY 姐这么无视那群家伙...
个人就 PHP MVC 框架而言,觉得兼容/功能跟性能总是成很大的反比...
今天群里又有人提问 min() 的用法,本以为很理解,就是求出一个集合之中的最小值,比如我们常用的对一个数组或者对一堆数值中调用 min()
min(array(3, 2, 1, 0));
min(3, 4, 5, 6);
因为要比较的值的类型都相同,运算结果也显然易见。而如下这种比较的值中存在不同类型的,的确比较少用
min(1, 1.1, 'a1', '1.1');
昨天找一些 SNS 的案例,无意中回到一年多前曾留意过的 Geekaa.com,里面那个名字成分分析挺有意思的,它可以根据输入的名字 (里面是用帐户名) 来计算出你的成分,就类似人家街上算命卜卦的老先生一样,当然跟人家那样引经据典的忽悠你不同,也很无厘头,但相信还是一个很有趣的点子吧...
上周五无聊下载来一个 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。
...

在前一篇文章 深入 Drupal 引导流程 (3) - session_set_save_handler中,提及到一种 callback 类型,在 PHP 原生类型里面并没有一种类型叫做 callback,按照官方文档的说法,callback 仅仅是在文档里面提及到的虚构类型 (伪类型)。callback 就是回调的意思,顾名思义它常被以参数的方式传递给其他函数,让别人来调用自己。PHP 的 callback 可以包括全局函数和类方法。
...
接下来是 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 的源代码,哈哈,少时间来更新 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 通过一系列的引导指令阶段来引导它自己。这些阶段在 bootstrap.inc 中定义
/**
* First bootstrap phase: initialize configuration.
*/
define('DRUPAL_BOOTSTRAP_CONFIGURATION', 0);
...
昨天终于把项目的东西赶了出来,有点累,但是满有成就感,哈…… Drupal 看了两周,算是对 HOOK 部分有了个大概了解,不得不感慨下老外的设计思想确实很值得我们去学习,为啥国人就做不出一个像样点的 CMS 来呢?!或者准确点来说 Drupal 压根不能归类于 CMS 吧,很建议大家去研究下,前段时间我就吐血推荐给标老大去玩玩,算是对开源界做点贡献,哈哈 :)
...
提到 Drupal 生成缩略图,或者你第一次时间想到的会是 Image Module,但本文说的是并不是一些第三方的工具包。其实,尽管说 Drupal 内核的图片处理能力不算强,但对于生成缩略图的小功能还是应付有余,大家可以看看 Drupal 图片处理核心文件 includes/image.inc的说明。
Drupal 内置的缩略图方法有 4 种:resize, scale, crop, scale & crop,总有一款适合你 :)
...

最近公司的项目是使用 Drupal 为基础的二次开发,估计最近几个月都以这个方向为主,作为 Drupal 的新手,现在也只能一边埋头看文档一边写些 Example 了。上头给了一个小需求,是把 Drupal 的登录模块修改成可以使用自己的验证方式和默认 Druapl 验证方式的切换。
Google 出来的结果很多都是 for Drupal 5.x 的,大家要注意啦, Drupal 6.x 和 5.x 的 HOOK 函数和参数表有很大的差别,所以建议大家多看看 Drupal API手册。后来绕了一大圈发现 Drupal 6.x 的默认模组 (modules) 里面,有一个叫 OpenId 的模组可以实现这个功能。当然,我们的外部身份验证需求通常不唯一的,比如可能是 Discuz! 论坛或者你当前站点的身份验证,制定一个外部身份验证模组正是我们今天的题目解决的问题。
...

由于 Blog 虚拟主机的 PHP 版本是 5.1.6,因此有某些 PHP 5.2.0 才开始支持的函数或者常量还不能使用,这里放上改写的一些替代的方法
pathinfo 的第二个参数可以传入常量来直接返回某部分的内容,包括 PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION, PATHINFO_FILENAME,其中 PATHINFO_FILENAME 用于返回文件名的正名 (就是除了扩展名的部分),在 PHP 5.2.0 才开始加上的,我们可以用一个简单的字符串处理方法来获取这个值
...
昨天下班前遇到了一个很抓狂的东西,本来以为很快搞定的。我用 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;
}
...
在开启了 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 项目管理,这里炒冷饭写一下…
从 官方下载 源代码,先安装 apr 和 apr-util
cd srclib
cd apr
./configure --prefix=/usr
make
make install
...
有朋友问起,如何隐藏 HTTP header 中发送包含在 Server 信息里面的 Apache 和 PHP 版本号(譬如我们可以到 Firefox 的附加工具里面找 Live HTTP Headers),下面是做法:
Apache:
开启 httpd.con...
P4 Team 终于接到了 Elance.com 上的第一个活,恭喜下,对于这个 Project,团队里自然很重视。今天,Milestone1 里有一个关于 GD 库生成文字的 bug 需要 fix,大意是当用户选择浅颜色的时候给文字加一个边框,原因背景色是白色。
经大家讨论第一个方案,是把 RGB 的值求和,然后取一个值,当和大于等于此值就...
个人觉得构造函数和析构函数没有啥特别值得说的,都是一些容易遗漏的地方:
今天看了一下关于 PHP 的类内魔术函数,发现以前有不少地方是没有注意到的,算是系统地补习一下:
以前忽略了 inaccessible members 和 inaccessible methods,以...
今天中午无聊了点,突发奇想写下了这个 Captcha 程序,或者网上已经有前辈写过,就当是练练手,加入 F2E 后我都很少写 PHP 了 :'(

演示地址已死,源代码已死,心痛中…
这周是“大烂鱼”小组的技术交流周,作为新加入的一分子(现在不知道是不是该叫“大笨烂鱼”了?),我理所当然也该选一个题目来进行讲述下。
毕竟新来还不久,对 F2E 同事们的技术底子还不是很了解,如果探讨前端的技术,就 HTML CSS JavaScript 一类,不用说的大家都是这方面的高手了...


最近一个月访问数:544