_remap игнорирует вызов IS_AJAX?

Эта проблема, скорее всего, специфична для 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 случая, но он не попадает в них, он попадает в «индекс» / по умолчанию)

 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 является переменной JSON)

//jquery

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

person Chamilyan    schedule 02.08.2011    source источник
comment
нужно увидеть больше того, что происходит, опубликуйте свой контроллер и используемый вами javascript.   -  person jondavidjohn    schedule 02.08.2011


Ответы (3)


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: я не упоминал об этом ранее, но блок switch оценивает выражение, которое вы ему передаете, поэтому нет необходимости выполнять сравнение вручную. Пример:

switch ($method) {
    // case $method === 'index':
    case 'index':
        $this->load->view('main');
    break;
}
person Wesley Murch    schedule 02.08.2011
comment
ой, ваше право конечно. Это то, что я получаю за кодирование в 2 часа ночи на контроллере, на который я не смотрел несколько дней. :) Мне придется переосмыслить эту стратегию. - person Chamilyan; 02.08.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. Конечный обработчик, который фактически выполняет все действия проверки/проверки/базы данных, является общим кодом.

person Kumar    schedule 02.08.2011
comment
Похоже, он уже делает это с константой, как и я. - person Wesley Murch; 02.08.2011
comment
Ну да, мое намерение состоит в том, чтобы указать ему на функцию/метод CI, который позаботится о том, чтобы делать то, что делаем я, вы и он. - person Kumar; 02.08.2011
comment
интересно, я не знал об этой библиотечной функции. У меня нет проблем с использованием библиотек, и, поскольку я уже загружаю ввод, я обязательно проверю его. - person Chamilyan; 02.08.2011
comment
Класс Input загружается всегда, вам не нужно загружать его вручную. - person Wesley Murch; 02.08.2011
comment
@egfx, я заметил это не более 15 дней назад, и я использую CI последние 2 года и 7 месяцев :( - person Kumar; 02.08.2011
comment
лол, я тоже. И я думал, что хорошо читаю документы CI, особенно по библиотекам, которые я загружаю. Клянусь, я впервые вижу это сам. - person Chamilyan; 02.08.2011

попробуй это ,

    $.ajax({
        type: "POST",
        url: "your function url goes here",
        data: data,
        success: function(html){
              window.location = 'redirect url goes here';
        }
   });
person Khawer Zeshan    schedule 02.08.2011
comment
да, я вижу, исходя из моего замешательства по этому вопросу, почему этот ответ имеет какой-то смысл. Добавили проверку для использования другого отдельного контроллера ajax, который предложил @kumar, так что это направление, в котором я действительно пойду. - person Chamilyan; 02.08.2011