CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
2019/07/22
CakePHP3で他のテーブルのマスタテーブルからセレクトボックスを作る
マスタのテーブルを作成し、そのマスタテーブルの情報を基にしてセレクトボックス(プルダウンリスト)を作成する方法を解説します。
具体的には、下記の「Master Roles(権限マスタ)」の項目をテーブルから取得するイメージです。
想定しているテーブル
想定しているテーブルは、以下の「ユーザテーブル」と「権限マスタテーブル」です。
ユーザ情報に、権限マスタから権限情報を編集できるようにしたのち、ユーザ認証機能を実装し、ユーザの持つ権限によって利用できる機能、できない機能を振り分けることを想定しています。
そのために、ユーザ情報の登録の際に「権限」をプルダウン(セレクトボックス)で選択できるようにする、というのが趣旨になります。
【ユーザテーブル】
1 2 3 4 5 6 7 8 9 |
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `master_roles_id` char(2) NOT NULL, `email` varchar(255) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
【権限マスタ】
1 2 3 4 5 6 7 |
CREATE TABLE `master_roles` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL, `delete_flag` char(1) DEFAULT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
想定しているテーブルは上記のような形で、「ユーザテーブル」の 4項目目に「権限マスタ」の IDを編集することを想定しています。
セレクトボックスを作成するサンプルプログラム
基本的な処理は「cake bake all users」コマンドで生成しています。
そのうえで、加える処理についての解説です。
/src/Controller/UsersController.php の変更
下記のとおり、コントローラーの最初の方に「use Cake\ORM\TableRegistry;
」を追記します。
これを追記することで、コントローラーに関連しない他のテーブルの情報を取得することができるようになります。
1 2 3 4 5 |
<?php namespace App\Controller; use App\Controller\AppController; use Cake\ORM\TableRegistry; // この行を追記します。 |
続いて、「UsersController」の中に「initialize()」関数を追加します。
7行目の「master_roles」が読み込むテーブル名になり、複数ある場合は複数行記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class UsersController extends AppController { // 以下の「initialize()」を追加します。 // 3.6.0 以降の場合 public function initialize(){ parent::initialize(); $this->MasterRoles = TableRegistry::getTableLocator()->get("master_roles"); } // 3.6.0 より前の場合 public function initialize(){ parent::initialize(); $this->MasterRoles = TableRegistry::get("master_roles"); } |
2019.07.22 追記
CakePHP3.6から、TableRegistryクラスの使用方法が変更になりました。
そのため、上記のサンプルコードでは両方を併記しています。
続いて、「initialize()」のすぐ後ろに「beforeFilter()」を追加します。
1 2 3 4 5 6 7 8 9 10 11 |
// 以下の「beforeFilter()」を追加します。 public function beforeFilter(){ $masterRolesAll = $masterRolesVaild = array(); foreach ($this->MasterRoles->find()->all() as $tmp){ $masterRolesAll += array ($tmp->id => $tmp->name); if ($tmp->delete_flag != "1"){ $masterRolesVaild += array ($tmp->id => $tmp->name); } } $this->set(compact("masterRolesAll","masterRolesVaild")); } |
上記は、「delete_flag」の有無によって変数を 2つに分けています。
プルダウンの生成には、「delete_flag」がないもののみを使いますので、「$masterRolesVaild」の方を使います。
ですが、すでにマスタを削除していても、そのマスタの値を持つレコードが残っている可能性がある場合などは、「$masterRolesAll」を使う場合があるのではないか、と思い作成しています。
マスタを削除する際に、そのマスタのコードを利用しているレコードをチェックするなど、マスタ管理がしっかりできていてる場合は「$masterRolesVaild」の方だけあれば足りるでしょう。
ちなみに、ここでのサンプルは、権限マスタから全件取得したうえで、プログラムの処理として、「delete_flag」の値で振り分け処理をしています。
ですが、そもそも権限マスタテーブルから値を取得する際に「delete_flag」によって振り分けたレコードを取得する場合は、下記の様に where句を追加することも可能です。
1 2 3 |
$this->MasterRoles->find()->all() ↓変更 $this->MasterRoles->find()->where(["master_roles.delete_flag is" => null] |
また、「$masterRolesAll」「$masterRolesVaild」の変数を「beforeFilter()」で作成しています。
これは、Usersコントローラーの中のすべてのアクションで使えるようにするためです。(今回は、index、add、editで使うためです。)
特定のアクションだけで使えればいい場合は、3~10行目を特定のアクションの中に移しても問題ありません。
/src/Template/Users/index.ctp の変更
index.ctpは、以下のように変更します。
ここでは、一覧表示する際に、権限コードを表示するのではなく、権限名称を表示するようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 変更前 <td><?= h($user->master_roles_id) ?></td> // 変更後 <td> <?php if ($user->master_roles_id){ if (isset($masterRolesVaild[$user->master_roles_id])){ echo $masterRolesVaild[$user->master_roles_id]; } } ?> </td> |
/src/Template/Users/add.ctp の変更
/src/Template/Users/edit.ctp の変更
add.ctp、edit.ctpは以下のように変更します。
新規登録、更新の画面では、プルダウンで権限を選択できるようにしています。
セレクトボックス(プルダウン)に編集する値は、「options」に連想配列で、キーと値を渡すだけで作成してくれます。
1 2 3 4 5 6 7 |
// 変更前 echo $this->Form->input('master_roles_id'); // 変更後 echo $this->Form->input('master_roles_id', ["type"=>"select","empty"=>"選択してください", "options"=>$masterRolesVaild]); |
CakePHP3の Form Helperの使い方については、「CakePHP3のForm Helperの使い方のまとめ」に記事を書いていますので参照してください。
上記の Form Helperの使い方を読んでもらえば分かりますが、プルダウンリスト(セレクトボックス)をラジオボタン変えたい場合は、「"type"=>"select"
」を「"type"=>"radio"
」にすれば OKです。
また、「"empty"=>"選択してください"
」は、最初に nullの値を入れる場合の設定です。
今回の紹介している「権限」は必須項目となるべき項目ですので、「"empty"=>"選択してください"
」は消す方が無難かもしれません。
また、先ほどの「"type"=>"select"
」を記述しなくてもデフォルトでプルダウンリストになりますので、下記の様に短く記述することも可能です。
1 2 |
echo $this->Form->input('master_roles_id', ["options"=>$masterRolesVaild]); |
取得したテーブルの値のオブジェクトを配列にする方法
今回は、UsersController.phpで配列を生成するという仕組みで構築しましたが、テーブルから取得した値をオブジェクトのまま View側に渡す場合もあるかと思います。
そんな時、特定のレコードを自由に扱えるようにするには配列にする必要があるのだと思いますが、その方法について調べた内容を下記の記事にしていますので、あわせて参考にしてください。
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定
CakePHPのアップロードするファイル名を乱数で変更しセキュリティを高める方法を解説。
-
-
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。
-
-
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。
-
-
CakePHPを学ぶ際にはオブジェクト指向を学ぼう
CakePHPはオブジェクト指向で書かれていますので、CakePHPを学ぶにはオブジェクト指向も学びましょう。
-
-
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。
-
-
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4のコマンド(シェル)に対して、環境変数を指定して実行する方法を解説。LinuxとWindows上のXAMPPとでは記述方法が異なるため、Windowsのsetコマンドについても詳細解説。
-
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。
-
-
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
Comment
まさにこの処理を書きたくてググってたら辿り着きました。私は今回のプロジェクトからCakePHP3で開発を始めたんですが、まだ日本語ノウハウの積みあげはこれからっぽい感じなので、すごく助かりました。ありがとうございます!
かみおかさん、コメントありがとうございます!
書いた記事がお役に立ったということで、すごく嬉しいですね。
役に立ったという書き込みをいただくだけで、1週間は頑張って仕事ができます!
引き続き役に立つ記事を書いていきますので、今後もよろしくお願いします!
私もこのコードが書きたくてググりました!
すごくすごく助かりました!ありがとうございます!
rinkoさん、コメントありがとうございます!
役に立ったと言ってもらえるとすごく嬉しいですね。記事を書いた甲斐があった、と思えますからね。
これがベストプラクティスか分かりませんが、引き続き頑張って記事を書いていきますので、今後ともよろしくお願いします!