2015-07-16 5 views
5

Я строю довольно простой интернет-магазин в SilverStripe. Я пишу функцию, чтобы удалить элемент из корзины (order в моем случае).Неудачная сессия в SilverStripe

Моя установка:

Моя конечная точка возвращается в формате 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')); 
} 

Мой вопрос:

Когда я отправляю данные по этому маршруту, продукт получает удален, но только временно, то в следующий раз удалить называется, предыдущий элемент возвращается.

Пример:

объект 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' 
    } 
} 

СЫН А Б вернулся! Когда я извлекаю всю корзину, она все еще содержит оба.

Как получить order?

ответ

3

Ваше ожидание верно, и оно должно работать с кодом, который вы написали. Однако способ управления данными сеанса плохо работает с удаляемыми данными, поскольку он не рассматривается как изменение состояния. Только существующие редактируемые данные рассматриваются как таковые. См. Session :: recursivelyApply(), если вы хотите узнать больше. Только так я знаю, что это (к сожалению) подчеркнул 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')); 
} 
+0

Ах мудак! Я думал, что это может быть так, похоже, немного надзор ... Я мог бы пойти по запросу на отмененный метод. В любом случае, это блестяще работает сейчас. – nickspiel

Смежные вопросы