【问题标题】:magento ajax isn't workingmagento ajax 不工作
【发布时间】:2014-02-05 15:47:18
【问题描述】:

我的控制器里面有这个功能:

public function saveLeadDaysAction(){
        echo "works";
    }

在模板 phtml 中我正在尝试这样做:

jq("#prodcal_leaddays").on("blur", function(e){
        $saveurl="<?=$this->getUrl('prodcal/adminhtml_prodcaltab/saveLeadDays');?>";
        console.log('$saveurl');
        jq.post($saveurl,{'id':'test'},function(d){
            console.log(d);
        });
    });

该 url 似乎返回了整个管理仪表板页面,而不是预期的 works 文本。但是,如果我直接在浏览器中打开 url,它会显示预期的文本。

我做错了什么?

哦,我已经尝试在 URL 末尾附加 ?isAjax=true,它返回:

{"error":true,"message":"Invalid Form Key. Please refresh the page."}

编辑: 澄清一下:- getUrl 在控制台中生成一个类似 http://localhost/devmagento/index.php/prodcal/adminhtml_prodcaltab/saveLeadDays‌​/key/d3c92257c664d8d207f5a0bdeb3edebf/ 的 URL。 如果我从控制台复制此 url 并将其粘贴到浏览器中,它会按预期工作,我会得到 works 文本。 但是当与 jQuery post 一起使用时,它会失败并重定向到仪表板。

编辑 2: 似乎与发布数据,键是错误的,因为如果我将上面的内容更改为使用GET,并将值放在getUrl 函数中,它可以正常工作,但问题是由于这是由 ajax 完成的,我需要使用 javascript 动态更改值。

我为 get 工作所做的事情是:

jq("#prodcal_leaddays").on("blur", function(e){
        $saveurl="<?=$this->getUrl('prodcal/adminhtml_prodcaltab/saveLeadDays',array('id'=>'test'));?>";
        console.log($saveurl);
        jq.get($saveurl,function(d){
            console.log(d);
        });
    });

【问题讨论】:

    标签: php jquery ajax magento


    【解决方案1】:

    您可以使用 POST ajax 请求,但您必须将 ?isAjax=1 添加到 url 并将 form_key 添加到参数。示例:

    var values = {
        'form_key': "<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"
        // ...
    };
    $jq.post('<?php echo Mage::helper('adminhtml')->getUrl("..."); ?>?isAjax=1', values);
    

    【讨论】:

    • 大部分管理页面也可以使用var values = {'form_key':FORM_KEY};,因为已经在头部设置了FORM_KEY js变量。
    【解决方案2】:

    这段代码生成的网址:

    $this->getUrl('prodcal/adminhtml_prodcaltab/saveLeadDays')
    

    找不到,因此您被重定向到仪表板。如果您手动尝试,您没有key 函数自动添加的key 变量,因此您会收到该错误。 key 是一种会话控制器,并且总是在变化。

    要获得正确的控制器操作,您必须检查文件结构。与您的getUrl 参数一样,它应该是/app/code/local(或community)/YourName/Prodcal/controllers/Adminhtml/ProdcaltabController.php

    以这种方式返回您的回复:

    $array = array('works');    
    $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($array));
    

    【讨论】:

    • 如果我从控制台日志中复制 url 并将其手动粘贴到浏览器中,则会找到该 URL。所以动作和控制器都到位了。
    • 1) 为粘贴的 url 添加一个假字符,如果您作为管理员没有任何限制,您将被重定向到仪表板。你的测试无效。 2) 如果 URL 有效并且即使在 Magento 中找不到内容主体,也会始终找到该 URL,并将其替换为仪表板。我更新了答案,以确保您的回复有正文。
    • PS:我建议您在问题中添加您从控制台日志中复制/粘贴 URL。
    • 确定我们在同一个页面上,getUrl 返回一个 url,如:http://localhost/devmagento/index.php/prodcal/adminhtml_prodcaltab/saveLeadDays/key/d3c92257c664d8d207f5a0bdeb3edebf/,如果我将它粘贴到浏览器中,它会显示[works],但在 jquery 帖子中调用,它重定向到仪表板。我将您的代码粘贴到控制器中,但没有任何变化。
    • 我想这在功能上是一个后端,因为我在路径中看到了 adminhtml 并且您谈到了仪表板。您的 url 不显示后端的位置,通常是 'admin/'。尝试在 prodcal 之前添加它。这不应该是必要的,但可能会起作用。可能模块配置中缺少语句。
    【解决方案3】:

    我也遇到了同样的问题,直接把form_key添加到url就解决了:

    $saveurl="<?=$this->getUrl('prodcal/adminhtml_prodcaltab/saveLeadDays');?>form_key=" + window.FORM_KEY;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多