2015-07-16 44 views
5

SilverStripe'de oldukça basit bir çevrimiçi mağaza yapıyorum. Sepetteki bir öğeyi kaldırmak için bir işlev yazıyorum (benim durumumda order).SilverStripe'de oturum açma oturumu açma

Benim kurulumu: ajax kullanılmak üzere görünüme

Benim uç nokta dönüyor JSON.

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')); 
} 

Sorunum:

Ben bu rota veri göndermek, ürün ama sadece geçici bir sonraki sefer kaldır denir kaldırılan alır, önceki öğe geri döndü.

Örnek:

al nesnesi:

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

Ben şu olsun product-1 kaldırmak sonrası: görünür

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

çalışmış olmak ama sonra denemek ve product-2 ile kaldırın ve şunu edinin:

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

A B SONU GERİ! Tüm arabayı aldığımda, hala her ikisini de içerir.

order nasıl takılır?

cevap

3

Beklentiniz doğrudur ve yazdığınız kodla çalışmalıdır. Bununla birlikte, oturum verilerinin yönetilme şekli, silinmiş verilerle iyi çalışmaz, çünkü durum bir değişiklik olarak görülmez. Sadece mevcut olan veriler düzenlenmiştir. Daha fazla bilgi edinmek için bkz. Oturum :: recursivelyApply(). Bildiğim tek yolu (maalesef) Eğer 'sipariş'

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 kahretsin için yeni değer belirlemeniz doğrudan önce textmanipulate $ _SESSION vurguladı etmektir! Durumun böyle olabileceğini düşündüm, bir gözetim gibi göründü ... Bir çekişme yöntemi için bir çekme isteğine sahip olabilirim. Her neyse, şimdi harika çalışıyor. – nickspiel