4

テーブルを調べたところsalesrule_coupon、ルール自体が「自動」タイプの場合、多くのクーポン コードを 1 つのルールにマッピングできることがわかりました。これは非常に便利です。私のクライアントは定期的にコードをデータ フィードと同期する必要があるからです。

したがって、これらの何千ものコードを (カスタム モジュールと直接 SQL 呼び出しを使用して) ロードすると、問題なくロードされ、それらの多くが機能することをテストおよび検証できます。

ただし、これらのコードのリストをたどっていくと、機能しなくなります。最初の 30 程度は問題なく動作しますが、その後、Magento はコードが無効であると言います。

私はまだこれをデバッグ中であり、何かを発見したら更新を投稿します...しかし、私はこれを2つの別々の価格ルールで試して経験しました. 1 つのルールは 31 番目のコードで失敗し、2 つ目は 39 番目のコードで失敗しました。

本当に奇妙なのは、これらのコードを変更して別のルール (コード数が 30 未満のルール) を指すようにすると、認識されて受け入れられることです。私が判断できることは、他に何も変わっていません。

ここでどのように進めるかについてのアイデアはありますか? 誰もこれを試みたことがありますか?これは興味深いものです。

4

2 に答える 2

5

顧客の 1 人に似たようなものを作成していたときに、同じ問題を修正しました。有効なクーポンの取得に関する問題の原因 Magento Core Sales Rule モジュールは、結合されたテーブルに追加の条件を追加する代わりに、MySQL 関数を使用FIND_IN_SET()します。そのため、グループ連結で使用されるクーポン コードの数を 31 アイテム (32 ビット マスク) に切り捨てますGROUP_CONCAT()FIND_IN_SETまた、where の代わりに 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 の開発をお楽しみください :)

于 2011-06-08T20:12:12.553 に答える
4

別の解決策は、遭遇しているmysqlの制限を増やすことです

SET GLOBAL group_concat_max_len = 9999999;

Ivanが説明したように、FIND_IN_SETはすべてのクーポンコードを返すわけではありません。カンマで区切られたすべてのクーポンコード(COUPON1、COUPON2、COUPON3)の長さを保持できるようにするには、group_concat_max_lenを増やす必要があります。

異なる長さの異なるコードを使用した可能性があるため、これは、1つのルールが30で機能し、他のルールが38で機能した理由を説明します。

于 2011-06-08T22:09:31.393 に答える