【问题标题】:_remap ignoring IS_AJAX call?_remap 忽略 IS_AJAX 调用?
【发布时间】:2011-08-02 17:06:58
【问题描述】:

这个问题很可能是 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);
   });

【问题讨论】:

  • 需要了解更多情况,请发布您的控制器和您正在使用的 javascript。

标签: ajax codeigniter post controller remap


【解决方案1】:

您可以依赖http://codeigniter.com/user_guide/libraries/input.html 中的$this->input->is_ajax_request() 而不是做这一切。如果您对加载库不感兴趣,这里有一些类似的代码,我至少在过去两年的生产中使用过。

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

查看字符串,它的XMLHttpRequest 和jQuery 是前端JS 工具包

再补充一点,我通常有一个 Ajax 调用的入口点,所以显然我有一个用于 ajax 的控制器并通过它路由我的所有调用。我为什么要这么做?原因很简单,如果 JS 关闭,我确保我的所有表单都提交给服务器上的简单非 ajax 表单处理程序。如果 JS 打开,jQuery/prototype/YUI 会控制并将数据发送到我的 ajax 控制器。实际执行所有验证/验证/数据库交互的最终处理程序是通用代码。

【讨论】:

  • 看起来他已经在用常数做这件事了,我也是这样做的。
  • 嗯,是的,我的目的是向他指出 CI 功能/方法,该功能/方法负责完成我、你和他正在做的事情。
  • 有趣,我不知道那个库函数。我使用库没有问题,因为我已经在加载输入,我一定会检查一下。
  • Input 类总是被加载,你不必手动加载它。
  • @egfx,我在不超过 15 天前注意到它,并且在过去 2 年零 7 个月里我一直在使用 CI :(
【解决方案2】:
case $method == 'IS_AJAX':

您的$method 不是IS_AJAX 与此网址:

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

这会将您带到redirect 控制器,而无需方法(默认为“索引”)。你真的需要:

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

...进入case。您似乎将您的 constant IS_AJAX 与请求的方法混淆了,您在检查 index 时似乎正确使用了该方法(尽管这与 default 情况相同,所以它是多余的)。

$method,或任何你在_remap() 中命名的第一个参数,将始终是被调用的路由控制器函数。

编辑:我之前没有提到这一点,但是 switch 块会评估您传递给它的表达式,因此无需手动进行比较。示例:

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

【讨论】:

  • 哇,当然是你的权利。这就是我在凌晨 2 点在我几天没看过的控制器上进行编码的结果。 :) 我将不得不重新考虑这个策略。
【解决方案3】:

试试这个,

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

【讨论】:

  • 是的,基于我对为什么这个答案有意义的问题的困惑,我明白了。已添加验证以使用 @kumar 建议的另一个单独的 ajax 控制器,这就是我实际采用的方向。
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 2019-05-01
  • 2012-02-09
  • 2022-11-25
  • 2011-05-15
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多