エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法

      2019/09/28

CakePHP3でデフォルトを設置しつつ選択したソートも有効にする方法

 

CakePHP3ではソート条件の設定を間違えると困った問題が発生する

 
CakePHP3でデフォルトのソート条件を設定した場合、ソート条件を設定する方法を間違えると、一覧表の表頭(一覧表のタイトル部分)をクリックしてソート条件を変更しようとしてもうまく行かないときがあります。
 
そんなときの対処方法です。
 
 

CakePHP3でソート条件を指定してレコードを取得する基本形

 
Usersテーブルのレコードを、idをソートキーにして取得する場合は下記のように記述をします。
 

 
 
そして、これをページネーションの処理を加ええると下記のようになります。
 

 
 

この方法ではあとから選択したソート条件は反映されない

 
上記のように記述した場合、初期表示では想定しているソート順に並びます。
 
ですが、一覧表示した後、表頭(一覧表のタイトル)にある下記の処理で生成されたソート条件を変更するリンクをクリックしても想定しているソート順にはなりません。(最初のソート順のままです。)
 
 

 
 

CakePHP3でデフォルトのソート条件を設定しつつユーザが選択したソート条件でも並び替えるようにする方法

 
正しい記述方法は、以下のようになります。
 

 
 
「<?= $this->Paginator->sort(‘user_type’) ?>」によるソート処理は「$this->Paginator」とあるように、ページネーションに関連する処理なのです。
 
そのため、ページネーションの処理側ではなく、値を取得する処理として「$this->Users->find()」の方でソートの処理を実行してしまうと、ページネーション側でのソート処理が実行されなくなる、というわけなのです。
 
 

CakePHP3でデフォルトのソート条件を設定しつつユーザが選択したソート条件でも並び替えるようにする方法・その2

 
前項で解説した方法がスマートな方法ですが、下記のような方法でも対応は可能です。
 

 
最初は、上記のようにクエリーに「sort」があるかないかをチェックして、if文でソート条件を振り分けるという処理を作っていました。
これでも動作はするのですが、フレームワークなのにこんな処理をしなくてはいけないはずはない、と思っていたところ、問題の本質にたどり着きました。
 
 

クエリーの情報取得方法が CakePHP 3.4で変更になっている

 
クエリーの情報を取得する方法は、CakePHP3.4より前と以降とで処理の方法が変更になっています。
古い記事を参考にすると動作しない場合があります。
 

 
 

CakePHP3の関連記事

CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3のバージョンを指定してインストールする詳細な手順を解説
CakePHP3のバージョンを指定してインストールする詳細な手順を解説

CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。

CakePHP3でComposerでインストールできないプラグイン、外部ライブラリを vendorに入れて手動で読み込む方法
CakePHP3でComposerでインストールできないプラグイン、外部ライブラリを vendorに入れて手動で読み込む方法

CakePHP3にComposerからインストールできないプラグインやライブラリなどを利用する方法、vendorにファイルを設置し、composer.jsonを更新し、それを呼び出す方法を詳細に解説。

CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合

アソシエーション(連携)している先のテーブルの項目で条件抽出する際の考え方と注意点をサンプルソースを用いて説明しています。

CakePHP3で値を入力直後にバリデーションする方法解説
CakePHP3で値を入力直後にバリデーションする方法解説

CakePHP3でバリデーションの実行を保存する時から入力情報を受け取るときに変更する処理の解説。CakePHP3ではnewEntity()の処理でバリデートするため1行追加で対応可能。

CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども

CakePHP3でHtmlHelperを使ってリンクの設定をする方法のまとめ。基本形からURLを指定、class、id、targetを指定、mailtoのリンク、画像をアンカーに、JavaScriptのダイアログなどの解説。

CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3で保存前にバリデーション結果を取得する2つの方法

CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。

CakePHP3ログファイルの出力方法・$this->log()の解説
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説

コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。

CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説

WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。

CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法

CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。

CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法

CakePHP3でテンプレートファイルやレイアウトファイルをデフォルトのものから別のものに変更したい場合の指定方法を解説。