開発者の備忘

「起」と「結」しか書かないので詳細はご自分でお調べください

【PHP】共通レイアウトの管理ファイルについて

概要

エラーの出力方法を勉強しているときに、
ふとエラーの出力先設定方法が気になったので調べた。


結論から言うと、
ヘッダーとかフッターなどページ共通のレイアウトを管理するファイルで
エラー(Flash)の表示を行っていた。

仕組み

いま、デフォルトで設定しているレイアウトファイルは以下となる。
12行目で正常終了かエラーのメッセージを出力をしている。

・my_layout.ctp

<!DOCTYPE html>
<html lang="ja">
<head>
    <?= $this->Html->charset() ?>
    <title>
        <?= $this->fetch('title') ?>
    </title>
    <?= $this->Html->css('styles.css') ?>
</head>
<body>
  <?= $this->element('my_header'); ?>
  <?= $this->Flash->render() ?>
    <div class="container clearfix">
        <?= $this->fetch('content') ?>
    </div>
</body>
</html>

この共通レイアウトってどこで設定してるんだっけ

Controllerのメソッドで定義する。
こんな感じ。

<?php
//$this->viewBuilder()->setLayout('使いたいレイアウトファイル名');
$this->viewBuilder()->setLayout('my_layout');
?>


ここで注意点。


例えば上記をindexに設定すると、
indexのページにしか適用されない。


↓こんな感じだと、viewのページでは適用されない。

<?php

class PostsController extends AppController {
  public function index() {
    $this->viewBuilder()->setLayout('my_layout');
    $posts = $this->Posts->find('all');
    $this->set('posts', $posts);
  }

  public function view($id = null) {
    $post = $this->Posts->get($id);
    $this->set('post', $post);
  }
}


じゃあどーするかというと、
継承元のクラスに書いちゃう。


上記の場合でいうと、「AppController」クラスに。
「AppController」クラスに"initialize"メソッドがあるので、その中に記述すればOK。
※"initialize"メソッドとは初期化処理です。


そうすると、すべてのactionに対して共通レイアウトが適用される。