CakePHPでView内の共通部分を使いまわす方法
こんにちは。
開発の長谷です。
CakePHPでの開発をすることが多いのですが、
Viewを記述する際、今までずっとhead内やheader、footerなどの
共通部分を1つ1つのファイルに書き込んでいました。
ただ、このように書いてしまうと修正が必要になった場合、
1つ1つファイルを修正しないといけなくなったりして、とても大変で面倒です。。
このことからどうにかして共通部分を一纏めにできないかと思い色々と調べた結果、
方法を見つけましたので紹介します。
方法
1. 共通となるレイアウトのViewファイルをapp/View/Elements/ 配下に作成する
まず、app/View/Elements/ 配下に共通となるレイアウトを作成します。
ファイル名は通常のViewと同様{任意のファイル名}.ctpです。
今回はhead.ctp, header.ctp, footer.ctp としましょう。
通常のViewに書いていたhead, header, footerの部分をそれぞれコピペすればOKです。
ちなみに、app/View/Elements/ 配下にディレクトリを作成して、その下にViewファイルを置くことも可能です。
例:app/View/Elements/Admin/header.ctp など
2. 通常のViewで先ほど作成したファイルを読み込ませる
読み込ませたい部分に
// 共通head <?php echo $this->element('head'); ?> // 共通header <?php echo $this->element('header'); ?> // 共通footer <?php echo $this->element('head'); ?>
と記載すると、先ほど作成したファイルを自動で読み込んでくれます。
また、app/View/Elements/Admin/ のようにディレクトリを作成している場合は
// 共通head <?php echo $this->element('Admin/head'); ?> // 共通header <?php echo $this->element('Admin/header'); ?> // 共通footer <?php echo $this->element('Admin/head'); ?>
と記述すればOKです。
問題点
共通部分といっても一部分だけ違っていたりすることが多いと思います。
よくあるのはhead内のtitleタグです。
titleタグの要素の内容はページによって内容が違うことが多いですよね。
こういった場合も対応可能です。
$this->element()で第二引数に連想配列で["変数名" => "値"]とすると、
パラメータを渡すことができます。
使用例:
// element側(head.ctp) <head> ....... <title><?php echo $title; ?></title> </head>
// 通常View側(呼び出し側) <?php echo $this->element('head', ["title" => "トップ"]); ?>
といった感じで呼び出すこともできるので大変便利ですね。
以上です。