3.9.2 レイアウト

レイアウトはプレゼンテーションコードを含み、ビュー周りをラッピングします。ビューのすべてにおいてみたいものは、レイアウトに置くべきです。

レイアウトファイルは、/app/views/layouts に置かれます。CakePHP のデフォルトレイアウトは、/app/views/layouts/default.ctp に新しいデフォルトレイアウトを作成することで上書きすることができます。新しいデフォルトレイアウトが生成されると、ページが描画される際に、コントローラが描画するビューコードはデフォルトレイアウトの内部に置かれます。

レイアウトを作成する際に、CakePHP に対してビューのコードがどこにあるかを伝える必要があります。そうするには、レイアウトが $content_for_layout (さらにオプションとして $title_for_layout) を含んでいるかを確認してください。これはデフォルトのレイアウトがどのようになっているかのサンプルです:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $title_for_layout?></title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<!-- 外部ファイルやスクリプトをここで読み込む(詳細は HTML ヘルパーを参照) -->
<?php echo $scripts_for_layout ?>
</head>
<body>

<!-- ビューのすべてで表示するための何らかのメニューがある場合、ここでそれを読み込む -->
<div id="header">
    <div id="menu">...</div>
</div>

<!-- ここがビューに表示させたい場所 -->
<?php echo $content_for_layout ?>

<!-- 各表示ページにフッターを追加する -->
<div id="footer">...</div>

</body>
</html>
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <title><?php echo $title_for_layout?></title>
  6. <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
  7. <!-- 外部ファイルやスクリプトをここで読み込む(詳細は HTML ヘルパーを参照) -->
  8. <?php echo $scripts_for_layout ?>
  9. </head>
  10. <body>
  11. <!-- ビューのすべてで表示するための何らかのメニューがある場合、ここでそれを読み込む -->
  12. <div id="header">
  13. <div id="menu">...</div>
  14. </div>
  15. <!-- ここがビューに表示させたい場所 -->
  16. <?php echo $content_for_layout ?>
  17.  
  18. <!-- 各表示ページにフッターを追加する -->
  19. <div id="footer">...</div>
  20. </body>
  21. </html>

$scripts_for_layout は組み込みの HTML ヘルパーを使用して外部のファイルやスクリプトを含みます。ビューから javascript や CSS ファイルを読み込む際に役立ちます

$html->css() または $javascript->link() をビューファイルで使用する際に、'in-line' 引数に 'false' を指定してください。そうすると、$scripts_for_layout 内に HTML ソースをおくことができます。(使用方法の詳細は API を見てください)

$content_for_layout はビューを含みます。これはビューコードが置かれる場所です。

$title_for_layout はページのタイトルを含みます。

レイアウトのタイトルを設定するには、コントローラで設定するのが最も簡単です。$pageTitle コントローラ変数を使用します。

<?php

class UsersController extends AppController {
    function viewActive() {
        $this->pageTitle = 'View Active Users';
    }
}
?>
  1. <?php
  2. class UsersController extends AppController {
  3. function viewActive() {
  4. $this->pageTitle = 'View Active Users';
  5. }
  6. }
  7. ?>

好きなだけレイアウトを作成することができます: app/views/layouts ディレクトリにそれを置くだけです。コントローラの $layout 変数あるいは setLayout() 関数を使用してコントローラのアクション内で変更することができます。

たとえば、サイトの1つのセクションが小さな広告バナースペースを含んでいる場合、その小さな広告スペースをもつ新しいレイアウトを作成し、次のようにしてすべてのコントローラのアクションのレイアウトとして指定します:

var $layout = 'default_small_ad';

<?php
class UsersController extends AppController {
    function viewActive() {
        $this->pageTitle = 'View Active Users';
        $this->layout = 'default_small_ad';
    }

    function viewImage() {
        $this->layout = 'image';
        // ユーザの画像を出力
    }
}
?>
  1. <?php
  2. class UsersController extends AppController {
  3. function viewActive() {
  4. $this->pageTitle = 'View Active Users';
  5. $this->layout = 'default_small_ad';
  6. }
  7. function viewImage() {
  8. $this->layout = 'image';
  9. // ユーザの画像を出力
  10. }
  11. }
  12. ?>

CakePHP は2つのコアレイアウト(CakePHP のデフォルトレイアウトの近く)があります。アプリケーションでそれを使用できます:‘ajax’ と ‘flash’ です。ajax レイアウトは、ajax レスポンスを作成する際に便利です - それは空のレイアウトです。(多くの ajax は完全に描画されたインターフェイスではなく、返り値としてマークアップのある部分だけを必要とします)flash レイアウトはコントローラの flash() メソッドで表示されるメッセージに使用されます。

3つの他のレイアウト、 xml・js・rss は、text/html ではない内容をすばやく簡単に扱うために存在します。