我正在处理书评应用程序,我正在使用autoComplete在创建评论时搜索标题。评论模型具有关联的book_id字段,并且关系被设置为评论有一本书,一本书有很多评论。
我正在尝试传递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:
我已经确定这不起作用的原因是因为数组类型不同而且您无法使用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”字段没有传递,因为它只应用于生成的autoComplete的LI列表。因此,我使用observeField获取信息,然后进行数据库查找,并尝试使用ID动态创建隐藏字段,但这不起作用。最后,由于明显的Scriptaculous限制,observeField只会接受我输入的字符而不是我点击的字符。所以,我现在最终会进入一个下拉框解决方案,并最终可能会查看其他内容。非常感谢所有的帮助!
答案 0 :(得分:0)
首先,如果字段中存在字段,$this->data
将仅包含['Book']['id']
。(即使它已被隐藏)。
要按name
选择内容并返回id
,请使用find方法的列表变体,即:
$selectList = $this->Book->find('list', array(
'fields' => array(
'id',
'name'
)));
$this->set('selectList', $selectList);
在视图中,您现在可以使用$selectList
作为select元素中的选项:
echo $form->input('Book.id', array('type' => 'hidden'));
echo $form->input('template_id', array(
'options' => $selectList,
'type' => 'select'
));