作者:老王
最近,随着CakePHP 1.2.2.8120 Stable的发布,我又把这个框架捡起来复习了一下,下面记录两个知识点:
一:Form助手
在CakePHP里,Form助手可以说是所有助手里最重要的,也是最复杂的,其中,尤以input方法为甚,比如说文章属于一个目录,那么在录入文章的表单里我们可以这样生成一个目录的下拉菜单:
$form->input('category_id');
当然,仅仅这样还不够,还需要在控制器里提供数据才OK:
$this->set('categories', $this->Article->Category->find('list'));
总体来说非常简单,甚至有点奇幻的感觉,这是因为CakePHP在这里做了点小动作,参考form.php文件:
if (!isset($options['options']) && in_array($options['type'], $types)) {
$view =& ClassRegistry::getObject('view');
$varName = Inflector::variable(
Inflector::pluralize(preg_replace('/_id$/', '', $this->field()))
);
$varOptions = $view->getVar($varName);
if (is_array($varOptions)) {
if ($options['type'] !== 'radio') {
$options['type'] = 'select';
}
$options['options'] = $varOptions;
}
}
CakePHP会把表单元素名字中的_id部分去掉,并转换成复数形式,然后在当前视图变量里查找是否已经有了同名的变量,如果有,且未设置成radio单选标签,就把它当做select下拉菜单。
这里还有一个技巧,就是在渲染select的时候,如果原来的数据库表里有一个名为name或者title的字段,那么会自动被当做下拉菜单的显示部分。
详细介绍参考官方文档
二:saveAll方法
saveAll方法可以同时保存一对一,一对多的关系。比如说一个question有多个answer,那么在question的表单里,我们就可以这样设定:
echo $form->input('Question.title');
echo $form->input('Answer.0.content');
echo $form->input('Answer.1.content');
echo $form->input('Answer.2.content');
echo $form->input('Answer.3.content');
经过这样简单的设定后,在question控制器里就可以使用saveAll方法一次性保存所有的数据了:
详细介绍参考官方文档
这些知识总是记了忘,忘了记。还是古人说的好:学而时习之,不亦悦乎。