2017-07-03 26 views
0

私は、自動補完のようなテーブルからのデータからの入力を提案するcakephpを取得しようとしています。私はいくつかの他の人々がこれをやった方法についていくつかの読書をしましたが、まだそれを理解することはできません。現在、私のコントローラがAjaxリクエストを待っているたびに常にfalseであるようです。私は間違って何をしているのかわからないコンソールからエラーが出ない。私はif($ this-> request->( 'ajax'))文を削除しようとしましたが、ヘッダーを発行できないというエラーが発生しました。 InvoicesControllerの検索機能ですが、他の人からコードを取得しましたが、実装に失敗しました。CakePHP 3オートコンプリートAJAX応答

 public function search() 
{ 
    if ($this->request->is('ajax')) { 
     $this->autoRender = false; 
     pr('b'); 
     $name = $this->request->query['term']; 
     $results = $this->Invoices->find('all', [ 
      'conditions' => [ 'OR' => [ 
       'id LIKE' => $id . '%', 
      ]] 
     ]); 
     $resultsArr = []; 
     foreach ($results as $result) { 
      $resultsArr[] =['label' => $result['full_name'], 'value' => $result['id']]; 
     } 
     echo json_encode($resultsArr); 
    } 
} 

そして、ここでは、これは私の請求書テーブルである私のsearch.ctp

<?php use Cake\Routing\Router; ?> 

    <?php echo $this->Form->input('id', ['type' => 'text']);?> 
<script> 
    jQuery('#id').autocomplete({ 
     source:'<?php echo Router::url(array('controller' => 'Invoices', 'action' => 'search')); ?>', 
     minLength: 1 
    }); 
</script> 

あるとIDは、ユーザーが入力し何を私から提案したいものです。 invoices Table

答えて

1

私がかもしれませんあなたの正確な問題を見ることはできませんが、この問題を助けるかもしれないいくつかのことを指摘してください。

この行を削除してください。必要ありません。

$this->autoRender = false; 

代わりにこれを行う必要があります。これは、キーのルートなしでデータを返しますRequestHandler

$this->set('resultsArr', $resultsArr); 
// This line is what handles converting your array into json 
// To get this to work you must load the request handler 
$this->set('_serialize', 'resultsArr'); 

を使用して参照してください

[ 
    {"label":"Label Value"}, 
    {"label":"Another Label Value"} 
] 

それとも、これは

{"resultArr":[ 
    {"label":"Label Value"}, 
    {"label":"Another Value"} 
]} 
のようなデータが返されます。この

$this->set('_serialize', ['resultsArr']); 

ようにそれを行うことができます

これであなたの検索クエリをエースしてください。

$resultArr = $this->Invoices->find('all') 
    ->where(['id LIKE' => $id . '%']) 
    // If you want to remap your data use map 
    // All queries are collections 
    ->map(function ($invoice) { 
     return ['label' => $invoice->full_name, 'id' => $invoice->id]; 
    }); 

新しいcakephp 3 ormを確認したいと思うかもしれません。これらのドキュメントを読みやすく、関連性のあるものにするために、多くの苦労がドキュメントに書き込まれました。私は人々にドキュメントをプッシュする人ではありませんが、時間が節約できます。

Cakephp 3 ORM documentation

も問題となっている、私は気づいたいくつかのマイナーなもの。

  • $ idは決して定義しません。
  • $ nameを定義しますが、決して使用しないでください。
  • prはデバッグステートメントであり、理由はわかりません。

あなたのコメントに基づいて、ここにajax検出に関するアップデートがあります。

// By default the ajax detection is limited to the x-request-with header 
// I didn't want to have to set that for every ajax request 
// So I overrode that with the accepts header. 
// Any request where Accept is application/json the system will assume it is an ajax request 
$this->request->addDetector('ajax', function ($request) { 
    $acceptHeaders = explode(',', $request->env('HTTP_ACCEPT')); 

    return in_array('application/json', $acceptHeaders); 
}); 
+0

ありがとう、私はこれらの変更を加えましたが、私はsearch.ctpがデータを正しく送信していないと信じています。 'ajax')をコントローラに追加します。だからこそ私はPRを使ってそれがそこに入ったかどうかを調べようとしていたのです。 –

+0

@ mark.nz - 私はどのように私はajaxを検出して私の答えを更新しました。 – styks

+0

新しいAjax検出のコードはどこに置くのですか? –