回避策については、下部の編集をお読みください。
Cakephp アプリで ajax ページネーションの実装に問題があります。この問題に役立つリソースとチュートリアルを探しましたが、ほとんどが Cake 1.3 を扱っています。私の側の明白で単純な間違いのために、私は指を交差させました...
これまでの状況の説明: アプリケーション用の単純な検索インターフェース (データベース内の車を検索する中古車検索インターフェース) を作成しました。検索インターフェースは実際にはうまく機能しているようです。ユーザーの検索フォームへの入力に基づいて非表示の要素を作成または破棄する非表示のフォームがあります。この非表示のフォームは Ajax 経由で正常に送信され、「16 件中 1-5 件表示」などの一連のページ分割された結果を返すことができます。
私が抱えていると思われる問題は、ページネーターヘルパーによって生成されている JavaScript 拡張番号、次、および前のリンク/ajax リクエストにあります。
私の CarsController には get リクエストを期待する find_cars 関数があります (私のコントローラーの $paginate var とビューの $this->Paginator オプションは両方とも dataType = querystring です)。この関数は、次のような Get リクエスト URL を使用した最初のフォーム送信で正常に機能します: http://localhost/myapp/cars/findCars?price=any&year=any&miles=any
私は ajax.ctp レイアウトに $this->Js->writeBuffer(); を持っています。ajax 応答では、次のリンク、番号のリンク、および前のリンクに対して書き込まれた jquery イベントを確認できます。1 つのイベントの例:
$("#link-1448104972").bind("click", function (event) {$.ajax({
dataType:"html", evalScripts:true, paramType:"querystring",
success:function (data, textStatus) {
$("#results").html(data);}, url:"\/myapp\/cars\/findCars?price=any&year=any&miles=any&page=2"});
私が抱えている問題は、URL 値にあります。URL をブラウザーに貼り付けると、find_cars 関数はパラメーターを正しく処理&'s
し、コントローラーにプレーン & として送信されます。ただし、ajax 要求を送信するページネーション リンクの 1 つをクリックすると、URL にはまだ & エンコードされたアンパサンドと $this->request->query; が含まれています。ページネーションクリック後の var_dump では、次のようになります。
array
'price' => string 'any' (length=3)
'amp;year' => string 'any' (length=3)
'amp;miles' => string 'any' (length=3)
'amp;body' =>
array
0 => string '1' (length=1)
1 => string '2' (length=1)
2 => string '6' (length=1)
'amp;page' => string '2' (length=1)
この同じ問題に言及していると思われる他の唯一の議論は、このcakephp lighthouse bug ticket #127にあります。ただし、議論は Cakephp 1.3 に関するものであり、リンク先の github コミットは 404 です。
編集:GETリクエストを使用しようとしていたことも追加する必要があると思います。これにより、予想されるユーザーナビゲーションとブックマーク機能を実装して、検索クエリを保存し、ブラウザーとアプリで結果を前後にナビゲートするのが簡単になります。ページネーションのリンク。
編集 (回避策/解決策) - @islandmyth の提案から作業して、Get リクエストの実行から Post の実行に切り替え、paramType を「querystring」から「named」に変更しました。$this->request->named からビューにクエリ情報を渡し、情報を $this->Paginator->options['data'] に保存し、php の http_build_query() 関数を使用してネストされた配列を保持します。