在zend框架中查看帮助器

时间:2010-11-02 14:23:51

标签: php zend-framework

我从rob allens的'Zend_Auth登录/注销教程

中找到了这个帮助代码
class Zend_View_Helper_LoggedInAs extends Zend_View_Helper_Abstract

    {
        public function loggedInAs()
        {
            $auth = Zend_Auth::getInstance();
            if ($auth->hasIdentity()) {
                $username = $auth->getIdentity()->WSLoginName;
                $logoutUrl = $this->view->url(array('controller' => 'login',
                'action' => 'logout', 'module' => 'member'), null, true);
                return 'Welcome '. $username . '. <a href="'. $logoutUrl . '">Logout</a>';
            }

            $request = Zend_Controller_Front::getInstance()->getRequest();
            $controller = $request->getControllerName();
            $module = $request->getModuleName();
            $action = $request->getActionName();
            if($controller == 'login' && $action == 'index'){
                return '';
            }

            $loginUrl = $this->view->url(array('controller' => 'login', 'action' => 'index'));
            return '<a href="'. $loginUrl . '">Login</a>';
        }
    }

现在我的问题是,我将如何在同一模块内的不同控制器中使用此帮助程序?,因为显然,在上述教程中,此帮助程序在布局文件中使用,然后用户被重定向到indexController。当用户注销时,它会再次被重定向到登录页面..我的问题是这个,我在LoginController控制器和所述帮助器所在的同一模块中添加了一个新的Controller,这个新的控制器使用相同的布局文件正在调用该帮助程序,当我单击注销链接时,它不再起作用

2 个答案:

答案 0 :(得分:2)

要使这项工作跨越不同的模块,您必须将其注册为“全局”帮助程序。为此,请在引导程序文件中的某处添加以下内容。

//Bootstrapping file..

//Initialize and/or retrieve a ViewRenderer object on demand via the helper broker
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->initView();

//add the global helper directory path
$viewRenderer->view->addHelperPath('/your/path/to/GlobalViewHelpers','My_View_Helper');

特别是,我想设置以下内容:

'/ your / path / to / GlobalViewHelpers'作为APPLICATION_PATH。“/ / / library / CompanyName / View / Helper”

'My_View_Helper'为'CompanyName_View_Helper'

之后,取出Rob Allen先生创建的代码并将其放在/ your / path / to / GlobalViewHelpers

将类重命名为“My_View_Helper_LoggedInAs”

您应该能够拥有以下内容:

/application/layout/main.phtml

...    
<body>
        <div id='profile-panel'>
            <?=$this->loggedInAs();?>
        </div>
        <?
            $flashMessenger = Zend_Controller_Action_HelperBroker::getHelper('flashMessenger');
            $this->messages = $flashMessenger->getMessages();
        ?>
...

此外,您必须更改几行代码以满足您的登录和注销所在地的需求。

<?php
class Zend_View_Helper_LoggedInAs extends Zend_View_Helper_Abstract 
{
    public function loggedInAs ()
    {
        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) {
            $username = $auth->getIdentity()->username;
            //CHANGE HERE: This should be your Logout page
            $logoutUrl = $this->view->url(array('controller'=>'auth',
                'action'=>'logout',
                'module'=>'default'), null, true);
            return 'Welcome ' . $username .  '. <a href="'.$logoutUrl.'">Logout</a>';
        } 

        $request = Zend_Controller_Front::getInstance()->getRequest();
        $controller = $request->getControllerName();
        $action = $request->getActionName();
        //CHANGE HERE: This should be your login page
        if($controller == 'auth' && $action == 'index') {
            return '';
        }
        //CHANGE HERE: This is also your login page.
        $loginUrl = $this->view->url(array(
            'module'=>'default',
            'controller'=>'auth', 
            'action'=>'index'));
        return '<a href="'.$loginUrl.'">Login</a>';
    }
}
?>

希望这有帮助。

来源:

http://akrabat.com/zend-auth-tutorial/

http://www.mixedwaves.com/2010/03/accessing-and-using-zend-view-helpers-from-a-common-directory/

答案 1 :(得分:1)

您的退出操作位于控制器中。您必须具有如下所示的路由:/ module / controller / logout /。在您的帮助程序中使用此路由作为注销URL。现在,无论您何时注销,都会被重定向到注销操作。