2012-07-31 52 views
1

我使用yii框架來創建地圖應用程序。在這個應用程序中,我使用GeoExt和Openlayers.In此應用程序用戶可以繪製多邊形並保存這個實現這個後用戶繪製多邊形並點擊它( OpenLayers功能)我發送多邊形與ajax保存在數據庫,但我不能從控制器操作在yii框架中獲取任何ajax數據。請參閱下面的代碼!用ajax發送數據到控制器動作

var selectOptions = { 
      clickout: true, 
      onSelect: save 
     }; 
     select = new OpenLayers.Control.SelectFeature(vectors, selectOptions); 
     map.addControl(select); 
var saveButton = new Ext.Button({ 
      text: 'Save', 
      enableToggle: true, 
      toggleGroup: toggleGroup, 
      handler: function(toggled) 
      { 
       if(toggled){ 
        polygon.deactivate(); 
        modify.deactivate(); 
        select.activate(); 
       } 
      } 
function save(feature) { 
     var geojson_format = new OpenLayers.Format.GeoJSON(); 
     var str = geojson_format.write(feature, true); 
     Ext.MessageBox.prompt('Name', 'Please enter district name:', "Ok"); 
     <?php 
      echo CHtml::ajax(array(
       'url'=>array('site/test'), 
       'data'=>array('polygon'=>'data'), 
       'type'=>'POST', 
       'success'=>"function(){ 
         alert('ok'); 
        }" 
      )); 
     ?> 
     $("#output").val(str); 
    } 
在保存功能

我用警予的cHTML ::阿賈克斯送多邊形的Yii站點控制器測試動作在這個PHP代碼我送多邊形「數據」進行測試,但在真正的我想給海峽變量是多邊形geojson對象到控制器action.At函數的結尾我使用$(「#output」)。val(str);測試geojson str var我看到輸出textarea的輸出,但我不知道爲什麼數據不會發送到控制器操作! 控制器動作代碼

class SiteController extends Controller 
    { 
public $polygon; 
public function actionTest() 
    { 
     if(isset($_POST['polygon'])) 
      $this->polygon=$_POST['polygon']; 

     $this->render("test", array('polygon'=>$this->polygon)); 
} 

測試功能我創建的地圖多邊形,然後點擊保存按鈕後,該按鈕是切換我點擊創建多邊形我看到在輸出textarea的多邊形GeoJSON的對象,但是當我想在http://localhost/FleetManagement/index.php/site/test的瀏覽器中看到多邊形對象,我只看到空! 測試視圖代碼:

<?php 
    var_dump($polygon); 
?> 

下面是保存功能在Chrome開發者工具!

function save(feature) { 
     var geojson_format = new OpenLayers.Format.GeoJSON(); 
     var str = geojson_format.write(feature, true); 
     Ext.MessageBox.prompt('Name', 'Please enter district name:', "Ok"); 
     jQuery.ajax({'url':'/FleetManagement/index.php/site/test','data':{'polygon':'data'},'type':'POST','cache':false});   $("#output").val(str); 
    } 

當我調試我看到JQuery.ajax行執行,但我不知道這行可以發送數據或不!因爲當我看到測試視圖時,我只能看到Null! 在上面的代碼中,我可以看到成功警報,但我無法在測試視圖中看到站點控制器多邊形,$ polygon是空的!

+0

var_dump($ _ POST)在actionTest()中顯示的是什麼? Chrome開發人員工具顯示的提交內容是什麼? – ernie 2012-07-31 23:06:59

回答

2

我相信你的代碼可能工作 - 在actionTest()中添加一個var_dump($ _ POST)將是一個很好的開始。

由於您正在進行AJAX調用,因此$ this-> render()不會按照您的期望返回到瀏覽器。我會想象在Chrome開發人員工具,網絡標籤,然後是響應標籤中,您會看到「數據」。

在一般情況下,找回數據,你想要的東西,如:

public function actionTest() 
{ 
    if(isset($_POST['polygon'])) 
     $polygon = $_POST['polygon']; 
    else 
     $polygon = NULL; 
    echo CJSON::encode(array('polygon'=>$polygon)); 
} 

要訪問返回的數據,你可以在你的AJAX技術,例如使用回調:

 <?php 
     echo CHtml::ajax(array(
      'url'=>array('site/test'), 
      'data'=>array('polygon'=>'data'), 
      'type'=>'POST', 
      'dataType': 'json', 
      'success' : "function(data) { console.log(data.polygon) }", 
     )); 
    ?> 

這會將多邊形的值記錄到控制檯。 。 。修改成功函數將其輸出到更有用的地方。

由於您直接在瀏覽器中通過地址欄訪問site/test,您的當前方法聽起來好像失敗了,這意味着$ _POST中不會有任何內容。

+0

感謝您的建議我工作的建議,但在此之前,我編輯我的代碼,你可以看到上面,但我看不到我的網站控制器多邊形中的任何數據 – user1344766 2012-07-31 23:33:07

+0

我不明白你在評論中說什麼?正如我的回答中所述,$ this-> render()不會將數據返回到您的頁面,且javascript可用,並且如果您訪問'site/test',則不會執行POST,因此該值將爲空。 – ernie 2012-07-31 23:35:04

+0

在Yii框架中,如果我們定義了公共變量,我們可以像這樣在視圖中設置數據爲主題小部件(「ext.VehiclesListWidget.VehiclesListWidget」, array('detail'=> $ detail)); ?>詳細信息是車輛小部件中的公共變量,yii將$ detail自動設置爲小部件細節,但在我的上述代碼中,java腳本不能執行此方法? – user1344766 2012-07-31 23:43:04