我的网站上有覆盖层和隐藏面板,它使用 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 的模块,所以想知道其他人会如何处理这个问题?