2012-02-18 20 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); 
    } 

フォーム

<p> 
    <?php echo $this->Form->create('Item', array('model'=>'item','action' => 'addItem', 'name'=>'AddItem'));?> 
     <?php echo $this->Form->text('Item.name', array('size'=>'30', 'id'=>'autoComplete', 'autocomplete'=>'off')); ?> 
     <?php echo $this->Form->text('Item.category_id', array('type'=>'hidden', 'value'=>'0')); ?> 
     <?php echo $this->Form->text('Groclist.id', array('type'=>'hidden', 'value'=>$groclist['Groclist']['id'])); ?> 
    <?php echo $this->Form->end('Add'); ?> 
</p> 

応答:明確化のために編集

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はラベルと値が必要であると認識しており、そのマップはそれらを再配置する必要がありますが、何らかの理由でそうではありません。何か案は?


さらに良い解決策が見つかりました。これはコントローラ内で完全に行われます。ビューは必要ありません。

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

あなたは、Ajaxを使用しているフォームを表示することができますし、コントローラからのオートコンプリートコード?これはテストプロセスに役立ちます。私はこれを撃つのを助けるのが大好きです。 –

+0

デバッグを0にすることを忘れないでください。Configure :: write( 'debug'、0); –

+0

@ChuckBurgess詳細情報を添えて質問を更新しました – Chris

答えて

1

あなたが返されている配列を減らす場合はどうItemsモデルによって。これは、コントローラでauto_completeメソッド内で

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

:ので、代わり$this->set('items', $items);のあなたはとてもようなJSONエンコードされた結果を返します。

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

関連する問題