2

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

我在这个布局中有一个隐藏的表单,它是由 jQuery 厚框内联内容显示集成触发的。原因,我不想进行 ajax 调用来获取一个小的登录表单。

我使用 Zend_Form 创建表单,问题是我必须在检查用户是否登录后在所有控制器中执行此操作。我想把这个表单生成放在一个地方,比如在引导程序中,然后在引导程序中有一个逻辑来说明如果用户登录不生成表单。

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

那么,如果用户未登录,我应该在哪里实例化表单以便它在任何地方都可用。

4

3 回答 3

2

创建您自己的扩展 Zend_Controller_Action 的基本控制器,然后让您的控制器扩展您的基本控制器。我不知道“jQuery 厚盒内联内容显示集成”是什么……但是您可以根据需要运行代码的时间将其放入几个部分。init()、preDispatch()、postDispatch() 等......只要确保当你扩展你的基本控制器时,你会做类似的事情:

parent::init() parent::preDispatch() parent::postDispatch() 等...在每个部分中,以便基本代码也可以运行...

于 2009-07-04T04:01:58.540 回答
2

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

下面的所有代码都适用于 ZF 1.12,而不是 ZF 2.0

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

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

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

应用程序/插件/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() ;
    }
}

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

当然,您需要在引导程序中注册此插件!

应用程序/Bootstrap.php:

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

默认情况下,调用 newApplication_Plugin_HeaderForm()将自动加载到application/plugins/文件夹中

于 2012-09-23T23:20:20.707 回答
1

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

public function routeStartup(Zend_Controller_Request_Abstract $request) { } 

在上述方法中生成表单并在 $view 对象中设置表单。

$view 可以使用:

$view = Zend_Layout :: getMvcInstance()->getView();
于 2009-07-07T11:09:52.063 回答