Cakephp 笔记

1. 自定义 layout
在 cakephp 中 layout 默认指向 /app/views/layouts/default.thtml
如果要自定义 layout,需要在 controller 中定义:
var $layout = 'mydefault';
layout 则指向了 /app/views/layouts/mydefault.thtml
2. 创建不使用数据库表的 model 或者改变 model 对应的表名
我需要创建一个不使用任何表的model。例如,我想通过 $validate 数组方便底验证输入数据,保持model逻辑的正确性。但创建 model 时对应的表不存在,CakePHP 就会报错。通过在 model 中加入以下代码可以解决这个问题:
var $useTable = false;
你也可以通过这种方法改变model对应的表名。
var $useTable = 'some_table';
3. 快速创建后台管理
如果你需要创建后台管理程序,并且希望所有管理action都位于某个特定文件夹下,那么打开 config/core.php 并将下面这一行的注释去掉:
define('CAKE_ADMIN', 'admin');
这样所有以"admin_"开头的action都可以通过 /admin/yourcontroller/youraction 来访问。例如,如果在 posts controller 中创建了名为 "admin_add" 的 action,那么可以通过 www.example.com/admin/posts/add 访问这个action。这样就可以方便地为 admin 目录设置密码以避免他人随意访问。
4. 自定义404页面
如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。
5. 让controller使用其他model
如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:
class yourController extends [...]


Cakephp 的回调函数

Model的Callbacks
我们在model中增加了一些回调函数以帮助你在model操作前后能够织入一些业务逻辑(原文为sneak in,借用了AOP中的织入一词,因为从操作来看这些回调函数等同于AOP中的advice)。为了获得这样的能力,需要使用model中的一些参数并且在你的model中覆写这些方法。
beforeFind(string $conditions)
beforeFind()回调函数是在model的find方法执行前的前置操作。你可以加入任何检索前的业务逻辑。你覆写该方法只要保证在前置操作成功后返回true来执行真正的find方法,返回false中断find方法就可以了。(译注:在一些复杂场景中,需多次持久化的情况下请慎用)。
afterFind(array $results)
使用afterFind回调函数能够更改find方法的返回结果集,或者在检索动作完成后加上一些业务逻辑。该函数的参数$results为经过回调函数处理以后的find检索结果集。
beforeValidate()
beforeValidate回调函数能够在model校验数据之前更改model中的一些数据。同样也可以用来在model校验之前加入更为复杂的额外校验规则。和beforeFind一样,必须保证返回true来调用真正的操作,返回false来中断校验乃至save操作。
beforeSave()
和先前介绍的回调函数类似,在校验完成之后,保存动作之前加入额外的处理(如果校验失败是不会触发该回调函数的)。返回true或者false,不再赘述。
一个比较常见的beforeSave的应用场景就是在保存动作之前格式化日期属性以适应不同的数据库:
// Date/time fields created by HTML Helper: // This code would be seen in a view  $html->dayOptionTag('Event/start'); $html->monthOptionTag('Event/start'); $html->yearOptionTag('Event/start'); $html->hourOptionTag('Event/start'); $html->minuteOptionTag('Event/start');   /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/  // Model callback functions used to stitch date // data together for storage // This code would be seen in the Event model:  function beforeSave() {     $this->data['Event']['start'] = [...]


Zend 框架摘要

From: http://www.ibm.com/developerworks/cn/opensource/top-projects/php-resources.html#zend
Zend 框架组件包括:
Zend_Controller
此模块为应用程序提供全面的控制。它将请求转化为特定的行为并确保其执行。
Zend_Db
此模块基于 PHP 数据对象 (PDO) 并提供一种通用方式来访问数据库。
Zend_Feed
此模块使使用 RSS 和 Atom 提要变得简单。
Zend_Filter
此模块提供字符串过滤函数,如 isEmail() 和 getAlpha()。
Zend_InputFilter
对于 Zend_Filter,此模块是用来操作数组的,如表单输入。
Zend_HttpClient
此模块使您能轻易地执行 HTTP 请求。
Zend_Json
此模块使您能够轻易地将 PHP 对象转换成 JavaScript 对象符号,反之亦然。
Zend_Log
此模块提供通用日志功能。
Zend_Mail
此模块使您能够发送文本文件和多部分 MIME 电子邮件。
Zend_Mime
此模块被 Zend_Mail 用来解码 MIME 消息。
Zend_Pdf
此模块用来创建新的 PDF 文档,及加载和编辑现有文档。
Zend_Search
此模块使您能在现有文本上执行复杂搜索。例如,您可以建立一个搜索引擎,该引擎可以基于相关性或其他因素返回结果。
Zend_Service_Amazon、Zend_Service_Flickr 以及 Zend_Service_Yahoo
这些模块提供对这些 Web 服务 API 的简单访问。
Zend_View
此模块处理 MVC 模式的 “视图” 部分。
Zend_XmlRpc
此模块使您能够轻易地创建 XML-RPC 客户机。(已为将来计划好服务器功能。)
编码准则
当您为 Zend 框架编码,或使用其编码时,您应该遵循特定的准则。这些准则是为了使团队项目变得更加简单而设计的。换句话说,通过定义编码规范,您不仅能避免接下来的问题,而且能够使其他人更容易阅读您的代码。Zend 框架文档中包含几页指导准则,比如:
* 确保文件整洁。换句话说,在文件头、标准的四格缩进等前面不能有任何前导或者后置的空格,这些空格会调用 Web 服务器导致意外地发送内容。
* [...]


生成随机汉字字符串 (UTF8)

<?php$outputstr = getRandNumChineseString();echo $outputstr;function getChineseCharacter(){$unidec = rand(19968, 40869);$unichr = '&#' . $unidec . ';';$zhcnchr = mb_convert_encoding($unichr, "UTF-8", "HTML-ENTITIES");return $zhcnchr;}function getRandNumChineseString(){$num = rand(1,16);$str = null;for($i=0;$i<$num;$i++){$str = $str . getChineseCharacter();}return $str;}?>
PHP 需要开启 mbstring 支持
附: 汉字Unicode编码表

Tags: php, 字符串, 汉字


CakePHP 命名规则

第1节 规则,嗯 ?
没错,规则。根据thefreedictionary:
1. 一般约定或者对特定的实践或态度的认可:根据规则,北方一直在地图的最上方。
2. 在一个组里,一个广泛遵守的实践或和过程,特别能促进社会交互;一种习惯:握手的规则。
3. 一种广泛被使用或被接受的设备或者技术,例如在小说,文学或者绘画里:旁白的戏剧规则。
Cake的规则会变魔法,称之为自动魔法。Cake让你的生产率提高到一个令你害怕的水平,但又不失灵活性。Cake的规则确实非常简单,而且直观。他们是从最佳实践里提炼出来的,而这些最佳实践是web开发人员在web开发领域里多年使用的实践。
第2节 文件名
文件名带有下划线。作为一般规则,如果你有一个MyNiftyClass类,那么在Cake里,它的文件应该命名为my_nifty_class.php。因此如果你找到一个小片段,你会自动知道:
1. 如果它是一个命名为KissesAndHugsController的Controller,那么它的文件名必须为kisses_and_hugs_controller.php(注意文件名中的_controller)。
2. 如果它是一个名为OptionValue的Model,那么它的文件名必须为option_value.php.
3. 如果它是一个名为MyHandyComponent的组件,那么它的文件名必须为my_handy.php(在文件名里不需要_component)
4. 如果它是一个名为BestHelperEver的Helper,那么它的文件名必须为best_heler_ever.php.
第3节 Model
1. Model的类名是单数。
2. Model类名中,单个单词的model为大写,多个单词的model是大写的骆驼峰。
实例: Person, Monkey, GlassDoor, LineItem, ReallyNiftyThing
3. 多对多的join表应该命名为: 按字母排列的第一个表的复数_按字母排列的第二个表的复数.例如: tags_users
4. Model文件名使用一个小写的带有下划线的语法。
实例: person.php, monkey.php, glass_door.php, line_item.php, really_nifty_thing.php
5. 与model相关联的表也使用小写的带有下划线的语法,但是他们是复数的。
实例: people, monkeys, glass_doors, line_items, really_nifty_things
CakePHP的命名规则意味着流线型的代码创建,并且让代码更加具有可读性。如果你想他遵循你的方式,你可以覆写它。
1. Model名:在你的Model定义里设置$name变量.
2. 与Model相关的数据库名:在你的Model定义里设置$useTable变量.
第4节 Controller
1. Controller名为复数。
2. 对于单个词的controller,类名为大写,多个词的为大写的骆驼峰。而且Controller类名以'Controller'结尾。
实例: PeopleController, MonkeysController, GlassDoorsController, LineItemsController, ReallyNiftyThingsController
3. Controller文件名采用小写的带有下划线的语法。Controller文件名也以'_controller'结尾,因此如果你有一个名为 PostsController的Controller,其文件名应该为posts_controller.php.
实例: people_controller.php, monkeys_controller.php, glass_doors_controller.php, line_items_controller.php, really_nifty_things_controller.php
4. 对于保护成员的可见性,controller动作名应该预加一个'-'.
5. 对于私有成员的可见性,controller动作名应该预加一个'--'.
第5节 View
1. view在他们显示的动作后命名。
2. [...]


xdebug的安装

xdebug是一个开源的php调试器,以php模块的形式加载并被使用。
windows 平台下:
一、安装xdebug模块
1、去www.xdebug.org下载相应版本php的模块文件,保存下载后的文件到php的ext目录,可以自己修改文件的名称,现在最新的版本是 2.0.1。
2、修改php.ini,增加如下信息
[Xdebug]
zend_extension_ts="d:/php/ext/xdebug-xxx.dll"
xdebug.auto_trace=on
xdebug.collect_params=on
xdebug.collect_return=on
xdebug.trace_output_dir="d:\Temp\xdebug"
xdebug.profiler_enable=on
xdebug.profiler_output_dir="d:\Temp\xdebug"
参数解释:
zend_extension_ts="d:/php/ext/xdebug-xxx.dll"
加载xdebug模块。这里不能用extension=xdebug-xxx.dll的方式加载,必须要以zend的方式加载,否则安装上后, phpinfo打印出来的里的xdebug段的会有XDEBUG NOT LOADED AS ZEND EXTENSION的警告信息。
xdebug.auto_trace=on
自动打开“监测函数调用过程”的功模。该功能可以在你指定的目录中将函数调用的监测信息以文件的形式输出。此配置项的默认值为off。
xdebug.collect_params=on
打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。此配置项的默认值为off。
xdebug.collect_return=on
打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。此配置项的默认值为off。
xdebug.trace_output_dir="d:\Temp\xdebug"
设定函数调用监测信息的输出文件的路径。
[...]