我正在prestshop中开发一个类似于"快速购买"的新功能。我创建了一个带有表单的新页面,在这里我介绍了产品代码和数量,然后我按下一个按钮,将它们保存在购物车中。
问题是登录成功后,如果我直接访问这个新页面,似乎购物车没有初始化,所以当我尝试存储新产品时,由于ps_cart中不存在新购物车,我无法正常保存。否则,在登录后,如果我使用prestasthop的典型方式添加产品(例如从产品页面),则购物车成功创建,因此可以使用我的方式添加更多的产品,因为购物车的ID正在传播。
到目前为止我所做的是这样的:
class QuickbuyControllerCore extends FrontController{
public $php_self = 'quickbuy.php';
public function init() {
parent::init();
}
public function initContent() {
parent::initContent();
$this->setTemplate(_PS_THEME_DIR_.'quickbuy.tpl');
}
public function process(){
global $cart, $cookie;
// do some stuff to get product codes
if(!empty($products)){
foreach ($products as $id_product => $qty){
$exists = Db::getInstance()->getValue('SELECT id_product FROM `'._DB_PREFIX_.'cart_product` WHERE id_product = ' . $id_product . ' AND id_cart = '.(int)$cart->id);
if($exists === false){
$query = 'INSERT INTO `'._DB_PREFIX_.'cart_product`(`id_cart`, `id_product`, `id_product_attribute`, `quantity`, `date_add`) VALUES ';
$query .= '('.(int)$cart->id.', '.(int)$id_product.', 0 , '.(int)$unidades.', NOW()),';
$res = Db::getInstance()->Execute(rtrim($query, ','));
}
else{
$upd = 'UPDATE `'._DB_PREFIX_.'cart_product` SET quantity = quantity + ' . (int)$unidades . ' WHERE id_product = '.(int) $id_product.' AND id_cart = '.(int)$cart->id;
Db::getInstance()->Execute($upd);
}
}
}
}
// Other methods like SetMedia, DisplayContent,...
}
prestshop可能会调用一些方法来创建购物车,我想我省略了它,但我不知道我必须调用哪个方法来创建购物车。
我还尝试调用$cart->save()和$cookie->write(),这创建了一个新的购物车,但是当我刷新页面时,购物车的ID已经丢失。
有人知道为什么购物车ID不通过页面传播吗?
编辑:我忘了说我的prestshop版本是1.4.5.1
我从你的问题中抽出答案,贴在这里供将来的读者使用:
if (!isset($cart->id) OR !$cart->id){
$cart->add();
if ($cart->id)
$cookie->id_cart = (int)($cart->id);
}