2013-03-28 3 views
1

Я пытаюсь получить установку автозаполнения Ajax для текстового поля в CakePhp 2.x.CakePhp Ajax Autocomplete

На моем взгляде, у меня есть:

<?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'));   
    } 
}