Zend Framework'AjaxContent'& ResponseSegmentation问题

时间:2009-02-19 19:39:27

标签: php ajax zend-framework

我在Zend Framework中使用jquery,这是我的第一次试用。 我已经通过another question找到了,我可以通过改变上下文来改变响应:

$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('myaction', 'html');
$ajaxContext->initContext();

现在这已经有了很多帮助,但是一个新问题已经显示出来了:

我的页面由不同的responseSegments组成,当我通过更改Context响应Ajax请求时,我的其他ResponseSegments也“认为”他们正在发送Ajax,但他们不是。前端控制器要求一个viewscript.ajax.phtml ...这是错误的,它应该是viewscript.phtml(存在)。

1 个答案:

答案 0 :(得分:1)

与此同时,我想出了如何解决这个问题,因为我认为其他人将来会遇到同样的问题,我会在这里回答我自己的问题:

在我的ActionSetup.php(或bootstrap.php中,如果动作设置没有分开)我需要确保只有动作才被推送到动作堆栈,如果请求不是XmlHttpRequest。

唯一缺少的是if语句:

if (!$request->isXmlHttpRequest())

整个事情看起来像那样:

/**
 * Front Controller plugin to set up the action stack.
 *
 */
class Project_Controller_Plugin_ActionSetup extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        if (!$request->isXmlHttpRequest())
        {
            $front = Zend_Controller_Front::getInstance();
            if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack'))
            {
                $actionStack = new Zend_Controller_Plugin_ActionStack();
                $front->registerPlugin($actionStack, 97);
            } else
            {
                $actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack');
            }

            $menuAction = clone ($request);
            $menuAction->setActionName('menu')
            ->setControllerName('index');
            $actionStack->pushStack($menuAction);

            $userlogAction = clone ($request);
            $userlogAction->setActionName('userlog')
            ->setControllerName('index');
            $actionStack->pushStack($userlogAction);

           //etc.
        }
    }
}