如何为cakephp正确定义两个相似的布局

时间:2013-01-09 07:05:59

标签: templates cakephp

我正在使用CakePHP 2.2.4并且具有类似的布局。但是,对于一个页面,<head>内容是相同的,但基本上整个身体是不同的。我所拥有的是一个带有从twitter的bootstrap中使用的导航栏的网站。在这一页上,导航栏完全不同。我知道快速解决方法是为该页面创建一个布局,但如果我遇到另一个需要使用不同导航栏的页面怎么办?什么是“适当的”MVC方式呢?

2 个答案:

答案 0 :(得分:2)

如果每个视图都有某种导航栏,那么您可以使用CakePHP Elements来显示条形图,您可以将元素调用放在一个布局文件中,并从您通过的控制器中设置一个变量要显示特定元素的元素......

echo $this->element('navbar', array(
    "which_element" => "thisone"
));

在上面的示例中,您的navbar.ctp必须包含所有导航栏并使用PHP Switch statement或其他内容来计算基于$ which_element显示的内容...

或者更好的是,只需使用控制器中的变量直接调用元素

$this->set('navbar', "thisone"); // this line is in your controller and sets the file name of your nav bar, minus the .ctp extension

echo $this->element($navbar); //this line is in your layout.ctp and renders elements/thisone.ctp, in the above example.

如果某些页面有导航栏但有些页面没有,请使用View Blocks

$this->start('navbar');
echo $this->element($navbar);
$this->end();

答案 1 :(得分:2)

我想这取决于差异有多复杂。

一种方法是拥有一个通用的布局文件

   // in app/View/Common/layout.ctp

    <!DOCTYPE html>
    <html lang="en">
    <head>

<!-- Your header content -->

</head>

<body>

    <div id="wrap">
        <div class="navbar">
            <?php echo $this->fetch('menu'); ?>
        </div>
        <div class="container">
            <?php echo $this->fetch('content'); ?>
        </div>
    </div>

    <div id="footer">
        <?php echo $this->fetch('footer'); ?>
    </div>

  </body>
</html>

让你的布局文件扩展它

//app/View/Layouts/default.ctp
<?php 
$this->extend('/Common/layout');
$this->assign('menu', $this->element('menu'));
echo $this->fetch('content');
$this->assign('footer', $this->element('footer'));
?>