Zend Action助手与插件

时间:2011-05-19 13:32:30

标签: zend-framework

我的每个页面都有一个侧边栏。侧边栏的第一个元素是a)登录表单,或b)当前用户的详细信息(取决于用户是否登录)。

我已经阅读了几种方法来实现这一目标,并计划在引导程序中初始化侧边栏占位符。

在将用户详细信息或登录表单附加到侧边栏时,我应该从Action Helper中的predispatch执行此操作吗?或者从控制器插件中的predispatch?为什么呢?

谢谢!

4 个答案:

答案 0 :(得分:1)

我建议阅读Matthew Weier O'Phinney(ZF Lead)的Using Action Helpers To Implement Re-Usable Widgets

在他的示例中,他在Action Helper中使用public function preDispatch()来创建可重用的Login / User-Widget。

答案 1 :(得分:0)

我会使用 ActionStack Action Helper来堆叠对用户控制器的调用。堆叠意味着,当你完成这个当前动作时,让我们在进行布局渲染之前调用一个新动作。

然后,此用户控制器将能够(基于存储在注册表中的Auth)决定它应该从缓存生成/获取哪些内容。此用户控制器操作将使用$this->_helper->viewRenderer->setResponseSegment('myusersidebar');让Zend_Layout主要调用<?= $this->myusersidebar ?>来回显该块。

所以这不是一个控制器插件(除了Action Stack是一个控制器插件),而不是一个控制器预分配器,而只是通过堆叠几个动作并在最后渲染布局来循环Zend MVC堆栈的方式。

动作堆叠实际上与布局组成有关,应该避免特殊请求(如ajax请求,它们当然不需要您的用户块)。因此,您可以决定延迟在每个Actions上堆叠布局块的过程(并避免将其堆叠为ajax操作),或添加一些代码以删除Ajax上下文加载时要堆叠的操作(如Zend_Layout的方式)在AjaxContext中禁用。)

“简单”预捕获处理的问题在于,您可以执行代码来为不需要此块的请求(ajax请求,pdf请求等)准备html块。

答案 2 :(得分:0)

我实际上相信这样做不是干的。用户对象已经在ZF应用程序(Zend_Auth)中,因此额外的重复逻辑是不必要的IMO。剩下的就是让你的观点决定根据对象的状态显示什么。

哦,我强烈建议你这样做。

e.g。在你的布局中:

<?= $this->partial('userSidebar.phtml'); ?>

然后在你的部分/application/layouts/userSidebar.phtml中:

<div id="sidebar">
<?php if Zend_Auth::getInstance()->hasIdentity() : ?>
  <?php $user = Zend_Auth::getInstance()->getIdentity() ?>
  // do some user profiling stuffies
  // if you need more information you should rather associate the user with those entities (else consider retrieving here or passing it as a parameter in the partial method)
<?php else : ?>
  // not logged in
  // do some login/registering stuffies
<?php endif ?>
</div>

答案 3 :(得分:0)

我会使用视图助手。这是我的第一个Zend项目。它绘制链接取决于用户是否为admin。

<?php
class TBB_View_Helper_PanelLink extends Zend_View_Helper_Abstract
{
    public function panelLink($moduleName = 'customer')
    {
        $panelLink = "";
        $auth = Zend_Auth::getInstance();
        if($auth->hasIdentity()) {
            $identity = $auth->getIdentity();
            $username = $identity->username;
            $userModel = new TBB_Model_Users();
            $userID = $userModel->getUserIDByUsername($username);
            if($userModel->isAdminUser($userID)) {
                if($moduleName == 'customer') {
                    $panelLink =  '<a class="span-4" href="admin/">Admin Panel</a>';
                } else if($moduleName == 'admin') {
                    $panelLink = '<a class="span-4" href="/">Homepage</a>';
                }
            }
        }
        return $panelLink;
    }
}