在CakePHP布局中的多个模型


Multiple Models Across A Layout in CakePHP

在CakePHP中实现以下功能的最佳方法是什么?

我有一个布局,像许多其他人有3个主要部分,一个页眉,一个页脚和主要内容。页眉和页脚不是完全静态的,而是作为元素实现的,它有点击计数和其他一些动态的东西。这些动态内容与主要内容没有任何关系,但与整个网站更相关。

对于这个我认为页脚需要有自己的模型,我可以有页脚运行在不同的控制器/动作比主要内容?否则,我想我需要将页脚模型放在主view的模型中,然后传递到页脚element,这似乎不是最简洁的方式。

换句话说,页眉、页脚、主要内容和可能更多的边栏是完全相互独立的,但从相同的布局呈现。从控制器传递到视图/布局的模型需要有页眉/页脚/内容/侧边栏所需的模型?

我探索并发现requestAction可能是一种方式,但不相信这是否是最好的方式。也许我还没找对地方。

只需在AppControllerbeforeRender方法中添加所需的内容:

class AppController extends Controller {
    public function beforeRender () {
        $this->set('number_of_visists', /* ... */) ;
    }
} ;

所以你会得到每个页面的值,然后你可以把所有的东西都放在你的布局文件中,或者分割成多个元素,但你可以访问$number_of_visits无处不在。


编辑:小编辑回答你的评论。这是做你想做的事的一种方式,也许不是最"正确"的,但却是我最先想到的。我没有测试这个,所以它可能包含一些错误…

你可以使用组件:假设你有三个组件,一个用于页眉,一个用于页脚,一个用于菜单。

在你的AppController:

class AppController extends Controller {
    public $components = array('Header', 'Menu', 'Footer');
} ;
然后是组件(我将只展示一个示例):
class FooterComponent extends Component {
    public function beforeRender(Controller $controller) {
        $visitModel = ClassRegistry::init('VisitCounter');
        $controller->set('number_of_visits', $visitModel->getNumberOfVisits()) ;
    }
}

然后在布局中使用elements:"

<html>
   <!-- Whatever you want... -->
   <?php echo $this->element('footer') ; ?>
</html>

每个开发人员都可以在自己的组件(以及相关的模型)和自己的元素上工作,而不会干扰其他的。