Ошибка доступа к данным post json в yii2

Я передаю данные в yii2, используя запрос ajax, но я продолжаю получать ошибку 500

Это код запроса ajax:

<?php 
 $script = <<< JS

     $('form#forward_pr').on('beforeSubmit', function(e){
    var keys = $('#grid').yiiGridView('getSelectedRows');
     $.post({
       url: "forwardpr", // your controller action
       dataType: 'json',
       data: {keylist: keys},
       success: function(data) {
          alert('I did it! Processed checked rows.')
       },
     error: function(err){
       console.log("server error");
       }
    });
       return false;
    }  ) ;

    JS;
    $this->registerJS($script);
 ?>

Когда я делаю console.log(keys), это возвращает

[0, 1]

Это мой код контроллера:

if (Yii::$app->request->post()) {
         echo $post = json_encode($_POST['keys']);
          if (isset($_POST['keylist'])) {
                $keys = \yii\helpers\Json::decode($_POST['keylist']);
              print_r($keys);
            }else{
              echo "1";
          }

Приведенное выше всегда выполняет ошибочную часть почтового запроса. Что может быть не так;


person Geoff    schedule 05.08.2016    source источник
comment
добавьте закодированную строку json, которую вы хотите декодировать.   -  person Insane Skull    schedule 05.08.2016
comment
Напишите точный код   -  person Geoff    schedule 05.08.2016
comment
извините, череп, я хочу расшифровать значения $keys   -  person Geoff    schedule 05.08.2016
comment
Попробуйте изменить URL-адрес ajax, например контроллер/метод, и попробуйте один раз, пожалуйста.   -  person Manikandan S    schedule 06.08.2016


Ответы (2)


Вы отправляете свой JSON в виде закодированного (почтового) тела данных, а не пар ключ-значение. Так что ваш подход не работает таким образом.

Есть два варианта исправить это:

  1. преобразовать ваш контроллер в службу RESTful
  2. в вашем контроллере используйте тело JSON, а не параметры POST

В то время как первый вариант предпочтительнее в долгосрочной перспективе, второй вариант довольно прост в качестве быстрого исправления.

Во-первых, убедитесь, что вы настроили свое приложение для анализа основного содержимого JSON. IN config.php добавьте это в массив components:

'request' => [
    'parsers' => [
        'application/json' => 'yii\web\JsonParser',
    ]
]

Затем в вашем контроллере используйте это, чтобы получить параметры JSON:

$model->load(Yii::$app->getRequest()->getBodyParams());
person jlapoutre    schedule 08.08.2016
comment
Спасибо, мне пришлось изменить его, чтобы отдохнуть в форме API - person Geoff; 07.09.2016
comment
Отличный ответ!! Работал на меня! - person Alexandre Justino; 09.10.2017

Я новичок .. Но я также хочу использовать столбцы флажков в представлении сетки (версия Kartik). 1-я вещь.

Вместо того, чтобы писать

var keys = $('#grid').yiiGridView('getSelectedRows');

я должен написать

var keys = $('#w4').yiiGridView('getSelectedRows');

2-я вещь. В контроллере вы можете обработать список ключей, но не пытайтесь его декодировать, просто используйте его следующим образом:

        $keys = $_POST['keylist'];

и кажется, это работает для меня!

Извините за мой английский..

person cncvikto    schedule 06.09.2016