在Bootstrap中更改布局

时间:2011-04-26 15:22:30

标签: zend-framework layout bootstrapping

我是zend的新手,我在修改引导程序中的布局时遇到了问题。我想在用户登录时更改我的布局。

我在bootstrap中更改布局的功能如下:

protected function _initAuthState()
{
$layout = new Zend_Layout;
$layout->setLayoutPath('/layouts/scripts');

if (Zend_Auth::getInstance()->hasIdentity()):
// Logged in.
$layout->setLayout(layout2);

else:
// Not Logged in.
$layout->setLayout(‘layout’);
endif;
}

此代码不起作用,布局始终相同......帮助!

2 个答案:

答案 0 :(得分:4)

您正在修改 new 布局实例,而不是系统正在使用的实例。

我假设您在application.ini中指定了布局参数。所以你需要:

$this->bootstrap('layout');
$layout = $this->getResource('layout');

然后在此布局实例上执行检查/修改。

BTW,通常使用前端控制器插件来改变布局。仍然足够早地完成工作,但通常更易于配置和重复使用。有两个例子,请参阅herehere

答案 1 :(得分:1)

我找到了答案!!

这是我的最终结果,并且正在运作!!

bootstrap.php中:

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function _initLoader(){
        $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
        'basePath'  => '../application/',
        'namespace' => 'My',
        ));

        $resourceLoader->addResourceTypes(array(
            'plugin' => array(
                'path'      => 'plugins/',
                'namespace' => 'Plugin',
            )
        ));
    }

    public function _initPlugins()
    {
    $front = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new My_Plugin_Layout());
    }
}

应用/插件/ layout.php中:

<?php
class My_Plugin_Layout extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch()
    {
        $user = Zend_Auth::getInstance();
        $role = $user->getIdentity()->role;
        $layout = Zend_Layout::getMvcInstance();

        switch ($role) {
            case 'admin':
                $layout->setLayout('layout2');
                break;

            case 'normal':
                $layout->setLayout('layout');
                break;

            default:
                $layout->setLayout('layout');
                break;
        }
    }
}
?>