2011-08-02 3 views
1

Ce problème est très probablement lié au codeigniter._remap ignorant l'appel IS_AJAX?

J'ai un contrôleur appelé redirect.php qui redirige depuis et vers les vues. Ce contrôleur a pour la plupart une fonction publique _remap qui effectue toute la redirection avec une instruction case. Tout a fonctionné très bien jusqu'à ce que j'ai envoyé un $.POST à partir d'une vue au contrôleur. Je veux que cela frappe le _remap et que le fait que la requête provienne d'AJAX soit le cas.

J'ai une constante IS_AJAX que je vérifie.

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 

mais chaque fois que je frappe la page, il est toujours remappant par défaut et envoyer ma demande à cette page où il me retourner essentiellement que les pages de données quand je suis en écho et alerter les données çà et là.

Des idées?

pour référence,

redirect.php (il y a plus de code pour définir des variables et 2 autres cas, mais ce n'est pas frapper ceux-ci, il est frappant 'index'/default)

public function _remap($method) 
     { 

    switch ($method) { 
     case $method == 'index': 
     $this->load->view('main'); 
      break; 
     case $method == 'IS_AJAX': 
     var_dump($_POST); 
      break; 
     default: 
     $this->load->view('main'); 
      } 
     } 

tweetview.php (vue par le contrôleur chargé de redirection dans un autre cas au sein redirect.php, json_tweets envoyer est une variable JSON)

// jquery

$.post("http://localhost/2fb/index.php/redirect", {'json_tweets': json_tweets}, 
    function(data) { 
    alert(data); 
    }); 
+0

besoin de voir plus de ce qui se passe, s'il vous plaît envoyer votre contrôleur et le javascript que vous utilisez. – jondavidjohn

Répondre

1
case $method == 'IS_AJAX': 

Votre $method n'est pas IS_AJAX avec cette url:

http://localhost/2fb/index.php/redirect 

Cela vous amènera au contrôleur redirect sans méthode (par défaut sera "index"). Vous littéralement besoin:

http://localhost/2fb/index.php/redirect/IS_AJAX 

... à l'étape dans cette case.Vous semblez confondre votre constante IS_AJAX avec la méthode demandée, que vous semblez utiliser correctement lors de la vérification de index (bien que ce soit le même que le cas default, donc il est redondant).

$method, ou tout ce que vous nommez le premier paramètre dans _remap(), sera toujours la fonction de contrôleur routée qui est appelée.

EDIT: Je n'ai pas mentionné cela précédemment, mais le bloc de commutation évalue l'expression que vous lui transmettez, il n'est donc pas nécessaire de faire la comparaison manuellement. Exemple:

switch ($method) { 
    // case $method === 'index': 
    case 'index': 
     $this->load->view('main'); 
    break; 
} 
+0

oh wow, ton droit bien sûr, c'est ce que je reçois pour coder à 2h du matin sur un contrôleur que je n'ai pas regardé depuis des jours :) Je vais repenser cette stratégie. – Chamilyan

0

essayer cela,

$.ajax({ 
     type: "POST", 
     url: "your function url goes here", 
     data: data, 
     success: function(html){ 
       window.location = 'redirect url goes here'; 
     } 
    }); 
+0

oui, je vois sur la base de ma confusion sur la question pourquoi cette réponse a un sens. Avoir ajouté la validation pour utiliser un autre contrôleur ajax séparé que @kumar a suggéré, c'est la direction que je vais suivre. – Chamilyan

2

Au lieu de faire tout cela, vous pouvez compter sur $this->input->is_ajax_request() de http://codeigniter.com/user_guide/libraries/input.html. Si vous n'êtes pas intéressé par le chargement d'une bibliothèque, voici un code similaire à celui que j'ai en production depuis au moins deux ans.

$ajax = ($_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest')? true : false; 

Regardez la chaîne, son XMLHttpRequest et jQuery est le frontend boîte à outils JS

Juste pour ajouter d'autres, je suis généralement un point d'entrée pour les appels Ajax, donc évidemment je un contrôleur pour ajax et acheminer tous mes appels à travers elle. Pourquoi devrais-je le faire? Pour une raison simple, je m'assure que tous mes formulaires se soumettent à un simple gestionnaire de formulaire non-ajax au serveur si JS est désactivé. Si JS est activé, jQuery/prototype/YUI prend le contrôle et envoie des données à mon contrôleur ajax. Le gestionnaire final qui effectue réellement toutes les interactions validation/vérification/db est un code commun.

+0

On dirait qu'il le fait déjà avec une constante, ce qui est aussi ce que je fais. –

+0

Eh bien oui, mon intention est de le diriger vers la fonction/méthode CI qui prend soin de faire ce que moi, vous et lui faites. – Kumar

+0

intéressant, je ne savais pas à propos de cette fonction de la bibliothèque. Je n'ai aucun problème à utiliser les bibliothèques et comme je charge déjà les entrées, je vais certainement vérifier. – Chamilyan