在操作视图的开头或结尾渲染其他html

时间:2012-05-29 02:30:43

标签: php model-view-controller zend-framework

我有Zend Framework MVC应用程序,其模块结构如上所述:

/application
  /layouts
    /sripts
      /layout.phtml
  /modules
    /default
      /controllers
        /IndexController.php
        /OtherController.php
      /views
        /scripts
          /index
            /index.phtml
            /second.phtml
            /third.phtml
            /fourth.phtml
          /other
            /index.phtml
            /second.phtml
            /third.phtml
            /fourth.phtml

在我的layout.phtml中,我有一行

<div id="main">
    <?= $this->layout()->content ?>
</div>

我希望在IndexController和OtherController的每个动作中包装渲染的动作视图,除了第四个,使用一些代码,如在开始时为<div id='top'></div>,在渲染动作视图结束时为<div id='bottom'></div>。 我不想在每个动作视图* .phtml文件中手动执行此操作。实际应用中有太多,除了代码看起来很混乱。

怎么做?

3 个答案:

答案 0 :(得分:1)

您只能为IndexControllerOtherController设置不同的布局:在每个控制器的init()方法中,您可以添加以下内容:

Zend_Layout::getMvcInstance()->setLayout('some other layout');

答案 1 :(得分:1)

在布局文件中,您可以回显布局变量。这通常是我们放置动作渲染的html的地方。您可以将多个操作的渲染附加到单个布局变量中,它们将以LIFO顺序显示。以下是将该变量插入布局文件的方法:

<?php echo $this->layout()->myLayoutVariable; ?>

您还可以在布局文件中设置占位符变量:

<?php echo $this->placeholder('myPlaceholderVariable'); ?>

在您的一个视图文件中,您可以为此占位符变量提供html内容:

<?php
    $this->placeholder('myPlaceholderVariable')->append('<p>HTML GOES HERE</p>');
?>

如果没有为占位符变量设置任何值,则不会在布局文件中呈现任何内容。但是,如果您为该占位符变量设置了一个值,它将被插入到html中。

答案 2 :(得分:0)

试试这个:

$(document).ready(function(){

   $("#main").before(//insert header html here);
   $("#main").after(//insert footer html here);

});

我不确定第四个是什么意思,但是如果你想要定位一个特定的控制器/动作,你可以抓住window.location.href并使你的函数依赖于你想要寻找的特定URL。

希望有所帮助。