1

我正在一个电子商务网站上工作,该网站通过 Javascript/jQuery 从用户那里收集有关使用过的手机的信息。

我试图弄清楚如何在我的 QuotesController 中创建一个正确的方法,该方法将允许我:1)使用 jQuery/AJAX 使用 AJAX“发布”调用它 2)返回报价数据,以便我可以显示价格用户

这是我到目前为止所拥有的: jQuery 函数调用:

var data =
    {
        device_id: quote['device_id'], 
        carrier_id: quote['carrier_id'], 
        condition_id: quote['condition_id'], 
        size: quote['size']
    };

    // Pull quote using AJAX
    $.ajax({
        type: "post",
        url: "/c4c/quotes/get_quote",
        data: data,
        dataType: 'json',
        success: function(data, textStatus, jqXHR){
            alert('success');
            alert(jqXHR.responseText);
            $('#quote').html(jqXHR.responseText);
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert('error');
            alert(jqXHR.responseText);
            $('#quote').html(jqXHR.responseText);
        }
    });

QuotesController 中的方法:

        // Gets a quote's price via ajax
    public function get_quote(){
    $this->layout = 'ajax';

    $device_id = $this->request->data['device_id'];
    $carrier_id = $this->request->data['carrier_id'];
    $condition_id = $this->request->data['condition_id'];
    $size = $this->request->data['size'];

    // Get quote
    $quote = $this->Quote->find('first', array('conditions'=>array('Quote.device_id'=>$device_id,
                                                                   'Quote.carrier_id'=>$carrier_id,
                                                                   'Quote.condition_id'=>$condition_id,
                                                                   'Quote.size'=>$size,
                                                                    )));

    $this->set('quote',$quote);

    //$this->render('get_quote');
    return json_encode($quote);
}

我不断收到错误,所以我知道我在做什么是错误的,但我似乎无法在 CakePHP 的网站上找到任何答案,也无法通过谷歌找到任何答案。

任何帮助将非常感激!

4

1 回答 1

0

针对您的情况的快速解决方法是:

首先不要这样做return json_encode($quote);- 为 ajax 响应创建一个视图文件。它应该位于:App/View/Quotes/Ajax/get_quote.ctp

然后设置响应变量: $this->set('quote', $quote);

您还需要设置一些标题,因为我怀疑您使用的默认 ajax 布局只是一个空布局。在以下位置创建布局文件:App/View/layouts/ajax.ctp

您可以使用基本的 PHPheader()函数来执行此操作:

header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
header('Content-Type: application/json');
echo $content_for_layout;

缓存控制标头在那里,因此对于 ajax 数据没有任何缓存。如果您正在使用请求/响应监控工具(您应该这样做),您会注意到现在它直接将响应标识为 JSON。然后在您看来,您可以:

echo json_encode($quote);

根据您提供的稀缺信息,这应该可以解决您的问题,但是如何在 CakePHP 中“最好使用 json/ajax”?这里有几个步骤。

  1. 使用Router::parseExtensions(); 通过以下方式轻松识别传入的请求:
  2. 检查RequestHandlerComponent的 isXml() (或 is('ajax')) 方法的内容
  3. 使用数据视图(JSON 和 XML 视图)进行响应呈现。您实际上有两个选择 - 使用带有序列化键的数据视图或使用带有视图文件的数据视图。这个选择由你。
  4. 使用中央 ajax 布局,并设置您喜欢的任何标题RequestHandlerComponent::setContent($name, $type = null)-看看这里。请注意,应该在控制器的 beforeFilter() 中调用 setContent()。
于 2012-09-23T07:34:46.557 回答