Я пытаюсь распаковать свой json-объект, отправленный через http post-запрос в контроллере php:

        $products = $_POST['products'] ?? '';

        foreach($products as $purchase){
        $productId =$purchase['productid'];
        $qty = $purchase['quantity'];
        $params = array(
                      'form_key' => $this->formKey->getFormKey(),
                      'product' => $productId,
                      'qty'   => $qty
                  );
          //Load the product based on productID
          $_product = $this->product->load($productId);
          $this->cart->addProduct($_product, $params);
          $this->cart->save();
      }

Это формат моего отправляемого json-объекта, который хранится в переменной с именем list.

0: {productid: "2910", quantity: "2"}
1: {productid: "2911", quantity: "1"}
2: {productid: "2913", quantity: "4"}
3: {productid: "2914", quantity: "3"}

Это мой почтовый запрос (тип содержимого также установлен на application/json):

$.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      products:list,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });

Это всегда работало для меня раньше, поэтому я не вижу, где я ошибаюсь.

Я получаю ошибку Warning: Invalid argument supplied for foreach(). но я предполагаю, что это как-то связано с моим объектом json.

РЕДАКТИРОВАТЬ:

$("#AddToCartButton").click(function(){
   var list = [];
   $("#tabCollection :input").each(function(){
   var input = $(this);
    if($(this)[0].value > 0){
      var myArray = {'productid': $(this)[0].id, 'quantity': $(this)[0].value};
      list.push(myArray);
    }
   });
   var JSONStringlist = JSON.stringify(list);
   var JSONlist = JSON.parse(JSONStringlist);
   console.log(JSONlist);

   $.ajaxSetup({
      headers:{
       'Content-Type': "application/json",
      }
   });

   $.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      "products":JSONlist,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });
  });

РЕДАКТИРОВАТЬ 2:

Пример строки JSON:

[{"productid":"2182","quantity":"1"},{"productid":"2183","quantity":"1"},{"productid":"2184","quantity":"1"},{"productid":"2185","quantity":"1"}]
0
user5836372 14 Фев 2018 в 18:43

1 ответ

Лучший ответ
    $products = $_POST['products'] ?? '';

    foreach($products as $purchase){

Ваш $ products - это либо «что-то повторяющееся», либо пустая строка.

В случае, если это массив, он повторяется, и foreach будет успешно выполнен. Но в случае, если это пустая строка, она будет жаловаться на «Предупреждение: недопустимый аргумент для foreach ()», потому что строка на самом деле не является итерируемой.

Итак, что вам нужно сделать, это убедиться, что $ products всегда является массивом, либо пустым, либо заполненным объектами json.

Если вы измените:

$products = $_POST['products'] ?? '';

Чтобы :

$products = json_decode($_POST['products']) ?? array();

Foreach не будет жаловаться, и если $ _POST ['products'] пуст, ничего не будет сохранено в корзине.

В вашем файле javascript измените:

$.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      "products":JSONlist,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });
  });

Чтобы :

$.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      "products":JSONStringlist,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });
  });

Вы анализируете объект JavaScript до JSON, а затем повторно анализируете его до объекта JavaScript.

PHP на самом деле не понимает объекты JavaScript, но понимает объекты JSON.

0
Rubatharisan Thirumathyam 14 Фев 2018 в 19:25