web-dev-qa-db-fra.com

Mettre à jour la quantité du même article dans la session au lieu d'en ajouter un

J'utilise le code suivant dans mon contrôleur pour ajouter des éléments de produit à la session:

$app = JFactory::getApplication();
$input = $app->input;
$itemid = $input->get('itemid');
$quan = $input->get('quan');
$session = JFactory::getSession();
$cart = $session->get('cart', array());
$cart['items'][] = array('itemid' => $itemid, 'quan' => $quan);
$session->set('cart', $cart);

Cela fonctionne, mais si j'ajoute le même produit avec le même ID à la session une fois de plus, il ne met pas à jour la quantité d'un tel produit mais ajoute le même produit en tant que nouvel élément. J'ai donc besoin de quelque chose comme:

if($itemid == 'itemid') {
    $cart['items'][] = array('quan' => 'quan'+$quan); // i.e. current quan + new quan
} else {
    $cart['items'][] = array('itemid' => $itemid, 'quan' => $quan);
}

Ça ne marche pas bien sur

1
stckvrw

Solution A: Structure de tableau légèrement ajustée

Vous avez seulement votre itemid et la quantité correspondante dans votre tableau. Pourquoi n'utilisez-vous pas l'id itemid en tant qu'index de tableau ($ cart ['items'] [<ITEMID>]) afin de pouvoir facilement mettre à jour votre quantité si l'index existe déjà.

$cart['items'][100] = 10
$cart['items'][236] = 5
  your itemid --^     ^-- your quantity

Quelque chose comme

if (isset($cart['items'][$itemid]))
{
    $cart['items'][$itemid] = $cart['items'][$itemid] + $quan;
}
else 
{
    $cart['items'][$itemid] = $quan;
}

Solution B: boucle à travers la structure de tableau existante

Sinon, vous devez parcourir votre tableau, trouver l'élément avec le bon itemid et mettre à jour sa quantité, comme ceci:

$app = JFactory::getApplication();
$input = $app->input;
$itemid = $input->get('itemid');
$quan = $input->get('quan');
$session = JFactory::getSession();
$cart = $session->get('cart', array());
$found = false;

if (isset($cart['items']) && !empty($cart['items']))
{
    foreach ($cart['items'] as &$item)
    {
        if ($item['itemid'] == $itemid)
        {
            $item['quan'] += $quan;
            $found = true;
            break;
        }
    }
}

if (!$found) 
{
    $cart['items'][] = array('itemid' => $itemid, 'quan' => $quan);
}

$session->set('cart', $cart);
3
fruppel