0

我的网站上有覆盖层和隐藏面板,它使用 AJAX 从另一个控制器/动作中提取内容。您单击一个链接,该链接将 URL 和 AJAX 拉入内容的 pushState 中,setTerminal(true);因此没有环绕的布局。这些覆盖/隐藏面板是登录/注册,并且还希望它们在您请求没有 ajax(刷新)的页面时已经在 HTML 中,以便它们可以被深度链接。

目前我在注册控制器/动作中有这样的东西:

public function registerAction () {
    $request = $this->getRequest();

    // Possible $form = new RegisterForm(); with validation and error population etc

    // If we're not requesting via AJAX, forward dispatch to index
    if (!$request->isXmlHttpRequest()) {
        return $this->forward()->dispatch('index', array(
            'action' => 'index',
            'overlay' => 1
        ));
    }

    $view = new ViewModel();
    $view->setTerminal(true);
    return $view;

}

如果没有 XmlHttpRequest 则它将调度转发到 index/index 并进行以下检查:

public function indexAction () {
    $routeRequest = $this->getEvent()->getRouteMatch();

    $view = new ViewModel([]);

    // Check if user went to somewhere like register page
    $overlay = $routeRequest->getParam('overlay', null);
    if (null !== $overlay) {
        $view->overlay = true;
    }

    return $view;
}

在我的布局中,我正在检查视图是否设置了覆盖视图变量,然后在 HTML 中包含上一个操作的覆盖,如下所示(controllerName 和 actionName ViewHelpers 被填充 onBootstrap 所以包含register为控制器等):

// Layout.phtml
if ($viewVariables->overlay) {
    echo $this->partial('application/' . $this->controllerName() . '/' . $this->actionName() . '.phtml');
}

但这目前不包含来自 registerAction 的任何数据。我正在考虑有一个注册表,并在那里完成所有与注册相关的事情,并让它在我可能转发调度的任何地方都可以访问,但现在它变得相当复杂的转发和传递变量。

我正在考虑创建一个 ViewHelper echo $this->overlay(),它包含前一个视图中的 ViewVariables 并将另一个视图作为部分视图包含在内,但随后还考虑通过前向调度程序将视图从 registerAction 传递到 indexAction 并嵌套它。

现在我在页面底部使用 JS 触发 statechange,它获取当前 URL 并通过 AJAX 获取它,但让用户等待整页渲染,然后加载符号,当它已经存在时会令人困惑。

这似乎是一个相当复杂的问题,因为我不太熟悉可用的东西。我看到很多带有 eventManager 的模块,所以想知道其他人会如何处理这个问题?

4

2 回答 2

0
public function registerAction () {
    $request = $this->getRequest();

    // Possible $form = new RegisterForm(); with validation and error population etc

    // If we're not requesting via AJAX, forward dispatch to index
    if (!$request->isXmlHttpRequest()) {
        return $this->forward()->dispatch('index', array(
            'action' => 'index',
            'overlay' => 1
        ));
    }

    $view = new ViewModel();
    $view->setTerminal(true);
    return $view;

}
于 2014-07-29T11:10:46.970 回答
0

设法做到这一点,这比我预期的要容易。

// RegisterController/indexAction
public function registerAction()
{
    $request = $this->getRequest();

    $view = new ViewModel();

    // If we're not requesting via AJAX, forward dispatch to index
    if (!$request->isXmlHttpRequest()) {
        $view->setTemplate('application/register/index');
        return $this->forward()->dispatch('index', array(
            'action' => 'index',
            'overlay' => $view
        ));
    }

    $view->setTerminal(true);
    return $view;
}

// IndexController/indexAction
public function indexAction()
{
    $request = $this->getRequest();
    $routeRequest = $this->getEvent()->getRouteMatch();

    $view = new ViewModel();

    $overlay = $routeRequest->getParam('overlay', null);
    if (null !== $overlay) {
        $view->addChild($overlay, 'overlay');
    }

    return $view;
}

我对此的唯一抱怨是,我必须在转发调度它之前手动设置子视图的模板,因为如果没有指定,它会使用默认路径填充 onDispatch。

于 2013-05-23T09:51:10.910 回答