Эта проблема, скорее всего, специфична для 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);
});
Ответ 1 · рейтинг 1 · Wesley Murch
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;
}
Ответ 2 · рейтинг 2 · Kumar
Вместо всего этого вы можете положиться на $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. Конечный обработчик, который фактически выполняет все действия проверки/проверки/базы данных, является общим кодом.