以编程方式创建/检索购物车

Don*_*sto 1 prestashop

对于我正在编写的模块,我需要在调用链接并传递一些数据之后为某个用户检索购物车(不需要注册).
我的想法是收回以前通过的ID,可以帮助我识别某个购物车.

我最大的问题是我已经搜索了很多代码购物车创建到prestashop.最后我发现了一些东西

/* Cart already exists */
if ((int)$this->context->cookie->id_cart)
{
    $cart = new Cart($this->context->cookie->id_cart);
    if ($cart->OrderExists())
    {
        unset($this->context->cookie->id_cart, $cart, $this->context->cookie->checkedTOS);
        $this->context->cookie->check_cgv = false;
    }
    /* Delete product of cart, if user can't make an order from his country */
    elseif (intval(Configuration::get('PS_GEOLOCATION_ENABLED')) &&
            !in_array(strtoupper($this->context->cookie->iso_code_country), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))) &&
            $cart->nbProducts() && intval(Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR')) != -1 &&
            !FrontController::isInWhitelistForGeolocation() &&
            !in_array($_SERVER['SERVER_NAME'], array('localhost', '127.0.0.1')))
        unset($this->context->cookie->id_cart, $cart);
    // update cart values
    elseif ($this->context->cookie->id_customer != $cart->id_customer || $this->context->cookie->id_lang != $cart->id_lang || $currency->id != $cart->id_currency)
    {
        if ($this->context->cookie->id_customer)
            $cart->id_customer = (int)($this->context->cookie->id_customer);
        $cart->id_lang = (int)($this->context->cookie->id_lang);
        $cart->id_currency = (int)$currency->id;
        $cart->update();
    }
    /* Select an address if not set */
    if (isset($cart) && (!isset($cart->id_address_delivery) || $cart->id_address_delivery == 0 ||
        !isset($cart->id_address_invoice) || $cart->id_address_invoice == 0) && $this->context->cookie->id_customer)
    {
        $to_update = false;
        if (!isset($cart->id_address_delivery) || $cart->id_address_delivery == 0)
        {
            $to_update = true;
            $cart->id_address_delivery = (int)Address::getFirstCustomerAddressId($cart->id_customer);
        }
        if (!isset($cart->id_address_invoice) || $cart->id_address_invoice == 0)
        {
            $to_update = true;
            $cart->id_address_invoice = (int)Address::getFirstCustomerAddressId($cart->id_customer);
        }
        if ($to_update)
            $cart->update();
    }
}

if (!isset($cart) || !$cart->id)
{
    $cart = new Cart();
    $cart->id_lang = (int)($this->context->cookie->id_lang);
    $cart->id_currency = (int)($this->context->cookie->id_currency);
    $cart->id_guest = (int)($this->context->cookie->id_guest);
    $cart->id_shop_group = (int)$this->context->shop->id_shop_group;
    $cart->id_shop = $this->context->shop->id;
    if ($this->context->cookie->id_customer)
    {
        $cart->id_customer = (int)($this->context->cookie->id_customer);
        $cart->id_address_delivery = (int)(Address::getFirstCustomerAddressId($cart->id_customer));
        $cart->id_address_invoice = $cart->id_address_delivery;
    }
    else
    {
        $cart->id_address_delivery = 0;
        $cart->id_address_invoice = 0;
    }

    // Needed if the merchant want to give a free product to every visitors
    $this->context->cart = $cart;
    CartRule::autoAddToCart($this->context);
}
Run Code Online (Sandbox Code Playgroud)

包含在FrontController.php(似乎在每个页面中调用)中.所以,对我来说,在"用户会话"期间应该始终存在购物车.

但是 - 是的,有一个但是 - 当我尝试检索购物车时(以这种方式,进入我的模块的控制器)

$context=Context::getContext();
$id_cart=$context->cart->id;
Run Code Online (Sandbox Code Playgroud)

$id_cart不存在,所以cart似乎错过了.所以我有点困惑.

什么在这里?有人可以给我一些指示吗?

PS:

我试图复制该功能(只有else部分),但它不起作用

yen*_*rak 5

当用户未登录且购物车中没有产品时,您可以强制生成购物车:

$context = Context::getContext();
if (!$context->cart->id) {
  $context->cart->add();
  $context->cookie->id_cart = $context->cart->id;
}
$id_cart = $context->cart->id;
Run Code Online (Sandbox Code Playgroud)

看一下processChangeProductInCart方法吧controllers/front/CartController.php