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 代码中我发送带有“数据”的多边形进行测试,但实际上我想发送 str 变量,即多边形 geojson 对象到控制器操作. 在函数结束时,我使用 $("#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/test我只看到 Null !!测试视图代码:

<?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 为空!

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 回答