我 想 检查 产品 是否 有 促销 活动 , 然后 将 促销 标签 贴 在 类别 列表 页面 上 的 产品 上 。 但 我 不 知道 如何 循环 遍历 所有 购物 车 规则 , 并 检索 与 每个 规则 关联 的 产品/类别 。
- 已 编辑 * *
谢谢 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 以 保存 到 新 表 中 。
4条答案
按热度按时间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以及规则是否仍处于活动状态。此解决方案是最简单的解决方案:-)jhdbpxl92#
您可以从
/app/code/core/Mage/CatalogRule/Model/Rule.php
中提取getMatchingProductsIds
,并将它们与类别列表页面上显示的SKU进行比较。第h
EDIT
下面是一种获取序列化条件的方法:
EDIT 2
必须有更好的方法来实现这一点。我可以提取数据的唯一方法是反序列化,然后使用foreach迭代每一层。有人对此有什么更好的想法吗?这是可行的,但非常草率。
fbcarpbf3#
规则与网站的所有产品相关联。从数据库的Angular 来看,没有为特定产品/类别设置规则。对于购物车中的每个产品,Magento将验证您为网站设置的所有规则。此操作在类Mage_SalesRule_Model_Validator中完成。解决您的请求的唯一方法是从该类扩展函数过程(至少我认为是这样的:p)。
hgncfbus4#
我想要的东西一样,你想要的。我想得到相关的SKU,类别ID和任何其他条件值,以生成谷歌饲料将用于谷歌商家促销。
我已经使用递归函数到达条件的最后一个子条件并获取其值。
我正在根据条件的属性值进行检查。如果属性值为空,则向下执行一步并检查属性值是否存在,如果存在,则获取其值,否则继续向下执行。
这是我用来获取值的代码。它也适用于两个条件处于同一级别的情况。
根据@seanbreeden答案,您可以从第一个
foreach
调用此函数它将返回如下结果:
我不是PHP开发人员。所以,忽略外行风格的代码。:)