Zend Framework:在一个布局中渲染多个视图

时间:2009-08-21 22:11:40

标签: zend-framework zend-view

我想使用Zend_Layout生成动态网站。

我的布局(/application/layouts/scripts/layout.phtml)包含以下几行:

...        
<body>

        <?php echo $this->render('header.phtml') ?>

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

        <?php echo $this->render('footer.phtml') ?>

    </body>
...

如果我浏览到我的索引控制器索引操作 - Zend会自动在$ this-&gt; layout() - &gt;内容中呈现索引视图(application / views / scripts / index / index.phtml)。

现在我想在布局中呈现不同控制器动作的视图。 所以我生成一个新的控制器auth,其中包含一个显示登录表单的操作登录。

我将布局更改为:

  ...        
    <body>

            <?php echo $this->render('header.phtml') ?>

            <div id="content"><?php echo $this->layout()->content ?></div>
            <div id="login"><?php echo $this->layout()->login ?></div>

            <?php echo $this->render('footer.phtml') ?>

        </body>
    ...

当我浏览索引/索引时,我想在此操作中定义zend应该在$ this-&gt; layout() - &gt; login和例如$ this-中的新闻/列表中呈现auth / login视图&GT;布局() - &GT;含量

索引/索引比一种页面布局 - 和auth / login和news / list一种小部件

怎么做?

4 个答案:

答案 0 :(得分:8)

首先建议不惜一切代价避免使用Action视图助手,但无论如何都可能会在ZF 2.0中将其删除。 (ZF-5840)(Why the actionstack is evil

这与question I asked有关 - 而bittarman的回答非常有用。实现类似功能的最佳方法是拥有一个可以生成“登录”区域的视图助手。例如My_View_Helper_Login。然后您的布局可以调用$this->login()user/login的查看脚本也可以调用index/index。只要news/list$this->_forward('list', 'news');呈现内容,只需将请求转发给控制器中的其他控制器/操作即可。 {{1}}

答案 1 :(得分:3)

我还建议不要使用action view helper。除非您的控制器中有一堆逻辑,否则您可能不需要将另一个请求发送到另一个控制器,只是为了使视图部分呈现。

我建议您只使用视图部分,就像您使用header.phtmlfooter.phtml一样:

<body>

        <?php echo $this->render('header.phtml') ?>

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

        <div id="login"><?php echo $this->render('auth/login.phtml') ?></div>

        <?php echo $this->render('footer.phtml') ?>

</body>

也许您的auth/login.phtml视图脚本如下所示:

<div id="login_box">
    <?php if (empty($this->user)): ?>
        Please log in
    <?php else: ?>
        Hello <?php echo $this->user->name ?>
    <?php endif; ?>
</div>

只要在控制器中的某个位置设置视图变量,就可以在视图中调用render view helper(如果需要,甚至可以调用控制器)。

#index controller
public function indexAction()
{
    $this->view->user = Model_User::getUserFromSession();
}

答案 2 :(得分:1)

您可以使用速度不高的

$this->action()

或者您尝试

$this->partial()

(见http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.partial

答案 3 :(得分:0)

在寻找我自己的问题的答案时,我到了这个页面,这是我的布局被多次调用。这是因为多种原因:

1)我做了一个糟糕的ajax调用,有/ help而不是/ module / help

2)我调用了一个动作,exampleAction(),我不得不放一个

$this->_helper->layout->disableLayout();

防止再次渲染布局。

3)我进行了重定向,尝试使用前进或路线。