prestashop で「高速購入」のような新しい機能を開発しています。商品コードと数量を紹介するフォームを含む新しいページを作成し、ボタンを押してカートに保存します。
問題は、ログインに成功した後、この新しいページに直接アクセスすると、カートが初期化されていないように見えるため、新しい製品を保存しようとすると、新しいカートが ps_cart に存在しないため、保存できないことです。ちゃんと。それ以外の場合、ログイン後、prestashop の一般的な方法 (たとえば、製品ページから) を使用して製品を追加すると、カートが正常に作成され、カートの 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,...
}
Prestashop はカートを作成するために何らかのメソッドを呼び出す場合があり、私はそれを省略していると思いますが、カートを作成するために呼び出す必要があるメソッドを見つけることができません。
また、$cart->save() と $cookie->write() を呼び出してみましたが、これにより新しいカートが作成されましたが、ページを更新するとカートの ID が失われました。
カート ID がページを介して伝播されない理由について何か考えはありますか?
編集: prestashop のバージョンが 1.4.5.1 であることを忘れていました