2012-06-06 4 views

Répondre

0

Vous pouvez utiliser ceci:

if ($this->getRequest()->getParam('ajax')){ 
    //Ajax related code 
} else { 
    //Non ajax 
} 
+3

Désolé, c'est faux. Même si certains contrôleurs d'administration de Magento _do_ soumettent un paramètre ajax avec leurs formes (et parfois un paramètre 'isAjax'), il existe également de nombreux contrôleurs Magento (par exemple, checkout) qui ne le font pas. Et même si c'est le cas, un param 'ajax' existant ne * précise * pas * si la requête a été envoyée en utilisant Ajax. Avoir un simple 'dans n'importe quelle forme correspondrait à votre condition' if' à la soumission, aussi. Même si un tel formulaire est soumis par POST. La vérification des en-têtes 'HTTP_X_REQUESTED_WITH' vous indique que vous êtes plus fiable. –

+0

En fait, c'est la bonne façon, certains widgets Magento utilisent des IFrames, et ajoutent le paramètre ajax, donc la vérification de HTTP_X_REQUESTED_WITH est inutile. – skafandri

+1

Je pense que cela dépend de la façon dont vous définissez "Ajax". Pour moi, c'est seulement XmlHttpRequests. Pour vous, c'est seulement un params 'ajax'. Pour Magento, il semble être à la fois ^^ J'ai mis à jour ma réponse pour refléter cela. –

0

Il suffit d'utiliser PHP pur et soin de ne jamais:

public function isAjax() 
    { 
     return (boolean)((isset($_SERVER['HTTP_X_REQUESTED_WITH'])) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')); 
    } 
+0

Je ne comprendrai jamais ces gens qui utilisent des frameworks différents comme ZFW, Magentoo, etc. à cette fin, U devrait toujours se souvenir d'une syntaxe différente pour cela - POURQUOI ?! - Il suffit d'utiliser une ligne de code et il sera exécuté (plus rapide, plus sûr) partout =) –

+1

Je les utilise d'une part pour éviter le code redondant. –

+0

La redondance est plutôt des pièces FrameWork) Wrappers, objets loding paresseux, héritage multiple tout cela pour un seul appel '$ this-> getRequest() -> getParam ('ajax')' - Imaginez combien de code s'exécutent chaque fois que les utilisateurs s'exécutent différentes parties de votre application - il y a une logique pour déterminer si c'est ajax ou autre chose, instance de getRequest() (objet Demandes) et ainsi de suite ... juste pour cette fonctionnalité 'return (boolean) ((isset ($ _ SERVER ['HTTP_X_REQUESTED_WITH'])) && ($ _SERVER ['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')); ' –

28

Magento utilise la classe Zend_Controller_Request_Http pour ses demandes.

Vous pouvez utiliser pour détecter les demandes de cette façon Ajax

if ($this->getRequest()->isXmlHttpRequest()) { 
    // is Ajax request 
} 

.

Au moins

  • Prototype
  • Scriptaculous
  • jQuery
  • YUI
  • MochiKit

envoyer l'en-tête HTTP_X_REQUESTED_WITH, selon le ZF docs.

note que, "requêtes Ajax" désigne les requêtes envoyées à l'aide XmlHttpRequest (et non en utilisant des techniques comme cachées s, ou uploaders Flash, ou similaires) pour moi. Comme c'est subjectif et votre perception peut différer: Magento lui-même semble définir "Ajax" d'une manière plus étendue que moi. Jetez un oeil à Mage_Core_Controller_Request_Http::isAjax():

public function isAjax() 
{ 
    if ($this->isXmlHttpRequest()) { 
     return true; 
    } 
    if ($this->getParam('ajax') || $this->getParam('isAjax')) { 
     return true; 
    } 
    return false; 
} 

En fonction de votre perception personnelle de « Ajax », cela peut (ou non) de mieux répondre à vos besoins.

+1

Pour ceux qui ont besoin de connaître cette information ailleurs qu'un contrôleur (comme un observateur), vous pouvez utiliser 'Mage :: app() -> getRequest() -> isXmlHttpRequest()' – Meogi

1

Magento utilise en interne un mélange des deux.

L'en-tête isFlmHttpRequest() de Zend Framework vérifie l'en-tête.

public function isXmlHttpRequest(){ 
    return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest'); 
} 

Dans certains cas, magento utilise isXmlHttpRequest() comme dans Mage_ImportExport_Adminhtml_ExportController :: getFilterAction()

if ($this->getRequest()->isXmlHttpRequest() && $data) { 
    //code 
} 

Dans d'autres cas, il vérifie se paramètre comme dans Mage_Catalog_Product_CompareController :: removeAction()

if (!$this->getRequest()->getParam('isAjax', false)) { 
    $this->_redirectReferer(); 
} 

Demande Mage_Core_Controller_Request_Http :: isAjax() vérifie les deux

public function isAjax() 

{ 
    if ($this->isXmlHttpRequest()) { 
     return true; 
    } 
    if ($this->getParam('ajax') || $this->getParam('isAjax')) { 
     return true; 
    } 
    return false; 
} 

Je suggérerais d'utiliser l'objet de requête isAjax lorsqu'il vérifie les deux.

Questions connexes