使用ajax将数据发送到控制器操作

时间:2012-07-31 22:29:25

标签: jquery extjs yii

我使用yii框架来创建地图应用程序。在这个应用程序中我使用GeoExt和Openlayers.In这个App用户可以绘制多边形并保存它以实现这个用户绘制多边形并点击它(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我看到输出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));
}

用于测试功能我在地图中创建一个多边形并在切换此按钮后单击保存按钮我单击创建的多边形我在输出文本区域中看到多边形geojson对象但是当我想在浏览器中看到多边形对象{ {1}}我只看到空! 测试视图代码:

http://localhost/FleetManagement/index.php/site/test

以下是chrome开发人员工具中的保存功能!

<?php 
    var_dump($polygon);
?>

当我调试时,我看到JQuery.ajax行执行但我不知道这行可以发送数据还是没有!因为当我看到测试视图时我只看到Null! 在上面的代码中我可以看到成功警报但我在测试视图中看不到站点控制器多边形而$ polygon是Null!

1 个答案:

答案 0 :(得分:2)

我相信你的代码可能正常工作 - 在actionTest()中添加一个var_dump($ _ POST)将是一个很好的起点。

由于您正在进行AJAX调用,因此$ this-&gt; 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中没有任何内容。