2015-07-16 39 views
5

Sto costruendo un negozio online piuttosto semplice in SilverStripe. Sto scrivendo una funzione per rimuovere un articolo dal carrello (order nel mio caso).Annulla sessione in SilverStripe

La mia configurazione:

mio punto finale sta tornando JSON alla vista per l'uso in 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')); 
} 

Il mio problema:

Quando ho posto i dati a questo percorso, il prodotto viene rimosso, ma solo temporaneamente, quindi la prossima volta remove si chiama, la voce precedente è tornato.

Esempio:

oggetto Order:

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

Quando ho posto per rimuovere product-1 ricevo il seguente:

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

che sembra avere funzionato, ma poi cerco di rimuovere product-2 con e ottenere questo:

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

Il FIGLIO DI A B è tornato! Quando recupero l'intero carrello, contiene ancora entrambi.

Come si attacca lo order?

risposta

3

L'aspettativa è corretta e dovrebbe funzionare con il codice che hai scritto. Tuttavia, il modo in cui vengono gestiti i dati della sessione non funziona bene con i dati che vengono eliminati, perché non è visto come un cambiamento di stato. Solo i dati esistenti in fase di modifica sono visti come tali. Vedi Session :: recursivelyApply() se vuoi saperne di più. unico modo che conosco è quello di (purtroppo) ha sottolineato textmanipulate $ _SESSION direttamente prima di impostare il nuovo valore per l' 'ordine'

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 bastardo! Ho pensato che potrebbe essere il caso, sembra un po 'di supervisione ... Potrei avere una richiesta di pull per un metodo non impostato. Ad ogni modo, funziona perfettamente ora. – nickspiel