desenv-web-rp.com

Atualize a quantidade do mesmo item na sessão em vez de adicionar um novo

Eu uso o seguinte código no meu controlador para adicionar itens de produto à sessão:

$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);

Funciona, mas se eu adicionar o mesmo produto com o mesmo ID à sessão mais uma vez, ele não atualizará a quantidade desse produto, mas adicionará o mesmo produto que o novo item. Então, eu preciso de algo como:

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

Não funciona, é claro

1
stckvrw

Solução A: estrutura de matriz ligeiramente ajustada

Você possui apenas o itemid e a quantidade correspondente em sua matriz. Por que você não usa o itemid como índice de matriz ($ cart ['items'] [<ITEMID>]) para poder atualizar facilmente sua quantidade se o índice já existe.

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

Algo como

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

Solução B: Faça um loop pela estrutura de matriz existente

Caso contrário, você precisará percorrer sua matriz, localize o item com o itemid correto e atualize sua quantidade, assim:

$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