2010-09-12 87 views
1

我正在编写一本书评应用程序,我正在使用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只会采用我放入的字符而不是我点击的字符。所以,我现在最终会选择一个下拉框解决方案,并最终可能会寻找其他的东西。无论如何感谢所有的帮助!

回答

0

首先,$this->data将只包含['Book']['id']如果该字段存在于表单中(即使它是隐藏的)。

要通过name选择一些东西,并返回id,使用查找列表的方式变形,即:

$selectList = $this->Book->find('list', array(
               'fields' => array(
                   'id', 
                   'name' 
              ))); 
    $this->set('selectList', $selectList); 

在视图中,您现在可以使用$selectList在选择元素的选项:

echo $form->input('Book.id', array('type' => 'hidden')); 
    echo $form->input('template_id', array(
             'options' => $selectList, 
             'type' => 'select' 
            )); 
+0

我刚才有一个问题,我张贴上面。不知道为什么两个领域都没有通过?那里的语法是否正确?如果是这样,我可以检查其他的东西,但是我没有在我的控制器或任何东西中看到任何错别字。 – Justin 2010-09-13 13:52:07

+0

您正在使用find('all'...)而不是find('list'...)。我不知道应用程序的逻辑,但在save语句之前尝试使用调试($ this-> data)语句来查看表单返回的内容。 – Leo 2010-09-13 17:10:07

+0

我只是将用于autoComplete的AjaxHelper用作CakePHP的标准。当我切换到“列表”而不是“全部”时,它会在ajax下拉列表中显示“无法使用字符串偏移作为数组”。这可能与它使用LIKE查询的事实有关? – Justin 2010-09-13 19:16:28