CakePHP自动完成问题

时间:2010-09-12 20:54:16

标签: cakephp

我正在处理书评应用程序,我正在使用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只会接受我输入的字符而不是我点击的字符。所以,我现在最终会进入一个下拉框解决方案,并最终可能会查看其他内容。非常感谢所有的帮助!

1 个答案:

答案 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'
                                     ));