Zend Framework 2: Désactiver la mise en page pour les appels ajax
Une requête AJAX à l'un de mes actions de contrôleur actuellement renvoie à la page HTML.
Je ne le veux de retour le HTML (.phtml contenu) pour cette action spécifique.
Le code suivant mal résout le problème manuellement désactiver la mise en page pour l'action:
$viewModel = new ViewModel();
$viewModel->setTerminal(true);
return $viewModel;
Comment puis-je faire ma demande de désactiver automatiquement la mise en page lorsqu'une requête AJAX est-il détecté? Dois-je écrire une stratégie personnalisée pour cela? Des conseils sur la façon de le faire est très apprécié.
De plus, j'ai essayé le code suivant dans mon application Module.php - c'est la détection AJAX correctement, mais le setTerminal() n'est pas la désactivation de la mise en page.
public function onBootstrap(EventInterface $e)
{
$application = $e->getApplication();
$application->getEventManager()->attach('route', array($this, 'setLayout'), 100);
$this->setApplication($application);
$this->initPhpSettings($e);
$this->initSession($e);
$this->initTranslator($e);
$this->initAppDi($e);
}
public function setLayout(EventInterface $e)
{
$request = $e->getRequest();
$server = $request->getServer();
if ($request->isXmlHttpRequest()) {
$view_model = $e->getViewModel();
$view_model->setTerminal(true);
}
}
Pensées?
source d'informationauteur Daniel Sposito
Vous devez vous connecter pour publier un commentaire.
En effet la meilleure chose serait d'écrire une autre Stratégie. Il y a un JsonStrategy qui peut détecter automatiquement l'en-tête accept pour retourner automatiquement au Format Json, mais comme avec l'Ajax Appels pour fullpages, il est bon qu'il ne le fait pas automatiquement choses, parce que vous voudrez PEUT-être obtenir une pleine page. Solution mentionnée ci-dessus, vous avez mentionné serait le moyen rapide pour y aller.
Quand pour pleine vitesse, il suffit d'une ligne supplémentaire. Il est recommandé de toujours revenir pleinement qualifié Viewmodel à partir de votre contrôleur. Comme:
Je pense que le problème, c'est que vous êtes d'appel
setTerminal()
sur le modèle de vue$e->getViewModel()
qui est responsable pour le rendu de la dispositionpas l'action. Vous devrez créer un nouveau modèle de vue, l'appelsetTerminal(true)
et de le retourner. J'utilise un dédié ajax contrôleur, donc il n'est pas nécessaire de déterminer si l'action est ajax ou pas:et en ajax/réponse.phtml simplement la suivante:
Voici la meilleure solution (à mon humble avis). J'ai passé près de deux jours pour le comprendre. Pas de sur Internet posté à ce sujet jusqu'à présent, je pense.
Je ne suis toujours pas satisfait. Je voudrais créer un plugin en tant qu'auditeur et de le configurer via le fichier de configuration au lieu de onBootstrap méthode. Mais je vais laisser cela pour la prochaine fois =P
J'ai répondu à cette question et semble-t-il peut-être similaire - L'accès ViewModel variables sur l'envoi de l'événement
Joindre un événement de rappel à la
dispatch
événement déclencheur. Une fois que cet événement se déclenche, il devrait vous permettre d'obtenir le résultat de la méthode d'action en appelant$e->getResult()
. Dans le cas d'une action en retour d'un ViewModel il devrait vous permettre de faire le setTerminal() la modification.aimfeld solution qui fonctionne pour moi, mais au cas où certains d'entre vous expérimentez des problèmes avec l'emplacement du modèle, essayez de spécifier le module:
Le mieux est d'utiliser JsonModel qui renvoie nice json et de désactiver la mise en page&vue pour vous.
J'ai eu ce problème avant et ici est un quikc truc pour les résoudre.
Tout d'abord, créer un layout vide dans votre mise en page de dossier
module/YourModule/view/layout/empty.phtml
Vous ne devriez echo le contenu de l'affichage dans ce mode de cette façon
<?php echo $this->content; ?>
Maintenant Dans votre
Module.php
définir le contrôleur de mise à disposition/vide pour la requête ajax