ビュー

ビューは単にweb ページであったり、またはヘッダ、フッタ、サイドバーなどのようなページの部品であったりします。実際、その種の階層構造が必要なら、ビューは他のビューの中に(さらにそのビューの中にも)柔軟に埋め込むことができます。

ビューは直接的に呼ばれることはなく、コントローラにより読み込まれなければなりません。これが MVC フレームワークであることを忘れないでください。コントローラはトラフィックの警察として振る舞い、個々のビューを取得するのはそれの責任です。もし コントローラ ページを読んでいないなら、先に進む前にそれを読む必要があります。

コントローラページで作成したコントローラの例を使い、それにビューを追加しましょう。

ビューの作成

テキストエディタを使い、BlogView.php というファイルを作り、次のものを入力してください:

<html>
<head>
    <title>My Blog</title>
</head>
<body>
    <h1>Welcome to my Blog!</h1>
</body>
</html>

application/Views ディレクトリにファイルを保存してください。

ビューの表示

特定のビューファイルを読み込むには、次の関数を使います:

echo view('name');

_name_ のところはビューファイルの名前です。

重要

.php 拡張子は記述不要ですが、すべてのビューは .php 拡張子であることが必要です。

さて、以前に作ったコントローラ Blog.php を開いて、echo 文をビュー関数に置き換えましょう:

class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                echo view('BlogView');
        }
}

以前にやったように URL を開けば、新しいビューを見られるでしょう。URL は次のようなものです:

example.com/index.php/blog/

注釈

すべての例ではビューを直接 echo していますが、代わりにビューの出力を return することもできます。それにより出力に何かしらを追加することができるようになります。

複数のビューの読み込み

CodeIgniter はコントローラで view() を複数回呼び出してもかしこく捌きます。2回目以降の呼び出すと、みんな追加されていきます。例えば、ヘッダービュー、メニュービュー、コンテントビュー、フッタビューを使いたいとしましょう。それは次のようになります:

class Page extends \CodeIgniter\Controller
{
        public function index()
        {
                $data = [
                        'page_title' => 'あなたのタイトル'
                ];

                echo view('header');
                echo view('menu');
                echo view('content', $data);
                echo view('footer');
        }
}

上の例では、後述の "動的データ追加" を使っています。

サブディレクトリへのビューの保存

その種の整理が望ましいなら、ビューファイルはサブディレクトリに保存できます。 その場合、ビューの読み込み時にディレクトリ名を含める必要があります。例:

echo view('directory_name/file_name');

名前空間つきのビュー

ビューは View ディレクトリに名前空間を切って保存することができ、読み込むときに名前空間をつけられます。PHP はクラスではないファイルの名前空間はサポートしていませんが、CodeIgniter はその機能を提供することで、モジュールライクな方法でパッケージにビューを一緒にすることができ、再利用と配布を簡単にします。

Blog ディレクトリを オートローダ が PSR-4 のマッピングで名前空間 Example\Blog であるようにセットアップすれば、ビューファイルは名前空間がついているようにして取得されます。次の例は、BlogView ファイルを名前空間をつけて /blog/views ディレクトリから読み込みます:

echo view('Example\Blog\Views\BlogView');

ビューをキャッシュする

view コマンドはキャッシュができます。cache オプションを第3パラメータとして、秒指定します:

// ビューを60秒間キャッシュします
echo view('file_name', $data, ['cache' => 60]);

デフォルトでは、ビューファイルと同じ名前を使ってキャッシュを行いますBy default, the view will be cached using the same name as the view file itself.

// ビューを60秒間キャッシュします
echo view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);

ビューに動的データを付与する

view 関数の第2引数に配列として、コントローラからビューにデータを渡します。 ここに例を示します:

$data = [
        'title' => 'わたしのタイトル',
        'heading' => 'わたしのヘッダ',
        'message' => 'わたしのメッセージ'
];

echo view('blogview', $data);

コントローラファイルで試してみましょう。コントローラを開いて次のコードを追加します:

class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                $data['title'] = "わたしの実際のタイトル";
                $data['heading'] = "わたしの実際のヘッダ";

                echo view('blogview', $data);
        }
}

ビューファイルを開いて、配列のキー名と一致する変数にテキストを書き換えましょう:

<html>
<head>
    <title><?= $title ?></title>
</head>
<body>
    <h1><?= $heading ?></h1>
</body>
</html>

前に利用した URL を使ってページを読み込めば、変数が置換されているのが分かるでしょう。

渡したデータは view が呼び出されたそのときだけ有効です。一度のリクエストで複数回この関数を呼び出しても、必要なデータはそれぞれのビューに渡さなければなりません。これはデータが他のビューに "漏れ出る" 潜在的バグから守ります。もしデータを維持することが望ましいなら、第3引数の $option 配列に saveData オプションを渡してください。

$data = [
        'title' => 'わたしのタイトル',
        'heading' => 'わたしのヘッダ',
        'message' => 'わたしのメッセージ'
];

echo view('blogview', $data, ['saveData' => true]);

加えて、呼び出しごとにデータを保持することをデフォルト動作としたいなら、application/Config/Views.php$saveDatatrue にしてください。

繰り返し処理の作成

ビューファイルに渡すデータは、単純な変数に限られません。多次元配列を渡すことができます。これは複数行生成のループに使えます。例えば、データベースからデータを取得する場合、たいていは多次元配列になります。

簡単な例を示します。これをコントローラに書き加えてください:

class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                $data = [
                        'todo_list' => ['家の掃除', 'ママに電話', 'おつかい'],
                        'title'     => "わたしの実際のタイトル",
                        'heading'   => "わたしの実際のヘッダ"
                ];

                echo view('blogview', $data);
        }
}

ビューファイルを開いてループを作りましょう:

<html>
<head>
        <title><?= $title ?></title>
</head>
<body>
        <h1><?= $heading ?></h1>

        <h3>わたしの Todo リスト</h3>

        <ul>
        <?php foreach ($todo_list as $item):?>

                <li><?= $item ?></li>

        <?php endforeach;?>
        </ul>

</body>
</html>