在商店级创建结帐会话

时间:2011-11-23 07:14:08

标签: magento

我正在尝试为商店级别的登录客户创建不同的结帐会话,而不是在网站级别。

我们有一个有2家商店的网站。当用户将产品添加到购物车时,我们希望仅在该商店的购物车中显示该产品。但目前商店之间的切换将显示之前添加到购物车中的其他商店的产品。

经过一些研究后,我发现只要用户登录到商店,就会在sales_flat_quote表中为已登录的客户创建记录,这对该站点中的所有商店来说都很常见。所以我需要在用户切换商店时在sales_flat_quote表中创建一条新记录。

我发现类loadByCustomerId()中的Mage_Sales_Model_Mysql4_Quote函数是在sales_flat_quote table中创建新记录的内容。但我所看到的只是一个选择查询:

$read = $this->_getReadAdapter();
$select = $this->_getLoadSelect('customer_id', $customerId, $quote)
                ->where('is_active=1')
                ->order('updated_at desc')
                ->limit(1);
$data = $read->fetchRow($select);

我不明白select查询是如何在sales_flat_quote表中创建记录的。

有人可以指导当他/她切换到同一网站下的其他商店时如何在此表中为已登录的客户创建新记录吗?

1 个答案:

答案 0 :(得分:1)

  

我们有一个有2家商店的网站。当用户将产品添加到购物车时   我们想在购物车中仅为该商店展示该产品。但   目前商店之间的切换将显示其他产品   以前添加到购物车的商店。

正确

您希望将store定义的购物车分开,这些定义都与Magento中的website定义相同。

在Magento中,同一store内定义的所有website始终共享同一个购物车。

那是按设计

要实现购物车分离,您需要将Magento设置更改为每个网站两个 website一个 store。否则你会在两家商店之间遇到无休止的问题(比如你现在遇到的问题),我想。

那就是说,我会尽力回答你的具体问题:

  

我不明白select查询是如何创建记录的   sales_flat_quote表。

SELECT查询通常永远不会创建记录;它被认为是读取数据。

查看Mage_Checkout_Model_Session::loadCustomerQuote()

$customerQuote = Mage::getModel('sales/quote')
    ->setStoreId(Mage::app()->getStore()->getId())
    ->loadByCustomer(Mage::getSingleton('customer/session')->getCustomerId());

这就是你所说的Mage_Sales_Model_Mysql4_Quote::loadByCustomerId()的召唤。它只是加载客户引用(如果有的话),没有别的。

通过调用引号 save() 方法来创建/更新记录。

例如,Magento EE 1.11.0.0以这种方式保存记录:

if ($customerQuote->getId() && $this->getQuoteId() != $customerQuote->getId()) {
    if ($this->getQuoteId()) {
        $customerQuote->merge($this->getQuote())
            ->collectTotals()
            ->save();   // <- either this 
    }

    $this->setQuoteId($customerQuote->getId());

    if ($this->_quote) {
        $this->_quote->delete();
    }
    $this->_quote = $customerQuote;
} else {
    $this->getQuote()->getBillingAddress();
    $this->getQuote()->getShippingAddress();
    $this->getQuote()->setCustomer(Mage::getSingleton('customer/session')->getCustomer())
        ->setTotalsCollectedFlag(false)
        ->collectTotals()
        ->save();   // <- or that does the save
}

您没有提及您使用的Magento版本,因此您的里程可能会有所不同,但原则仍然保持不变。