2013-03-28 116 views
1

我想在CakePhp 2.x中的文本框中獲取Ajax自動完成設置。CakePhp Ajax自動完成

在我看來,我有:

<?php $this->start('script'); ?> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     var options, a; 
     jQuery(function() { 
      options = { 
       serviceUrl: "<?php echo $this->Html->Url(array('Controller' => 'Logs', 'action' => 'autoComplete')); ?>", 
       minChars: 2, 
      }; 
      a = $('#LogTimeSpent').autocomplete(options); 
     }); 
    }); 
    $('#saveCust').click(function() { 
     alert("Test") 
    }); 
</script> 
<?php $this->end(); ?> 

在我的控制,我有:

function autoComplete($query) { 
    if ($this->request->is('ajax')) 
    { 
     $suggestions = $this->Customer->find('all', array(
      'conditions' => array(
       'Customer.fullName LIKE' => '%'.$query.'%' 
       ) 
      )); 
     return json_encode(array('query' => $query, 'suggestions' => $suggestions)); 

    } 
} 

Customer.fullName是一個虛擬場如果影響查詢。 Firebug目前給我一個500內部服務器錯誤。

回答

3

我發現你必須做一些特殊的虛擬領域的工作。我決定虛擬場不是要走的路,所以我得到了更新。 $ query作爲參數也是不正確的,我需要從$this->params['url']['query'];取得查詢字符串。最後,而不是返回json_encode我需要使用_serialize。這是我更新的控制器,所以希望這會幫助別人。我的觀點在原文中是正確的。

function autoComplete() { 
    if ($this->request->is('ajax')) 
    { 
     $query = $this->params['url']['query']; 
     $this->set('query', $query); 

     $customer = $this->Log->Customer->find('all', array(
      'conditions' => array(
       'OR' => array(
        'Customer.first_name LIKE' => '%'.$query.'%', 
        'Customer.last_name LIKE' => '%'.$query .'%' 
       )), 
      'fields' => array(
       'Customer.first_name', 'Customer.last_name' 
       ) 
      )); 

     $names = array(); 
     $id = array(); 
     foreach ($customer as $cust) { 
      $fullName = $cust['Customer']['last_name'] . ', ' . $cust['Customer']['first_name']; 
      array_push($names, $fullName); 
      array_push($id, $cust['Customer']['id']); 
     } 
     $this->set('suggestions', $names); 
     $this->set('data', $id); 
     $this->set('_serialize', array('query', 'suggestions', 'data'));   
    } 
}