2015-07-16 14 views
5

Tôi đang xây dựng một cửa hàng trực tuyến khá đơn giản trong SilverStripe. Tôi đang viết một chức năng để xóa một mục khỏi giỏ hàng (order trong trường hợp của tôi).Bỏ đặt phiên trong SilverStripe

thiết lập của tôi:

endpoint của tôi là trở về JSON để quan điểm để sử dụng trong 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')); 
} 

Vấn đề của tôi:

Khi tôi gửi dữ liệu đến tuyến đường này, các sản phẩm được gỡ bỏ, nhưng chỉ tạm thời, sau đó lần sau remove được gọi, mục trước đã trở lại.

Ví dụ:

đối tượng theo thứ tự:

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

Khi tôi gửi để loại bỏ product-1 tôi nhận được như sau:

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

Mà dường như đã làm việc nhưng sau đó tôi cố gắng và loại bỏ product-2 và nhận được điều này:

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

SON OF A B đã hoạt động trở lại! Khi tôi lấy toàn bộ giỏ hàng, nó vẫn chứa cả hai.

Làm cách nào để nhận được order để kết nối?

Trả lời

3

Kỳ vọng của bạn là chính xác và nó sẽ hoạt động với mã bạn đã viết. Tuy nhiên, cách dữ liệu phiên được quản lý không hoạt động tốt với dữ liệu bị xóa, bởi vì nó không được xem là thay đổi trạng thái. Chỉ dữ liệu hiện có đang được chỉnh sửa mới được xem như vậy. Xem Session :: recursivelyApply() nếu bạn muốn biết thêm. Cách duy nhất tôi biết là (không may) nhấn mạnh textmanipulate $ _SESSION trực tiếp trước khi bạn đặt giá trị mới cho 'order'

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

Ah bugger! Tôi nghĩ rằng có thể là trường hợp, có vẻ như một chút của một giám sát ... Tôi có thể có một đi theo một yêu cầu kéo cho một phương pháp unset. Dù sao, điều đó hoạt động rực rỡ ngay bây giờ. – nickspiel

Các vấn đề liên quan