端くれプログラマの備忘録 CakePHP [CakePHP] ページタイトルの設定方法

[CakePHP] ページタイトルの設定方法

ビューの $this->fetch(‘title’) で出力されるタイトルを設定する方法がはっきりしないので調べる。

CakePHPの実装から調べる

手元のバージョンはCakePHP 2.6.7

// lib/Cake/View/View.php
public function renderLayout($content, $layout = null) {
     $layoutFileName = $this->_getLayoutFileName($layout);
     if (empty($layoutFileName)) {
          return $this->Blocks->get('content');
     }

     if (empty($content)) {
          $content = $this->Blocks->get('content');
     } else {
          $this->Blocks->set('content', $content);
     }
     $this->getEventManager()->dispatch(new CakeEvent('View.beforeLayout', $this, array($layoutFileName)));

     $scripts = implode("\n\t", $this->_scripts);
     $scripts .= $this->Blocks->get('meta') . $this->Blocks->get('css') . $this->Blocks->get('script');

     $this->viewVars = array_merge($this->viewVars, array(
          'content_for_layout' => $content,
          'scripts_for_layout' => $scripts,
     ));

     $title = $this->Blocks->get('title');
     if ($title === '') {
          if (isset($this->viewVars['title_for_layout'])) {
               $title = $this->viewVars['title_for_layout'];
          } else {
               $title = Inflector::humanize($this->viewPath);
          }
     }
     $this->viewVars['title_for_layout'] = $title;
     $this->Blocks->set('title', $title);

     $this->_currentType = static::TYPE_LAYOUT;
     $this->Blocks->set('content', $this->_render($layoutFileName));

     $this->getEventManager()->dispatch(new CakeEvent('View.afterLayout', $this, array($layoutFileName)));
     return $this->Blocks->get('content');
}

はっきりした。以下の優先順位でタイトルが決まっている。

1. ‘title’ が設定されていたらそれを使う。

// viewにて
$this->assign('title', 'タイトル');

2. ‘title_for_layout’ が設定されていたらそれを使う。

// controllerにて
$this->set('title_for_layout', 'タイトル');

3. 上の両方とも設定されていなければ、ビューのパスを使う

app/View/<ビューのパス>

ちなみに、ソース中のコメントによるとCakePHP3では title_for_layout は廃止されるらしい。