magento 显示购物车规则以及与每个规则关联的产品类别的集合

omtl5h9j  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(125)

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

    • 已 编辑 * *

谢谢 seanbreeden , 但 我 无法 从 $conditions 中 提取 SKU 。 var_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 以 保存 到 新 表 中 。

6uxekuva

6uxekuva1#

我建议你这样做。当你有一个产品要购物车,每个规则都被检查,以计算最终价格和折扣。你可以知道哪些规则适用于你的购物车的每一个项目。在表sales_flat_quote_item你有applied_rule_ids列。我认为你可以访问这个在php中,通过函数getAllItemsInCart或类似的东西(你必须找到)。在你做了$item->getAppliedRuleIds()之后,最后你可以得到应用于一个项目(产品)的规则的名称。
祝你好运:)
编辑:
我再次阅读了您的请求,我认为我的回答不符合您的请求。您的情况甚至更复杂。对于目录页面上的每个产品,您必须应用网站的所有规则。但是Mage_SalesRule_Model_Validator处理预期项目而不是产品...如果您有很多规则,此任务将减慢您的目录,这真的不好!最好是在数据库中缓存规则标签的结果,可以在表catalog_category_product或...中(自动生成此缓存更好)。
编辑2:
另一种可能性是在规则创建过程中创建一个新字段,您可以在其中手动设置相关产品(sku)。您可以将此数据保存在表salesrule或新表salesrule_related_sku中。然后,当您显示目录时,您可以检查sku以及规则是否仍处于活动状态。此解决方案是最简单的解决方案:-)

jhdbpxl9

jhdbpxl92#

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

fbcarpbf3#

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

hgncfbus

hgncfbus4#

我想要的东西一样,你想要的。我想得到相关的SKU,类别ID和任何其他条件值,以生成谷歌饲料将用于谷歌商家促销。
我已经使用递归函数到达条件的最后一个子条件并获取其值。
我正在根据条件的属性值进行检查。如果属性值为空,则向下执行一步并检查属性值是否存在,如果存在,则获取其值,否则继续向下执行。
这是我用来获取值的代码。它也适用于两个条件处于同一级别的情况。

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);
            }
        }
    }

根据@seanbreeden答案,您可以从第一个foreach调用此函数
它将返回如下结果:

{"0":{"attribute":"category_ids","value":"5, 15"},"1":{"attribute":"sku","value":"msj000, msj001, msj002"}}

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

相关问题