Magento中的客户组ID问题

时间:2014-09-04 20:06:43

标签: php magento-1.4

我正在使用Magento 1.4.0.1,我发现了什么似乎是一个错误,但在修复它时我想我已经创造了一个新的怪物。我需要一些智慧。

The Bug

在结帐时,与购物车一起保存的报价模型数据(来自Mage_Sales_Model_Quote)直接在sales_flat_quote表格上存储有关客户的两个字段:customer_tax_class_id和{{1 }}。如果检查核心报价模型类,您将找到前一个字段的方法,该方法可确保在每次请求时从DB重新加载税类ID。好吧,我认为核心团队未能做到的事情(至少在这个版本中)也重新加载后一个字段:客户组ID。由于未能在每次调用时重新加载组ID,我们发现如果客户组在Magento中已经启动报价后更改了报价,则报价在车辆总计中产生了不正确的税。

修复

为了解决这个问题,我跟着customer_group_id一起做了,并在报价模型类中添加了以下方法:

Mage_Sales_Model_Quote::getCustomerTaxClassId

这似乎解决了我的问题,所以即使客户两天后回到他们的购物车,并且他们的客户群在此期间发生了变化,重新收集报价的总数将使用他们当前的客户组配置。好吧,对我的怪物......

怪物

我今天发现购物车中的捆绑产品显示的行总数并未累计到购物车子总帐和总计。在研究之后,我注意到捆绑中的一些产品具有等级定价,在这种情况下,应用于“一般”客户群,最小数量为1.

所以在追踪这个问题的时候,我发现上面我的新方法要求当前客户报价(在这种情况下 none ), “通用”每次都是客户群。为什么?因为当我在客户模型中检查组ID getter时,我发现:

# File: app/code/local/Mymodule/Sales/Model/Quote.php
public function getCustomerGroupId()
{
    $this->setCustomerGroupId($this->getCustomer()->getGroupId());

    return $this->getData('customer_group_id');
}

由于这是一个空客户模型(没有设置ID),它使用系统配置中的默认客户组,实际上是“常规”。

那我该怎么办?一方面,我已经解决了报价表上陈旧的客户组ID的问题,并且这样做我迫使报价从一个客户模型获得一个新的ID,它认为这是一个新账户。

我想我可以通过检查客户是否在获取组ID时登录来解决此问题,如果没有,则回退到默认的# File: app/code/core/Mage/Customer/Model/Customer.php public function getGroupId() { if (!$this->getData('group_id')) { $storeId = $this->getStoreId() ? $this->getStoreId() : Mage::app()->getStore()->getId(); $this->setData('group_id', Mage::getStoreConfig(Mage_Customer_Model_Group::XML_PATH_DEFAULT_ID, $storeId)); } return $this->getData('group_id'); } 组ID(0 - 这就是我真正想要的在这种情况下,避免应用层级定价)。但不知怎的,我觉得自己正在翻滚兔子洞,而可能有更好的办法解决这个问题。

帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

好的 - 所以我测试了我自己的建议,它似乎工作。我扩展了客户模型,如下:

# File: app/code/local/Mymodule/Customer/Model/Customer.php
public function getGroupId()
{
    if (!$this->getData('group_id')) {
        if (!Mage::getSingleton('customer/session')->isLoggedIn()) {
            $this->setData('group_id', Mage_Customer_Model_Group::NOT_LOGGED_IN_ID);
        } else {
            $storeId = $this->getStoreId() ? $this->getStoreId() : Mage::app()->getStore()->getId();
            $this->setData('group_id', Mage::getStoreConfig(Mage_Customer_Model_Group::XML_PATH_DEFAULT_ID, $storeId));
        }
    }
    return $this->getData('group_id');
}

当无法找到客户会话时,我强制“未登录”组。它解决了我的问题;但要明确的是,我问这个是因为我害怕做出另一个具有不可预见影响的变化。

所以我仍然愿意接受更好的解决方案!