CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
2024/09/08
CakePHP4のController内でViewテンプレート、レイアウトの指定はrenderを使用する
CakePHP4では、Controller内で Viewテンプレートや、レイアウトファイルをデフォルト以外のものに変更したいときは下記のように記述します。
1 |
$this->render(string $view, string $layout); |
上記を記述することで、Viewのテンプレート、および、レイアウトを指定する事ができます。
また、テンプレート、レイアウトを使用しない場合は、下記の記述をします。
1 2 3 4 |
// テンプレートファイルを使用しない場合 $this->autoRender = false; // レイアウトファイルを使用しない場合 $this->layout = false; |
CakePHP4でrenderに Viewを指定する具体的な記述方法の解説
具体的に、Controller内で Viewテンプレートや、レイアウトファイルをデフォルト以外のものに変更したいときの記述方法を解説します。
1 2 3 4 |
$view = "/element/sampleView"; $layout = "sampleLayout"; $this->render($view, $layout); |
「$view
」に編集するテンプレートのファイル名ですが、下記のルールがあります。
・拡張子の「.php」は記述しない
・標準フォルダ内にある場合はファイル名のみで OK
・「/
」から始めると「/templates」からの相対パスになる
デフォルト設定で処理される Viewについて
そのため、例えば、下記の Controller、Actionで処理をしているとします。
Controller名「Samples」
Action名「getData」
この場合、「render」でテンプレートを指定しないデフォルトの状態では下記のファイルをテンプレートとして使用します。
/templates/Samples/get_data.php
ここで注意が必要な点は、Action名は「getData」のようにローワーキャメルケースで記述しますが、テンプレートのファイル名は「get_data.php」のようにスネークケースで記述することになります。
これを間違えると下記の「テンプレートファイルがないよ」というエラーが発生します。
Missing Template
Cake\View\Exception\MissingTemplateException
Error The view for SamplesController::getData() was not found.
デフォルトのフォルダ内にある Viewを renderに指定をする方法
今度は、デフォルトのフォルダ内にある「get_image.php」というテンプレートファイルを使用したい場合の対応です。
下記のファイルを使用します。
/templates/Samples/get_image.php
この場合の renderに指定する記述方法は以下となります。
1 2 3 |
$view = "get_image"; $this->render($view); |
上記のように、「$view
」に「get_image」と、テンプレート名を指定します。
「$view = "getImage";
」のようにローワーキャメルケースで記述しても動作はしますが、公式 Cookbookでもスネークケースで記述してありますので、規約上はスネークケースで記述する方が正しいようです。
ちなみに、「$view = "getImage";
」と記述しても、テンプレートファイルは「get_image.php」である必要があり、「getImage.php」では読み込まれません。
フォルダのパスも含めて Viewを指定をする方法
最後は、フォルダのパスも含めて Viewのファイル名を指定する方法です。
下記のファイルを使用します。
/templates/element/get_record.php
この場合の renderに指定する記述方法は以下となります。
1 2 3 |
$view = "/element/get_record"; $this->render($view); |
上記のように、「$view
」に「/
」から始まるパスを記述すると「/templates」からの相対パスとして扱われます。
実ファイルを「/templates/element/getRecord.php
」とした場合、「$view = "getRecord";
」とすることで、テンプレートファイルを読み込むことはできます。
ですが、公式 Cookbookではスネークケースで記述してありますので、規約上はスネークケースで記述する方が正しいようです。
ファイル名がキャメルケースの「getRecord.php」である場合は renderにも「getRecord」と記述する必要があり、スネークケースの「get_record.php」である場合は renderにも「get_record」と記述する必要があるようです。
キャメルケース、スネークケースが混在している場合はエラーになります。
ちなみに、規約からは外れるようですが、
/templates/Samples/getData.php
上記のように、標準フォルダ内にキャメルケースで記述したファイルをテンプレートとして使用する場合は、
$view = "/Samples/getData";
のようにパス付でファイル名を指定する事で使用することは可能です。
「render()」を使用する際の注意点・renderは最後に書く理由
「render()」を使用する場合の注意点は
「$this->render(string $view, string $layout);
」は可能な限り Controller内の最後に書くことが必要です。
理由は単純です。
「$this->render(string $view, string $layout);
」の後に記述された「$this->set()
」の変数は受け取ることができないためです。
1 2 3 4 5 6 7 |
// 問題は発生しない順番 $this->set(compact("sampleData01","sampleData02")); $this->render("sampleView"); // 問題が発生する順番(変数を受け取れない) $this->render("sampleView"); $this->set(compact("sampleData01","sampleData02")); |
「render()」関数に限った話ではありませんし、CakePHP3のころも同じであったと思いますが、「render()」で指定したテンプレート内で使用する変数は、「render()」を記述するより前に「$this->set()
」で指定しておく必要があります。
順番が逆だと、Viewテンプレートでは変数を扱うことができませんので、「変数がないよ!」というエラーが発生します。
単純なことなだけにエラーが発生したときになかなか気づけない不具合とも言えます。
テンプレート、レイアウトを使用しない場合は autoRender、layoutに falseを指定する
前項までは、テンプレートファイル、レイアウトファイルを指定して使用する方法の解説でしたが、テンプレートファイル、レイアウトファイルを使用しない場合の設定方法を解説します。
1 2 3 4 |
// テンプレートファイルを使用しない場合 $this->autoRender = false; // レイアウトファイルを使用しない場合 $this->layout = false; |
記事の最初に書いたものと同じですが、大きなポイントは CakePHP3のころは利用できた下記の記述方法が使えなくなっている、という点です。
1 2 3 4 5 6 |
// テンプレート、レイアウトを無効にする方法 $this->render(false,false); // テンプレートだけ無効にする方法 $this->render(false,null); // レイアウトだけ無効にする方法 $this->render(null,false); |
そのため、「$this->autoRender = false;
」「$this->layout = false;
」をぞれぞれ指定する必要があるようです。
参考サイト
https://book.cakephp.org/4/ja/controllers.html
https://book.cakephp.org/4/ja/views.html
CakePHP4の関連記事
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHPの検索プラグイン Search Pluginの検索処理の中で前方一致検索、後方一致検索、不等号による検索、between句による範囲検索の解説です。
-
-
getParam('action')
で取得するアクション名は別関数に移動しても不変CakePHP4系、5系では「getParam()」で処理中のアクション名を取得できる。そのアクションから別関数を呼び出してた関数でアクション名を調べたが同一の名称だった。
-
-
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する
VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。
-
-
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3でパンくずの指定方法の解説。2つのヘルパーがあるが簡単なHTMLヘルパーを使った方法を、実際の状況に合わせて3つのパターン(エレメント化、ブロック化)にして解説。
-
-
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。
-
-
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合
ID以外のカラムでアソシエーション(連携)させるための考え方とサンプルソースを用いての説明を行っています。
-
-
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
-
-
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP4、5系の認証処理でログイン認証が通らない場合の確認方法、確認箇所を解説。ログ出力し、ステータスを確認するが、ステータスの内容も紹介。それはそのままusernameを変更する際のポイントでもある。
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合
アソシエーション(連携)している先のテーブルの項目で条件抽出する際の考え方と注意点をサンプルソースを用いて説明しています。