在subtotal.phtml中返回了错误的客户组ID?

时间:2015-07-13 08:13:49

标签: magento session

我正在使用

$id = Mage::getSingleton('customer/session')->getCustomerGroupId();

在app> design \ design \ frontend \ base \ default \ template \ tax \ checkout \ subtotal.phtml 中获取客户组ID。它总是返回1,这是不正确的。在其他模板文件中,它会在相同会话中返回正确的数字。

我以正确的客户身份登录,这不是问题所在。

可能是什么问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

今天我偶然发现了同样的问题,所以我想我会在这个问题上分享我的发现。

在我们的商店中,启用自动分配到客户组(配置 - >系统 - >客户配置 - >创建新帐户选项)设置已启用。每当客户登录时,我都会根据请求此信息的块在布局中的位置获得客户组ID的不同结果。然后我发现Minicart-Block搞砸了。

如果启用了自动客户组分配 t设置,magento将从Mage_SalesMage_Sales_Model_Observer::changeQuoteCustomerGroupId执行观察服务器。这是由于minicart在报价上收集总数。

此观察员从报价中获取地址,并验证该地址是否存在增值税ID,如果不是,则所选国家/地区是否属于欧盟。

如果没有,它将为报价分配默认用户组 - 而且它还会将该用户组分配给用户对象,这是事情变得混乱的地方:

if ((empty($customerVatNumber) || !Mage::helper('core')->isCountryInEU($customerCountryCode))
        && !$isDisableAutoGroupChange
    ) {
        $groupId = ($customerInstance->getId()) ? $customerHelper->getDefaultCustomerGroupId($storeId)
            : Mage_Customer_Model_Group::NOT_LOGGED_IN_ID;

        $quoteAddress->setPrevQuoteCustomerGroupId($quoteInstance->getCustomerGroupId());
        $customerInstance->setGroupId($groupId);
        $quoteInstance->setCustomerGroupId($groupId);

        return;
    }

问题是,当您将商品添加到空购物车时,从不会在报价地址上设置增值税ID或国家/地区。这些值仅在结账过程中填写,之前无法输入。这意味着对于每个拥有购物车但尚未结帐流程的客户,Magento会将默认用户组分配给用户。

我最终禁用原始观察者并检查引用地址上是否设置了country_id属性的任何值。

如果未设置,我会从默认地址中获取vat_idcountry_id值(如果有),将它们设置在引用地址上,然后推送给原始观察者。

public function changeQuoteCustomerGroupId(Varien_Event_Observer $observer)
{
    /** @var $quoteAddress Mage_Sales_Model_Quote_Address */
    $quoteAddress = $observer->getQuoteAddress();
    $quoteInstance = $quoteAddress->getQuote();
    $customerInstance = $quoteInstance->getCustomer();

    if (!$quoteAddress->getCountryId())
    {
        // no country chosen, yet. Copy default billing addresses value to quote address.

        $primaryBillingAddress = $customerInstance->getPrimaryAddress('default_' . $quoteAddress->getAddressType());

        if ($primaryBillingAddress->getId())
        {
            $quoteAddress->setVatId($primaryBillingAddress->getVatId());
            $quoteAddress->setCountryId($primaryBillingAddress->getCountryId());

        }
    }

    Mage::getSingleton('sales/observer')->changeQuoteCustomerGroupId($observer);

    return $this;
}

config.xml

<events>
    <sales_quote_address_collect_totals_before>
        <observers>
            <sales_customer_validate_vat_number>
                <type>disabled</type>
            </sales_customer_validate_vat_number>
            <fallback_customer_validate_vat_number>
                <class>vendor/sales_observer</class>
                <method>changeQuoteCustomerGroupId</method>
            </fallback_customer_validate_vat_number>
        </observers>
    </sales_quote_address_collect_totals_before>
<events>

也许这会对某人有所帮助。