在SilverStripe中取消设置会话

时间:2015-07-16 00:27:02

标签: session silverstripe

我正在SilverStripe建立一个非常简单的在线商店。我正在编写一个从购物车中删除商品的功能(在我的情况下为order)。

我的设置:

我的端点正在将JSON返回到视图以便在ajax中使用。

public function remove() {

    // Get existing order from SESSION
    $sessionOrder = Session::get('order');

    // Get the product id from POST
    $productId = $_POST['product'];

    // Remove the product from order object
    unset($sessionOrder[$productId]);

    // Set the order session value to the updated order
    Session::set('order', $sessionOrder);

    // Save the session (don't think this is needed, but thought I would try)
    Session::save();

    // Return object to view
    return json_encode(Session::get('order'));
}

我的问题:

当我将数据发布到此路线时,产品会被移除但只是暂时移动,然后下次调用移除时,前一个项目又回来了。

示例:

订单对象:

{
  product-1: {
    name: 'Product One'
  },
  product-2: {
    name: 'Product Two'
  }
}

当我发帖删除product-1时,我会收到以下信息:

{
  product-2: {
    name: 'Product Two'
  }
}

这似乎有效,但后来我尝试删除product-2并获取此信息:

{
  product-1: {
    name: 'Product One'
  }
}

A的SON回来了!当我检索整个购物车时,它仍然包含两者。

如何让order坚持下去?

1 个答案:

答案 0 :(得分:3)

您的期望是正确的,它应该与您编写的代码一起使用。但是,管理会话数据的方式不适用于要删除的数据,因为它不被视为状态的更改。只有正在编辑的现有数据才会被视为。如果您想了解更多信息,请参阅Session :: recursivelyApply()。 我知道的唯一方法就是(不幸的是)在为'order'设置新值之前直接强调textmanipulate $ _SESSION

public function remove() {

  // Get existing order from SESSION
  $sessionOrder = Session::get('order');

  // Get the product id from POST
  $productId = $_POST['product'];

  // Remove the product from order object
  unset($sessionOrder[$productId]);
  if (isset($_SESSION['order'])){
    unset($_SESSION['order']);
  }
  // Set the order session value to the updated order
  Session::set('order', $sessionOrder);

  // Return object to view
  return json_encode(Session::get('order'));
}