通过AJAX和CakePHP 2.x从DB中提取数据

时间:2012-09-22 15:41:42

标签: jquery ajax cakephp cakephp-2.0 cakephp-2.1

我正在开发一个重新商务网站,通过Javascript / jQuery从用户那里收集有关旧手机的信息。

我试图找出如何在我的QuotesController中创建一个允许我的正确方法: 1)使用jQuery / AJAX使用AJAX“post”调用它 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的网站上找到任何答案,也无法通过谷歌找到答案。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

快速解决您的情况:

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

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

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

中创建布局文件

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

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

Cache-control标头就在那里,因此ajax数据没有任何缓存。 如果您正在使用请求/响应监视工具(您应该这样做),您会注意到它现在直接将响应标识为JSON。 然后在您的视图中,您可以:

echo json_encode($quote);

根据您提供的稀缺信息,这可以解决您的情况,但是如何在CakePHP中做“json / ajax”最好?这是几个步骤。

  1. 使用Router::parseExtensions();轻松识别通过以下方式发出的请求:
  2. 检查RequestHandlerComponent的isXml()(或('ajax'))方法的内容
  3. 使用数据视图(JSON and XML views)进行响应呈现。您实际上有两个选择 - 使用data views with the serialize key或使用data view with view files。选择取决于你。
  4. 使用中央ajax布局,并使用RequestHandlerComponent::setContent($name, $type = null) - take a look here设置您喜欢的任何标头。 请注意,应在控制器的beforeFilter()中调用setContent()。