我正在编写一本书评应用程序,我正在使用autoComplete在创建评论时搜索标题。评论模型有一个关联的book_id字段,关系被设置为review有一本书和一本书有许多评论。CakePHP AutoComplete问题
我想通过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';
}
的问题是,当我在控制器使用上面的代码中,表单提交,但它不保存记录...没有错误也扔了,这是奇怪的。
UPDATE2:
我已经确定,这是不工作的原因是因为数组类型是不同的,你不能改变与助手自动完成数组类型。作为一种解决方法,我尝试了以下方法,但它不起作用。任何人都可以提供指导为什
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();
}
}
最后更新:
好吧,我发现,助手只需要查找(全部)型或阵列的“ID”字段是不及格,因为它仅适用于自动完成的LI列表正在生成。因此,我使用了observeField来获取信息,然后执行数据库查找,并尝试使用ID创建一个隐藏字段,但这不起作用。最后,由于明显的Scriptaculous限制,observeField只会采用我放入的字符而不是我点击的字符。所以,我现在最终会选择一个下拉框解决方案,并最终可能会寻找其他的东西。无论如何感谢所有的帮助!
我刚才有一个问题,我张贴上面。不知道为什么两个领域都没有通过?那里的语法是否正确?如果是这样,我可以检查其他的东西,但是我没有在我的控制器或任何东西中看到任何错别字。 – Justin 2010-09-13 13:52:07
您正在使用find('all'...)而不是find('list'...)。我不知道应用程序的逻辑,但在save语句之前尝试使用调试($ this-> data)语句来查看表单返回的内容。 – Leo 2010-09-13 17:10:07
我只是将用于autoComplete的AjaxHelper用作CakePHP的标准。当我切换到“列表”而不是“全部”时,它会在ajax下拉列表中显示“无法使用字符串偏移作为数组”。这可能与它使用LIKE查询的事实有关? – Justin 2010-09-13 19:16:28