1

私は yii フレームワークを使用してマップ アプリケーションを作成します。このアプリケーションでは、GeoExt と Openlayers を使用します。このアプリでは、ユーザーが多角形を描画して保存し、ユーザーが多角形を描画してクリックした後にこれを保存できます (OpenLayers 機能) ajax で多角形を送信して保存しますそれはデータベースにありますが、yiiフレームワークのコントローラーアクションから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);
    }

保存関数では、yii Chtml::ajax を使用してポリゴンを Yii サイト コントローラに送信します。この php コードでは、テスト アクションにポリゴンを送信します。 . 関数の最後に $("#output").val(str); を使用します。geojson str varをテストするために、出力テキストエリアに出力が表示されますが、データがコントローラーアクションに送信されない理由がわかりません! コントローラ アクション コード

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

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

機能をテストするために、マップにポリゴンを作成し、このボタンを切り替えた後、[保存] ボタンをクリックします。作成したポリゴンをクリックします。出力テキストエリアにポリゴン geojson オブジェクトが表示されますが、ブラウザーでポリゴン オブジェクトを表示したい場合は、http://localhost/FleetManagement/index.php/site/testNull のみが表示されます。 !! テスト ビュー コード:

<?php 
    var_dump($polygon);
?>

以下はクロム開発者ツールの保存機能です!

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 が Null です。

4

1 に答える 1

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 には何も含まれていません。

于 2012-07-31T23:18:30.160 に答える