Я использую структуру yii для создания картографического приложения. В этом приложении я использую GeoExt и Openlayers. В этом приложении пользователь может рисовать многоугольник и сохранять его для достижения этой цели после того, как пользователь нарисует многоугольник и щелкнет по нему (функция OpenLayers). Я отправляю многоугольник с помощью ajax для сохранения. это в базе данных, но я не могу получить какие-либо данные ajax из действия контроллера в структуре yii. См. код ниже!

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));
}

Для тестирования функциональности я создаю многоугольник на карте и нажимаю кнопку «Сохранить» после того, как эта кнопка переключается. Я нажимаю на созданный многоугольник. Я вижу объект 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 имеет значение Null!

1
user1344766 1 Авг 2012 в 02:29
Что показывает var_dump ($ _ POST) в actionTest ()? Что в Инструментах разработчика Chrome отображается как отправленное?
 – 
ernie
1 Авг 2012 в 03:06

1 ответ

Лучший ответ

Я считаю, что ваш код, вероятно, работает - добавление var_dump ($ _ POST) в actionTest () было бы хорошим местом для начала.

Поскольку вы выполняете вызов 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 ничего не будет.

2
ernie 1 Авг 2012 в 03:18
Спасибо за ваше предложение, я работаю над вашим предложением, но перед этим я редактирую свой код, который вы можете видеть выше, но я не вижу никаких данных в многоугольнике контроллера моего сайта
 – 
user1344766
1 Авг 2012 в 03:33
Я не понимаю, что вы пытаетесь сказать в своем комментарии? Как указано в моем ответе, $ this-> render () не будет возвращать данные на вашу страницу с javascript в удобной для использования форме, и если вы получите доступ к site/test, вы не выполните POST, поэтому значение будет NULL.
 – 
ernie
1 Авг 2012 в 03:35
В фреймворке Yii, если мы определяем общедоступную переменную, мы можем установить данные для тем в представлении следующим образом: widget ("ext.VehiclesListWidget.VehiclesListWidget", array ('detail' => $ detail)); ?> эта деталь является общедоступной переменной в виджете транспортного средства, и yii автоматически устанавливает $ detail для детали виджета, но в моем приведенном выше коде java-скрипт не может сделать этот подход?
 – 
user1344766
1 Авг 2012 в 03:43
Нет, javascript работает на клиенте, поэтому вы должны передать данные в javascript - он не может напрямую обращаться к каким-либо переменным в PHP (который запускается на стороне сервера).
 – 
ernie
1 Авг 2012 в 03:45
Я получаю доступ к действию тестирования контроллера сайта на другой вкладке своего браузера после того, как выполняю запрос ajax на другой вкладке! мне нужно сделать вкладку в моем браузере localhost / FleetManagement, который имеет многоугольник отрисовки карты, и после того, как я нажму на многоугольник и хочу сохранить после этого я вижу функцию успеха. Я открываю другую вкладку с этим адресом localhost / FleetManagement / index.php / site / test, но на этой вкладке отображается значение null!
 – 
user1344766
1 Авг 2012 в 03:47