使用AJAX的Kohana获得请求

时间:2014-05-09 13:32:59

标签: php jquery ajax kohana kohana-3

我是Kohana / php世界的新手,我遇到了一些了解如何获取ajax请求结果的问题。正在通过单击操作调用此请求,并且正在调用以下方法。

function addClickHandlerAjax(marker, l){
  google.maps.event.addListener(marker, "click",function(){
    console.log(l.facilityId);
     removeInfoWindow();
     //get content via ajax
      $.ajax({
      url: 'map/getInfoWindow',
      type: 'get',
      data: {'facilityID': l.facilityId },
      success: function(data, status) {
        if(data == "ok") {
          console.log('ok');
        }
      },
      error: function(xhr, desc, err) {
        console.log(xhr);
        console.log("Details: " + desc + "\nError:" + err);
      }
    }); // end ajax call

});
}

我的控制器里面有一个方法

       public function action_getInfoWindow(){

      if ($this->request->current()->method() === HTTP_Request::GET) {

        $data = array(
            'facility' => 'derp',
        );

        // JSON response
        $this->auto_render = false;
        $this->request->response = json_encode($data);

    }
  }

我在fiddler中看到一个HTTP请求,它传递了正确的facilityID参数。但是,我对如何将所有部分连接在一起有一些脱节。

1 个答案:

答案 0 :(得分:3)

要向浏览器发送回复,您应该使用Controller::response而不是Controller::request::response。所以你的代码应该是这样的:

public function action_getInfoWindow() {
    // retrieve data
    $this->response->body(json_encode($data));
}

那应该给你一些输出。

查看Documentation以获取更多详细信息。

修改

你可以做些什么,让你的生活更轻松,特别是如果你要经常使用ajax请求,就是创建一个Ajax控制器。你可以填写所有的检查和变换,而不再担心它。示例控制器可能如下所示。另请查看Kohana作为示例提供的Controller_Template

class Controller_Ajax extends Controller {
    function before() {
        if( ! $this->request->is_ajax() ) {
            throw Kohana_Exception::factory(500, 'Expecting an Ajax request');
        }
    }

    private $_content;

    function content($content = null) {
        if( is_null( $content ) ) {
            return $this->_content;
        }
        $this->_content = $content;
    }

    function after() {
        $this->response->body( json_encode( $this->_content ) );
    }
}

// example usage
class Controller_Home extends Controller_Ajax {
    public function action_getInfoWindow() {
        // retrieve the data
        $this->content( $data );
    }
}