布局组件
主题的可配置布局 我正在使用 Cake 2.0 (beta - 尚未正式升级)
使用主题并根据主题渲染不同的视图文件,我遇到了一个限制,它会将您锁定在每个主题中对视图文件使用相同的布局。我需要在一个新主题中更改布局,因此不想在由控制器决定的 app/views/layouts 中加载相同的布局文件。
因此,我想出了一种可配置的方法来加载布局,从而避免在各个控制器中进行硬编码。
它涉及安装自定义布局组件。此组件使用控制器和操作映射来告知应加载哪个布局,并将布局配置集中在 app/config/core.php 中。
布局组件类位于此处
<?php
class LayoutComponent extends Object {
public function beforeRedirect(&$controller, $url, $status = null, $exit = true){}
public function beforeRender(&$controller){}
public function initialize(&$controller, $settings = array())
{
$this->controller = &$controller;
if (is_array(Configure::read('App.controller.layouts'))) {
$layoutMap = Configure::read('App.controller.layouts');
foreach ($layoutMap as $key => $value) {
if ($key == $this->controller->name) {
if (is_array($value['action'])) {
// many action mappings apply but maybe not all
if (in_array($$this->controller->action, $value['action'])) {
if (isset($value['layout'])) {
$this->controller->layout = $value['layout'];
}
}
} else if (isset($value['action']) && $value['action'] == '*') {
// All actions mappings apply
if (isset($value['layout'])) {
$this->controller->layout = $value['layout'];
}
}
}
}
}
}
public function shutdown(&$controller){}
public function startup(&$controller){}
}
要使用它,只需将其加载到您的控制器或 AppController 的组件数组中
例如
public $components = array(
'Layout'
);
要配置布局,这是您需要在 core.php 文件中放置的设置
Configure::write('App.controller.layouts', array(
'Pages' => array('action' => '*', 'layout' => 'my_layout')
));
上面的配置表示如果请求的控制器名为“Pages”,则加载名为“my_layout”的布局文件,并且对“Pages”的任何操作都执行此操作。
您也可以像这样在配置中单独列出操作
Configure::write('App.controller.layouts', array(
'Pages' => array('action' => array('home'), 'layout' => 'my_layout')
));
上面的配置表示仅当请求的控制器名为“Pages”且此控制器的操作为“home”时,才加载“my_layout”文件。所有其他操作将继续使用默认布局。
您可以在配置中列出所需数量的控制器,如下所示;
Configure::write('App.controller.layouts', array(
'Pages' => array('action' => '*', 'layout' => 'my_layout'),
'Searches' => array('action' => array('index'), 'layout' => 'search_layout')
));
这可能对您有用,并使您的控制器更简洁且更易于配置。