我需要创建一个不使用任何表的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" %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。