5

製品に販売促進があるかどうかを確認してから、カテゴリリストページのその製品に販売促進ラベルを貼り付けます。しかし、すべてのショッピングカートのルールをループして、各ルールに関連付けられている商品/カテゴリを取得する方法がわかりません。

編集済み

seanbreedenに感謝しますが、からskusを取得できません$conditionsvar_dump($conditions);これを示しています:

{s:4:"type";s:32:"salesrule/rule_condition_combine";s:9:"attribute";N;s:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";}a:7:{s:4:"type";s:32:"salesrule/rule_condition_combine";s:9:"attribute";N;s:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";s:10:"conditions";a:1:{i:0;a:7:{s:4:"type";s:42:"salesrule/rule_condition_product_subselect";s:9:"attribute";s:3:"qty";s:8:"operator";s:2:">=";s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";s:10:"conditions";a:1:{i:0;a:5:{s:4:"type";s:32:"salesrule/rule_condition_product";s:9:"attribute";s:12:"category_ids";s:8:"operator";s:2:"==";s:5:"value";s:2:"23";s:18:"is_value_processed";b:0;}}}}}a:7:{s:4:"type";s:32:"salesrule/rule_condition_combine";s:9:"attribute";N;s:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";s:10:"conditions";a:2:{i:0;a:5:{s:4:"type";s:32:"salesrule/rule_condition_address";s:9:"attribute";s:13:"base_subtotal";s:8:"operator";s:2:">=";s:5:"value";s:2:"45";s:18:"is_value_processed";b:0;}i:1;a:7:{s:4:"type";s:42:"salesrule/rule_condition_product_subselect";s:9:"attribute";s:3:"qty";s:8:"operator";s:2:">=";s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";s:10:"conditions";a:1:{i:0;a:5:{s:4:"type";s:32:"salesrule/rule_condition_product";s:9:"attribute";s:3:"sku";s:8:"operator";s:2:"==";s:5:"value";s:46:"test-config, BLFA0968C-BK001, BLFA0968C-CR033X";s:18:"is_value_processed";b:0;}}}}}a:6:{s:4:"type";s:32:"salesrule/rule_condition_combine";s:9:"attribute";N;s:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";}a:6:{s:4:"type";s:32:"salesrule/rule_condition_combine";s:9:"attribute";N;s:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";}a:7:{s:4:"type";s:32:"salesrule/rule_condition_combine";s:9:"attribute";N;s:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";s:10:"conditions";a:1:{i:0;a:7:{s:4:"type";s:42:"salesrule/rule_condition_product_subselect";s:9:"attribute";s:3:"qty";s:8:"operator";s:2:">=";s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";s:10:"conditions";a:1:{i:0;a:5:{s:4:"type";s:32:"salesrule/rule_condition_product";s:9:"attribute";s:3:"sku";s:8:"operator";s:2:"==";s:5:"value";s:16:"BLFA0968C-CR033X";s:18:"is_value_processed";b:0;}}}}}

しかし、$conditionsをループすると

$rules = Mage::getResourceModel('salesrule/rule_collection')->load();

foreach ($rules as $rule) {
    $conditions = $rule->getConditionsSerialized();
    foreach ($conditions as $condition) {
        var_dump($condition);
    }
}

何も表示されないので、ここでSKUをプルする方法がわかりません。

EDIT2 Alaxandre が示唆したように、私はシリアル化されていないアプローチを使用していません。私は今このようにやっています:

$rules = Mage::getResourceModel('salesrule/rule_collection')->load();

foreach ($rules as $rule) {
    if ($rule->getIsActive()) {
        //print_r($rule->getData());
        $rule = Mage::getModel('salesrule/rule')->load($rule->getId()); 

        $conditions = $rule->getConditions();
        $conditions = $rule->getConditions()->asArray();

        foreach( $conditions['conditions'] as $_conditions ):
            foreach( $_conditions['conditions'] as $_condition ):
                $string = explode(',', $_condition['value']);
                for ($i=0; $i<count($string); $i++) {
                    $skus[] = trim($string[$i]);
                }
            endforeach;
        endforeach;
    }
}
return $skus;

次に、リストページでskuが$ skus配列内で一致するかどうかを確認し、ラベルを表示します。ただし、このアプローチにも制限があります。私は別のアプローチを考えています(それが可能かどうかはわかりません)。(販売ルール製品を保存するために)新しいテーブルを作成することを考えています。販売ルールを保存するたびに、保存ルールイベントをキャッチし、ルール名と関連するすべての製品でテーブルを更新します。次に、リストページでそのテーブルを確認し、製品がテーブルに存在する場合は、適切なラベルを表示します。イベントはadminhtml_controller_salesrule_prepare_save(100%確実ではありません)だと思いますが、オブザーバーのルール条件からskuを取得して新しいテーブルに保存する方法がわかりません。

4

4 に答える 4

4

このようにすることをお勧めします。カートに商品を入れると、各ルールがチェックされ、最終的な価格と割引額が計算されます。カートの各アイテムにどのルールが適用されているかを知ることができます。テーブルsales_flat_quote_itemには、列がありますapplied_rule_ids。phpで、関数などでアクセスできると思いますgetAllItemsInCart(調べておく必要があります)。その後$item->getAppliedRuleIds()、最後に、アイテム(製品)に適用されるルールの名前を取得できます。

幸運を :)

編集:

私はあなたの要求をもう一度読みました、そして私は私の答えがあなたの要求に合わないと思います。あなたのケースはさらに複雑です。カタログページの各製品について、Webサイトのすべてのルールを適用する必要があります。しかし、Mage_SalesRule_Model_Validatorプロセスは製品ではなくアイテムを期待します...ルールがたくさんある場合、このタスクはカタログの速度を低下させ、これは本当に良くありません!ルールラベルのこの結果をデータベースにキャッシュするのが最善であり、テーブルcatalog_category_productまたは...にある可能性があります(さらに、このキャッシュを自動的に生成する方がよいでしょう)。

Edit2:

他の可能性は、関連製品(SKU)を手動で設定するルール作成に新しいフィールドを設定することです。このデータをテーブルsalesruleまたは新しいテーブルに保存しますsalesrule_related_sku。次に、カタログを表示するときに、SKUを確認し、ルールがまだアクティブかどうかを確認します。この解決策は最も簡単なものです:-)

于 2012-02-29T11:24:19.657 に答える
3

getMatchingProductsIdsから/app/code/core/Mage/CatalogRule/Model/Rule.phpを取得して、カテゴリ リスト ページに表示されている sku と比較できます 。

 $catalog_rule = Mage::getModel('catalogrule/rule')->load(1);  // ID of your catalog rule here, or you could leave off ->load(1) and iterate through  ->getCollection() instead
 $catalog_rule_skus = $catalog_rule->getMatchingProductIds();

h番目

EDIT

シリアル化された条件を取得する方法は次のとおりです。

$rules = Mage::getResourceModel('salesrule/rule_collection')->load();

foreach ($rules as $rule) {
    $conditions = $rule->getConditionsSerialized();
    var_dump($conditions);
}

EDIT 2

これを行うには、より良い方法が必要です。そのデータを取得できる唯一の方法は、シリアル化を解除してから、各レイヤーで foreach を反復処理することでした。誰にもこれに関するより良いアイデアはありますか?これは機能しますが、非常にずさんです。

$rules = Mage::getResourceModel('salesrule/rule_collection')->load();

foreach ($rules as $rule) {

  if ($rule->getIsActive()) { 
$conditions = $rule->getConditionsSerialized();
$unserialized_conditions = unserialize($conditions);

$unserialized_conditions_compact = array();

foreach($unserialized_conditions as $key => $value) {
   $unserialized_conditions_compact[] = compact('key', 'value');
}

for ($i=0;$i<count($unserialized_conditions_compact);$i++) {
        if (in_array("conditions",$unserialized_conditions_compact[$i])) {
                foreach($unserialized_conditions_compact[$i] as $key => $value) {
                        foreach($value as $key1 => $value1) {
                                foreach($value1 as $key2 => $value2) {
                                        foreach($value2 as $key3 => $value3) {
                                                $skus[] = explode(",",$value3['value']);
                                        }
                                }
                        }
                }
        }
}
 }

}

var_dump($skus);
于 2012-02-28T15:11:59.240 に答える
0

ルールは、Web サイトのすべての製品に関連付けられています。データベースの観点から特定の製品/カテゴリに設定されたルールはありません。カート内の各製品について、Magento は Web サイトのすべてのルールを検証します。この操作はクラス Mage_SalesRule_Model_Validator で行われます。あなたの要求を解決する唯一の方法は、このクラスから関数プロセスを拡張することです (少なくとも私はそう思います:p)。

于 2012-02-28T14:04:45.567 に答える