Zend框架所有控制器的通用代码

时间:2009-06-26 06:31:47

标签: zend-form bootstrapping zend-auth

我在网站的标题中有一个登录按钮。这个标题的html被编程到Zend框架视图/ layouts / home.phtml中。

我在此布局中有一个隐藏的表单,由jQuery thickbox内联内容显示集成触发。原因,我不想做一个ajax调用只是获取一个小的登录表单。

我使用Zend_Form创建表单,问题是我必须在检查用户是否登录后在所有控制器中执行此操作。我想将这个表单生成放在一个单独的位置,比如在bootstrap中,然后在bootstrap中有一个逻辑,说如果用户登录不生成表单。

我不知道引导程序是否适合这样做,或者我是否应该在其他地方执行此操作。

那么,我应该在哪里实例化表单,以便在用户未登录时随处可用。

3 个答案:

答案 0 :(得分:2)

创建自己的基本控制器,扩展Zend_Controller_Action,然后让控制器扩展到基本控制器之外。我不知道“jQuery thickbox内联内容显示集成”是什么......但是根据需要运行代码,您可以将几个部分放入其中。 init(),preDispatch(),postDispatch()等...只要确保当你延伸你的基本控制器时,你会像以下那样沉闷:

父::的init() 父:: preDispatch()方法 父::执行postDispatch() 等...在每个部分内,以便基本代码运行...

答案 1 :(得分:2)

小心Pradeep Sharma的解决方案(他自己写下并在下面接受的答案)。

以下所有代码均为ZF 1.12,而不是ZF 2.0

在引导程序中,可能还没有创建Zend_Layout的MVC实例。您应该使用Zend_Layout::startMvc()代替:

$view = Zend_Layout::startMvc()->getView() ;

而且我更喜欢在preDispatch()函数中执行此代码。 ZF的新用户可能会对此感兴趣:

application / plugins / HeaderForm.php:

class Application_Plugin_HeaderForm extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {    
        $view = Zend_Layout::startMvc()->getView() ;
        $view->headerForm = new Application_Form_HeaderForm() ;
    }
}

默认情况下,调用新Application_Form_HeaderForm()会自动加载到 application / forms / 文件夹中。您还可以使用new Zend_Form()addElement()等将表单直接创建到插件中,但不会重复使用。

当然,你需要在你的bootstrap中注册这个插件!

application / Bootstrap.php:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initPlugin()
    {
        $front = Zend_Controller_Front::getInstance() ;
        $front->registerPlugin(new Application_Plugin_HeaderForm()) ;
    }
}

默认情况下,调用新Application_Plugin_HeaderForm()会自动加载到 application / plugins / 文件夹

答案 2 :(得分:1)

我以不同的方式做到了,扩展Zend_Controller_Plugin_Abstract以实现插件并将其注册到前端控制器。

public function routeStartup(Zend_Controller_Request_Abstract $request) { } 

在上面提到的方法中生成表单,并在$ view对象中设置表单。

$ view可以使用以下方式重试:

$view = Zend_Layout :: getMvcInstance()->getView();