21条CakePHP编程技巧

快速建立静态页面php

我想创建几个页面,它们仅包含静态数据,使用默认layout,不须要任何model。 最初我试图建立一个controller并为每一个静态页面定义一个action。 但这种方法很笨拙,也不适合快速建立静态页面。
 
实际上只要使用pages controller就能够作到——只要在 views/pages 文件夹下建立一个 view,就能够经过 /pages 来访问。例如,我建立了 /views/pages/matt.thtml , 就能够经过 http://www.example.com/pages/matt来访问。
 
改变静态页面的标题html

使用pages controller时若是想改变页面标题,只需在view中加入如下代码:
 <? $this->pageTitle = 'Title of your page.'; ?>
在静态页面中向layout发送数据正则表达式

若是须要向layout传递数据(例如表示导航栏中哪一个部分应该高亮显示的变量), 能够在view中添加下面的代码:
 <? $this->_viewVars['somedata'] = array('some','data'); ?>
这个数组就能够在layout中经过$somedata来访问。
 
快速建立后台管理数据库

若是你须要建立后台管理程序,而且但愿全部管理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目录设置密码以免他人随意访问。
 
查看后台执行的SQL语句apache

只需改变config/core.php中的DEBUG常量,便可看到后台执行的SQL语句。 0为产品级,1为开发级,2为完整调试SQL,3为完整调试SQL并显示对象数据。 我一般将DEBUG设置为2,这样每页的底部会显示出一个包含SQL调试信息的表格。
 
若是页面底部添加的表格会破坏页面布局(特别是使用Ajax获取页面并显示到页面中间而不是底部时), 你能够在CSS中添加如下代码以隐藏调试信息:
 #cakeSqlLog { display: none; }
这样既能保持页面布局,又能够经过查看源代码来看到调试信息。 固然最后发布网站时别忘了将调试级别改回0。
 
获取丰富的开发文档数组

别老是盯着手册。wiki和API也是无价之宝。wiki中的开发指南十分有用,而API文档初看起来比较难, 但你很快就会发现这里的信息对你建立CakePHP网站十分重要。`
 
使用bake.php安全

Bake是个命令行PHP脚本,能够根据数据库自动生成model、controller和view。 在开发的最初阶段,我强烈推荐使用scaffolding让你的原型程序跑起来。 但若是你清楚地知道scaffolding不合适,我推荐你使用bake。 bake会生成全部的文件并保存到磁盘上,以便你随意修改。 这样能节省建立关联、view、基本的CRUD crollder操做的重复工做。
 
(译者注:CRUD - Create, Read, Update, Delete,数据库应用的四种基本操做,即"增删查改"。)
 
bake很方便。你只需在数据库中创建一个表,而后到 /cake/scripts/ 目录下执行 php bake.php 便可。
 
若是你经过交互方式来运行bake,它会分几步提示你建立model、controller和view。 建立结束以后,我一般会阅读全部生成的代码并作必要的修改。
 
发布程序时注意权限服务器

有一次我在发布程序时,将整个cake目录打包而后用scp上传到了服务器上。 只要一关闭调试信息,就会出现错误——数据库调用没法返回任何数据。 我束手无策,由于我必须经过调试信息才能调试问题。 后来有人告诉我,/app/tmp应当对apache可写。将权限改成777以后问题就解决了。
 
复杂model验证app

我须要进行更复杂的验证,而不只仅是验证输入框非空或者符合某个正则表达式这样的简单验证。 例如,我要验证用户注册时使用的邮件地址是否已被使用。在wiki中我找到了这篇 关于高级验证的文章 , 其中提到了一些十分有用的高级验证方法。
 
记录错误日志
$this->log('Something broke');
这样能够将错误记录到 /tmp/logs/ 中(我最初觉得会记录到apache的错误日志中)。
 
让controller使用其余model编辑器

若是你的controller须要调用来自不一样model的数据,只要在controller开头使用以下代码:
 class yourController extends AppController {
  var $uses = array('Post','User');
}
这样controller就能访问Post和User model了。
 
建立不使用数据库表的model

我须要建立一个不使用任何表的model。例如,我想经过$validate数组方便底验证输入数据, 保持model逻辑的正确性。但建立model时对应的表不存在,CakePHP就会报错。 经过在model中加入如下代码能够解决这个问题:
 var $useTable = false;
你也能够经过这种方法改变model对应的表名。
 var $useTable = 'some_table';
重定向以后记得exit()

对于有经验的人来讲这应当是理所固然的事儿,调用 $this->redirect() 以后,剩下的代码若是不想运行 要exit()。我也这样作,但之前曾经认为 $this->redirect() 会为我调用exit(实际上不会)。
 
高级model函数

翻翻API就能发现不少你不知道的很是有用的函数。 我强烈推荐至少阅读一遍 Model 类的参考手册 。 下面是之前我没注意到的几个重要函数:
 •generateList()- 主要用于生成选择框(<SELECT>)所需的数据
 •query()- 本身写SQL语句来查询
 •findCount()- 返回知足指定条件的行数
 •hasAny()- 当有记录知足条件时返回真
 
再次强烈推荐阅读整个model类参考 ,你会为你学到的东西赞叹的。
 
如何正确插入多行

我须要遍历一个列表,并将其中的每一个元素都插入到数据库中。 我发现若是在一次插入完成后当即进行下一次插入, 那么第二次插入的内容彻底不会被插入,而是会被更新到第一次插入的行中。 例如:
 $items = array('Item 1','Item 2','Item 3');
foreach ($items as $item) {
  $this->Post->save(array('Post' => array('title' => $item)));

这段代码将在posts表中插入仅一行:“Item 3”。 CakePHP首先插入“Item 1”,但立刻将其更新为“Item 2”, 再更新为“Item 3”,由于$this->Post->id保存的是上一次插入成功的行的id。 一般这个特性颇有用,但在这个例子中反而帮了倒忙。 其实只要在每次插入以后设置 $this->Post->id = false 就能够解决这个问题。
 
更新:有人发邮件告诉我,正确的作法是调用create()初始化model,再set/save新数据。
 
在controller函数以前或以后插入逻辑

假设你须要在controller渲染的每一个view中都设置一个颜色数组, 但你不但愿在每一个action中都定义它。能够经过 beforeRender() 回调函数来实现:
 function beforeRender() {
  $this->set('colors',array('red','blue','green');
}
这样该controller渲染的全部view均可以访问$colors变量。 beforeRender() 函数在controller逻辑结束后、view被渲染以前执行。一样, beforeFilter() 和afterFilter() 函数会在每一个controller action执行的先后执行。 更多信息请阅读手册的models一节 。
 
为CakePHP添加所见即所得编辑器

这里有一篇很是好的教程 教你如何在 CakePHP中使用TinyMCE。基本上你只需在页面上连接tiny_mce.js文件,而后添加一些初始化代码以设置 将哪一个textarea变成TinyMCE编辑器便可。
 
自定义HABTM关系的SQL语句

我曾试图在自定义的SQL语句上定义一个HABTM关系(has-and-belongs-to-many),却遇到了问题。 根据本文撰稿时的文档,应当先在本身的model中设置finderSql,但从CakePHP的源代码来看, 应该设置finderQuery 。这只是文档中的一个小问题,但指出问题却能为他人节约时间。 Trac ticket在这里 。
 
发送邮件

我在wiki中找到两篇教程:发送邮件 和 经过PHPMailer发送邮件 。 强烈推荐后者,经过PHPMailer发送邮件更安全,并且不须要本身处理邮件头,减小许多麻烦。
 
自定义Helper生成的HTML

我须要修改调用$html->selectTag()时生成的<option>,使其生成“请选择”选项来代替默认的空白选项。 我也但愿单选按钮能带有标签,这样用户就无需精确地点击单选按钮自己,而只需单击到关联的文字上便可。
 
创建 /app/config/tags.ini.php,而后添加如下的内容:
 ; Tag template for a input type='radio' tag.
radio = "<input type="radio" name="data[%s][%s]" id="%s" %s /><label for="%3$s">%s</label>"

; Tag template for an empty select option tag.
selectempty = "<option value="" %s>-- Please Select --</option>"
你能够从/cake/config/tags.ini.php中得到完整的标签列表。但我不建议修改该文件, 不然升级CakePHP时可能会让你的修改丢失。
 
自定义404页面

若是你须要自定义404页面,只需建立 /app/views/errors/error404.thtml。

相关文章
相关标签/搜索