私のサイトには、AJAX を使用して別のコントローラー/アクションからコンテンツを取り込むオーバーレイと非表示のパネルがあります。URL を pushState するリンクをクリックすると、AJAX がコンテンツを取り込む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 からのデータは含まれていません。登録フォームを用意し、登録に関連するすべてのことを内部で行い、ディスパッチを転送する可能性のある場所ならどこでもアクセスできるようにすることを考えていましたが、今では転送と変数の受け渡しがかなり複雑になっています。
echo $this->overlay()
前のビューの ViewVariables を含み、他のビューを部分的に含むような ViewHelper を作成することを考えていましたが、ビューを registerAction から indexAction にフォワードディスパッチャーを介して渡し、ネストすることも考えました。
現在、ページの下部にある JS を使用して statechange をトリガーしています。これは現在の URL を取得し、AJAX を介して取得しますが、ユーザーがページ全体のレンダリングを待機し、その後シンボルをロードすると、既に存在する可能性がある場合に混乱します。
利用可能なものにあまり詳しくないので、これはかなり複雑な問題のようです。私は eventManager で多くのモジュールを見ているので、他の人がこれにどのようにアプローチするのか疑問に思っていますか?