_remap игнорируя вызов IS_AJAX? - PullRequest
1 голос
/ 02 августа 2011

Эта проблема, скорее всего, специфична для codeigniter.

У меня есть контроллер с именем redirect.php, который перенаправляет с и на представления. Этот контроллер по большей части имеет одну общедоступную функцию _remap, которая выполняет все перенаправления с помощью оператора case. Все работало отлично, пока я не отправил $.POST из представления обратно на контроллер. Я хочу, чтобы он попал в _remap и посмотрел на факт, что запрос поступил от AJAX, а затем выполнил его.

У меня есть IS_AJAX константа, с которой я проверяю.

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

но всякий раз, когда я нажимаю на страницу, она всегда переустанавливается на значение по умолчанию и отправляет мой запрос на эту страницу, где он в основном возвращает мне эти страницы обратно, когда я повторяю и оповещаю данные туда и обратно.

Есть идеи?

для справки,

redirect.php (есть больше кода для определения переменных и еще 2 случая, но он не затрагивает их, он достигает '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 (представление загружается контроллером перенаправления в другом случае в redirect.php, json_tweets send является переменной JSON)

// JQuery

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

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Вместо того, чтобы делать все это, вы можете положиться на $this->input->is_ajax_request() из http://codeigniter.com/user_guide/libraries/input.html. Если вы не заинтересованы в загрузке библиотеки, вот несколько схожий код, который я создавал по крайней мере за последние два года. *

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

Посмотрите на строку, ее XMLHttpRequest, а jQuery - это инструментарий внешнего интерфейса JS

Просто чтобы добавить больше, у меня обычно есть одна точка входа для вызовов Ajax, поэтому, очевидно, у меня есть один контроллер для ajax и маршрутизирую все мои вызовы через него. Зачем мне это делать? Простая причина: я проверяю, что все мои формы отправляются в простой не-ajax-обработчик форм на сервере, если JS выключен. Если JS включен, jQuery / prototype / YUI получает управление и отправляет данные на мой контроллер ajax. Конечный обработчик, который фактически выполняет все проверки / проверки / взаимодействия с БД, является общим кодом.

1 голос
/ 02 августа 2011
case $method == 'IS_AJAX':

Ваш $method не является IS_AJAX с этим URL:

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

Это приведет вас к контроллеру redirect без метода (по умолчанию будет "index").Вам буквально понадобится:

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

... чтобы войти в это case.Вы, кажется, путаете свою константу IS_AJAX с запрошенным методом, который, по-видимому, используете правильно при проверке на index (хотя это то же самое, что и случай default, поэтому он избыточен).

$method, или как вы называете первый параметр в _remap(), всегда будет вызываемой функцией маршрутизируемого контроллера.

EDIT : Iне было упомянуто об этом ранее, но блок switch оценивает выражение, которое вы передаете ему, поэтому нет необходимости делать сравнение вручную.Пример:

switch ($method) {
    // case $method === 'index':
    case 'index':
        $this->load->view('main');
    break;
}
0 голосов
/ 02 августа 2011

попробуйте,

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