【发布时间】:2010-09-19 10:39:55
【问题描述】:
我正在开发书评应用程序,并且在创建书评时使用自动完成功能来搜索书名。评论模型有一个关联的 book_id 字段,并且关系设置为评论 hasOne book 和 book hasMany reviews。
我正在尝试传递 Book.id(到 book_id 字段),但我想显示 Book.name 供用户选择。使用默认设置(通过 CakePHP 的教程完成),我只能传递 Book.name。是否可以显示名称并传递id?
另外,我通过审查控制器的 create() 操作中的以下代码传递它:
$this->data['Review']['book_id'] = $this->data['Book']['id'];
这是在 CakePHP 中正确的做法吗?我知道在 Ruby on Rails 中它是自动的,但我似乎无法让它在 CakePHP 中自动运行。最后,我没有使用生成器,因为它在我的共享托管环境中不可用......所以如果这是错误的方式,除了我的模型中的关联之外,我还需要什么来使其自动发生?
感谢您的帮助,我保证这是我一段时间内的问题......
更新- 我尝试了以下方法,但它不起作用。任何想法为什么?
function autoComplete() {
$this->set('books', $this->Book->find('all', array(
'conditions' => array(
'Book.name LIKE' => $this->data['Book']['name'].'%'
),
'fields' => array('id','name')
)));
$this->layout = 'ajax';
}
问题是,当我在控制器中使用上面的代码时,表单提交了,但是并没有保存记录……也没有抛出任何错误,这很奇怪。
更新2:
我已经确定这不起作用的原因是数组类型不同,您无法使用 autoComplete 帮助程序更改数组类型。作为一种解决方法,我尝试了以下操作,但它不起作用。任何人都可以提供指导吗?
function create() {
if($this->Review->create($this->data) && $this->Review->validates()) {
$this->data['Review']['user_id'] = $this->Session->read('Auth.User.id');
$this->Book->find('first', array('fields' => array('Book.id'), 'conditions' => array('Book.name' => $this->data['Book']['name'])));
$this->data['Review']['book_id'] = $this->Book->id;
$this->Review->save($this->data);
$this->redirect(array('action' => 'index'));
} else {
$errors = $this->Review->invalidFields();
}
}
最终更新:
好的,我发现帮助程序只接受 find(all) 类型或数组,并且“id”字段没有通过,因为它只应用于正在生成的自动完成的 LI 列表。因此,我使用observeField 来获取信息,然后进行数据库查找,并尝试使用ID 动态创建一个隐藏字段,但这不起作用。最后,由于明显的 Scriptaculous 限制,observeField 只会采用我输入的字符而不是我单击的字符。所以,我现在最终选择了一个下拉框解决方案,最终可能会研究其他东西。无论如何感谢所有的帮助!
【问题讨论】:
标签: cakephp