布局组件

主题的可配置布局 我正在使用 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')
    ));

这可能对您有用,并使您的控制器更简洁且更易于配置。