8

我想使用 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->layout()->content 中呈现索引视图(application/views/scripts/index/index.phtml)。

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

我将布局更改为:

  ...        
    <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->layout()->login 中呈现 auth/login 视图,例如在 $this->layout()- 中呈现新闻/列表>内容。

index/index 不是一种页面布局——而 auth/login 和 news/list 是一种小部件

这该怎么做?

4

4 回答 4

8

第一个建议是不惜一切代价避免使用 Action 视图助手,无论如何它可能会在 ZF 2.0 中被删除。(ZF-5840)(为什么动作堆栈是邪恶的

这与我提出的一个问题有关——bittarman 的回答非常有用。实现类似的最好方法是拥有一个可以生成“登录”区域的视图助手。 My_View_Helper_Login例如。然后你的布局可以调用$this->login(),视图脚本也可以调用user/login。至于index/index渲染内容,news/list只是将请求从控制器转发到另一个控制器/动作。 $this->_forward('list', 'news');

于 2009-08-21T22:55:35.280 回答
3

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

我建议您只使用部分视图,就像您对header.phtmland所做的那样footer.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在视图中调用 from(如果您愿意,甚至可以在控制器中调用)。

#index controller
public function indexAction()
{
    $this->view->user = Model_User::getUserFromSession();
}
于 2011-07-15T14:55:15.717 回答
1

您可以使用不那么快速的性能

$this->action()

或者你试试

$this->partial()

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

于 2009-08-21T22:25:08.400 回答
0

在寻找我自己的问题的答案时,我进入了这个页面,我的布局被多次调用。发生这种情况是由于多种原因:

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

2)我调用了一个动作,exampleAction(),我必须放一个

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

防止布局再次被渲染。

3)我做了一个重定向,尝试使用转发或路由。

于 2012-02-28T10:09:23.283 回答