Magento 显示与每个规则关联的购物车规则和产品类别的集合

Magento 显示与每个规则关联的购物车规则和产品类别的集合,magento,shopping,promotion-code,Magento,Shopping,Promotion Code,我想检查产品上是否有促销活动,然后将促销标签贴在产品类别列表页面上。但我不知道如何循环浏览所有购物车规则并检索与每个规则关联的产品/类别 已编辑 谢谢seanbreeden,但我无法从$conditions中提取SKU变量转储($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_

我想检查产品上是否有促销活动,然后将促销标签贴在产品类别列表页面上。但我不知道如何循环浏览所有购物车规则并检索与每个规则关联的产品/类别

已编辑

谢谢seanbreeden,但我无法从
$conditions
中提取SKU<代码>变量转储($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;
$rules=Mage::getResourceModel('salesrule/rule_collection')->load();
foreach($rules作为$rule){
如果($rule->getIsActive()){
//打印($rule->getData());
$rule=Mage::getModel('salesrule/rule')->load($rule->getId());
$conditions=$rule->getConditions();
$conditions=$rule->getConditions()->asArray();
foreach($conditions['conditions']作为$条件):
foreach($条件['conditions']作为$条件):
$string=explode(',',$_条件['value']);

对于($i=0;$i规则与网站的所有产品相关联。从数据库的角度来看,没有为特定产品/类别设置规则。对于购物车中的每个产品,Magento将验证网站的所有规则。此操作在Mage_SalesRule_Model_Validator类中完成。这是解决您的请求的唯一方法是从这个类扩展函数过程(至少我认为是这样:p)。

您可以从
/app/code/core/Mage/CatalogRule/Model/Rule.php
中提取
getMatchingProductSID
,并将它们与类别列表页面上显示的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();

编辑

以下是获取序列化条件的方法:

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

foreach ($rules as $rule) {
    $conditions = $rule->getConditionsSerialized();
    var_dump($conditions);
}
编辑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);
$rules=Mage::getResourceModel('salesrule/rule_collection')->load();
foreach($rules作为$rule){
如果($rule->getIsActive()){
$conditions=$rule->getConditionsSerialized();
$unserialized_conditions=unserialize($conditions);
$unserialized_conditions_compact=array();
foreach($key=>$value的未序列化\u条件){
$unserialized_conditions_compact[]=compact('key','value');
}
对于($i=0;$i$value){
foreach($key1=>$value1的值){
foreach($value1作为$key2=>$value2){
foreach($value2作为$key3=>$value3){
$SKU[]=爆炸(“,”,$value3['value']);
}
}
}
}
}
}
}
}
var_转储(SKU);

我建议您这样做。当您要购物车时,会检查每个规则以计算最终价格和折扣。您可以知道哪些规则应用于购物车的每个项目。在表
sales\u flat\u quote\u item
中有一列
applied\u rule\u id
。我认为您可以在php中访问该列,通过函数
getAllItemsInCart
或类似的方法(您必须找到)。完成
$item->getAppliedRuleIds()
之后,您可以获得应用于某个项目(产品)的规则名称

祝你好运:)

编辑:

我又读了一遍你的要求,我认为我的回答不符合你的要求。 您的情况更为复杂。对于目录页上的每个产品,您必须应用网站的所有规则。但是
Mage\u SalesRule\u Model\u Validator
处理expect项而不是产品。。。 如果你有很多规则,这个任务会减慢你的目录速度,这真的不好!最好是将规则标签的结果缓存在数据库中,可能在表
catalog\u category\u product
或…(最好是自动生成这个缓存)

编辑2:

另一种可能是在规则创建中有一个新字段,您可以在其中手动设置相关产品(sku)。您可以将此数据保存在表salesrule或新表
salesrule\u related\u sku
中。 然后,在显示目录时,检查sku以及规则是否仍然有效。
这个解决方案将是最简单的:-)

我想要的和你想要的一样。我想获得相关的SKU、分类ID和任何其他条件值,以生成用于Google商家促销的Google提要

我已经使用递归函数到达条件的最后一个子项并获取其值

我正在根据条件的属性值进行检查。如果属性值为空,则向下一步,检查属性值是否存在,如果存在,则获取属性值,否则继续向下

下面是我用来获取值的代码。当两个条件处于同一水平时,这也适用于该情况

public function get_value_recursively($value){

        foreach($value as $key => $new_value) {
            if(strlen($new_value[attribute]) == 0){
                $value = $new_value[conditions];
                return $this->get_value_recursively($value);
            }else{
                $resultSet = array();
                if (count($value) > 1){
                    for ($i=0;$i<count($value);$i++) {
                        $resultSet[] = array('attribute' =>  $value[$i][attribute], 'value' => $value[$i][value]);
                    }
                    $result = $resultSet;
                }else{
                    $result = array('attribute' =>  $new_value[attribute], 'value' => $new_value[value]);
                }
                return json_encode($result, JSON_FORCE_OBJECT);
            }
        }
    }

另外,我不是PHP开发人员。所以,忽略外行风格的代码。:)

让我再解释一下。假设我创建了一个BOGOF规则,在这种情况下,我只添加了3个产品(prod1、prod2、prod3)。这意味着BOGOF仅适用于这三种产品。在类别列表页面上,假设我有10种产品,但我只想在prod1、prod2和prod3上显示BOGOF标签。希望现在更清楚一点,我使用的是购物车价格规则,而不是目录规则。刚才选中了/app/code/core/Mage/SalesRule/Model/Rule.php,它没有任何GetMatchingProductsIds函数。看看这是否能让你走上正确的方向。游寿
{"0":{"attribute":"category_ids","value":"5, 15"},"1":{"attribute":"sku","value":"msj000, msj001, msj002"}}