cakephp常见知识点汇总(3)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/caf4eff6458c4c00d9339c32475f046a.html