ビューの $this->fetch(‘title’) で出力されるタイトルを設定する方法がはっきりしないので調べる。
CakePHPの実装から調べる
手元のバージョンはCakePHP 2.6.7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// 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’ が設定されていたらそれを使う。
1 2 |
// viewにて $this->assign('title', 'タイトル'); |
2. ‘title_for_layout’ が設定されていたらそれを使う。
1 2 |
// controllerにて $this->set('title_for_layout', 'タイトル'); |
3. 上の両方とも設定されていなければ、ビューのパスを使う
1 |
app/View/<ビューのパス> |
ちなみに、ソース中のコメントによるとCakePHP3では title_for_layout は廃止されるらしい。