2012-02-18 5 views
0

자동 완성 기능이 작동하지 않아 오류가 발견되지 않습니다.JqueryUI 자동 완성이 CakePHP 2.0에서 작동하지 않습니다

JQUERY :

<script> 
$(function() { 
    $('#autoComplete').autocomplete({ 
     //source: "/groceries/items/autoComplete", ///This works but response isn't formatted correctly' 
     //dataType: "json" 
     minLength: 2, 
     source: function(request, response) { 
      $.ajax({ 
       url: "/groceries/items/autoComplete", 
       dataType: "jsonp", 
       data: { 
        featureClass: "P", 
        style: "full", 
        maxRows: 12, 
        term: request.term 
       }, 
       success: function(data) { 
        response($.map(data, function(el) { 
         return { label: el.id, value: el.name } 
        })); 
       } 
      }); 
     } 
    }); 
}); 

컨트롤러 :

public function autoComplete() { 
     Configure::write('debug', 0); 
     $this->layout = 'ajax'; 
     $query = $_GET['term']; 
     $items = $this->Item->find('all', array(
      'conditions' => array('Item.name LIKE' => $query . '%'), 
      'fields' => array('name', 'id', 'category_id'), 
      'group' => array('name'))); 
     $this->set('items', $items); 
    } 

형태 :

,995 943,210

응답 : 해명

0: {Item:{name:Cake, id:6, category_id:null}} 
1: {Item:{name:Carrot Cake, id:9, category_id:null}} 
2: {Item:{name:Carrots, id:8, category_id:null}} 
3: {Item:{name:Casserole, id:11, category_id:null}} 
4: {Item:{name:Cauliflower, id:10, category_id:null}} 

편집.

JqueryUI는 label과 value를 기대하며 그 맵은 배열을 재 배열해야하지만 실제로는 그렇지 않습니다. 어떤 아이디어?


더 나은 해결책을 발견했습니다. 이것은 컨트롤러에서 완전히 수행됩니다. 보기가 필요하지 않습니다. 당신은 잊었처럼

public function autoComplete() { 
     Configure::write('debug', 0); 
     *$this->autoRender=false;* 
     $this->layout = 'ajax'; 
     $query = $_GET['term']; 
     $items = $this->Item->find('all', array(
      'conditions' => array('Item.name LIKE' => $query . '%'), 
      'fields' => array('name', 'id', 'category_id'), 
      'group' => array('name'))); 
     *$i=0; 
     foreach($items as $item){ 
      $response[$i]['value']="'".$item['Item']['id']."'"; 
      $response[$i]['label']="'".$item['Item']['name']."'"; 
      $i++; 
     } 
     echo json_encode($response);* 
    } 
+0

당신이 아약스가 사용하는 폼을 표시 할 수 있습니다 컨트롤러에서 코드 자동 완성? 이것은 테스트 과정에서 도움이 될 것입니다. 이 문제를 해결하는 데 도움이되고 싶습니다. –

+0

디버그를 0으로 설정하는 것을 잊지 마십시오. Configure :: write ('debug', 0); –

+0

@ChuckBurgess 추가 정보로 질문을 업데이트했습니다. – Chris

답변

1

당신이 반환되는 배열을 줄일 경우 Items 모델에 의해. 그래서 그 대신 $this->set('items', $items);의 그렇게 같은 JSON을 인코딩 결과를 반환 :

foreach($items as $item) { 
    $data[] = $item['Item']; 
} 
$data = json_encode($data); 
echo $data; 
exit; 

을이 컨트롤러의 auto_complete 방법 안에 있습니다.

UPDATE : 예를 들어 케이크를 쿼리 할 때, 그렇게 같은 결과를 반환 : 당신이 JSON을 반환하고자하지 않는 경우, 당신은 단지 JSON 인코딩없이 $data를 반환 할 수

[ 
    {"name":"Cake Batter","id":"1","category_id":"3"}, 
    {"name":"Cake Mix","id":"2","category_id":"3"} 
] 

.

형식 업데이트 :

이가 "실수"내가 만약 특정 아니지만, 당신은에 foreach 루프를 변경할 수 있습니다 :

foreach($items as $item) { 
    $data[]= array(
     'label' => $item['Item']['name'], 
     'value' => $item['Item']['id'] 
    ); 
} 
+0

우리는 올바른 길을 가고있다. 응답은 당신이 쓴 것과 똑같습니다. 문제는이 형식으로 JQueryUI가 기대한다는 것입니다. label : el.name, value : el.id – Chris

+0

각 항목의 레이블/값을 수행하도록 foreach를 수정하십시오. (위의 업데이트 참조) –

+0

FTR, 이것은 나를 위해 일했습니다. –

0

이 보이는 Item :

response($.map(data, function(el) { 
    return { label: el.Item.id, value: el.Item.name } 
}); 

또한 서버 측에서 그것을 할 수는 Set를 사용하여 :

$this->set('items', Set::extract('/Item', $items)); 
+0

이것은 작동하지 않았거나 아무 것도 변경하지 않았습니다. – Chris

+0

정확히 작동하지 않는 것은 무엇입니까? – ori

+0

나는 두 가지 변화를 시도했는데 나의 반응은 여전히 ​​위와 같음 – Chris

관련 문제