我正在尝试为商店级别的登录客户创建不同的结帐会话,而不是在网站级别。
我们有一个有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
表中创建记录的。
有人可以指导当他/她切换到同一网站下的其他商店时如何在此表中为已登录的客户创建新记录吗?
答案 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()
方法来创建/更新记录。
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版本,因此您的里程可能会有所不同,但原则仍然保持不变。