加载数千个代码以映射到Magento中的购物车规则

nodit 发布于 2018-11-17 coupon 最后更新 2018-11-17 11:09 49 浏览

我一直在查看salesrule_coupon表,并且发现如果规则本身的类型为“自动”,我可以将许多优惠券代码映射到单个规则。这非常方便,因为我的客户需要我们定期将代码与数据源进行同步。 因此,在加载这些成千上万的代码时(使用自定义模块和直接SQL调用),它们加载得很好,我可以测试并验证其中的许多代码是否正常工作。 然而,在我的这些代码列表中,他们停止工作。第一个30左右的工作会很好,但此后,Magento说这些代码是无效的。 我仍然在调试这个,如果我发现任何东西,我会发布更新......但我已经尝试过,现在用两个单独的价格规则来体验它。第31条代码包含一条规则,第39条代码包含第二条。 真奇怪的是,如果我改变这些代码以指向一个不同的规则(一个代码少于30个代码),它们就会被识别并被接受。没有别的改变,我可以确定。 关于如何在这里继续的任何想法?有没有人试过这个?这很有趣。

已邀请:

dut

赞同来自:

另一个解决方案是增加你遇到的mysql限制 SET GLOBAL group_concat_max_len = 9999999; 正如Ivan解释的那样,FIND_IN_SET不会返回您的所有优惠券代码。您需要增加group_concat_max_len才能保留由逗号(COUPON1,COUPON2,COUPON3)分隔的所有优惠券代码的长度。 由于您可能使用了不同长度的不同代码,这可以解释为什么1条规则适用于30而另一条规则适用于38条规则。

ueum

赞同来自:

当我为我的一个客户创建类似的东西时,我修复了同样的问题。检索有效优惠券Magento核心销售规则模块的问题来源使用FIND_IN_SET()GROUP_CONCAT() MySQL函数,而不是为连接表添加附加条件。因此,FIND_IN_SET只会将组连接中使用的优惠券代码的数量截断为31项(32位掩码)。另外我注意到他们正在使用HAVING而不是在哪里,所以它会影响性能。 所以你需要做的是以下几点:

  1. 为此资源模型创建重写:Mage_SalesRule_Model_Mysql4_Rule_Collection(salesrule/rule_collection)
  2. 然后在重写核心模型的资源模型中,您需要重新定义此方法setValidationFilter($websiteId, $customerGroupId, $couponCode='', $now=null),该方法对前端的销售规则应用限制。这里是我使用的方法体:
    /**
     * Fix for validation with auto-coupons
     * @todo remove this fix, after the bug in core will be fixed
     *
     * (non-PHPdoc)
     * @see Mage_SalesRule_Model_Mysql4_Rule_Collection::setValidationFilter()
     */
    public function setValidationFilter($websiteId, $customerGroupId, $couponCode='', $now=null)
    {
        if (is_null($now)) {
            $now = Mage::getModel('core/date')->date('Y-m-d');
        }
    $this->getSelect()->where('is_active=1');
        $this->getSelect()->where('find_in_set(?, website_ids)', (int)$websiteId);
        $this->getSelect()->where('find_in_set(?, customer_group_ids)', (int)$customerGroupId);
    if ($couponCode) {
            $couponCondition = $this->getConnection()->quoteInto(
                'extra_coupon.code = ?',
                $couponCode
            );
    $this->getSelect()->joinLeft(
                array('extra_coupon' => $this->getTable('salesrule/coupon')),
                'extra_coupon.rule_id = main_table.rule_id AND extra_coupon.is_primary IS NULL AND ' . $couponCondition,
                array()
            );
            $this->getSelect()->where('('
                . $this->getSelect()->getAdapter()->quoteInto(' main_table.coupon_type <> ?', Mage_SalesRule_Model_Rule::COUPON_TYPE_SPECIFIC)
                . $this->getSelect()->getAdapter()->quoteInto(' OR primary_coupon.code = ?', $couponCode) . ')'
            );
            $this->getSelect()->where('('
                . $this->getSelect()->getAdapter()->quoteInto(' main_table.coupon_type <> ?', Mage_SalesRule_Model_Rule::COUPON_TYPE_AUTO)
                . $this->getSelect()->getAdapter()->quoteInto(' OR extra_coupon.code IS NOT NULL') . ')'
            );
        } else {
            $this->getSelect()->where('main_table.coupon_type = ?', Mage_SalesRule_Model_Rule::COUPON_TYPE_NO_COUPON);
        }
        $this->getSelect()->where('from_date is null or from_date<=?', $now);
        $this->getSelect()->where('to_date is null or to_date>=?', $now);
        $this->getSelect()->order('sort_order');
    return $this;
    }
    
  3. 测试修复&享受Magento开发:)