Magento2:如何从购物车价格规则中的序列化条件中获取SKU



我需要从cart price规则中获取SKU,为它们分配特定的属性,但条件保存在序列化的数据库中,我想进行foreach循环,从序列化的条件中提取所有SKU:

?php
use MagentoFrameworkAppBootstrap;
require __DIR__ . '/../app/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('MagentoFrameworkAppState');
$state->setAreaCode('frontend');
$objrules = $obj->create('MagentoSalesRuleModelRuleFactory')->create();
$rules = $objrules->getCollection()->addFieldToFilter("is_active", "1");
foreach ($rules as $rule) {
echo $rule->getConditionsSerialized() . "n";
}

并且序列化条件的结果是:

{"type":"Magento\SalesRule\Model\Rule\Condition\Combine","attribute":null,"operator":null,"value":1,"is_value_processed":null,"aggregator":"all","conditions":[{"type":"Magento\SalesRule\Model\Rule\Condition\Product\Subselect","attribute":"qty","operator":">=","value":"1","is_value_processed":null,"aggregator":"any","conditions":[{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817069","is_value_processed":false,"attribute_scope":null},{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817051","is_value_processed":false,"attribute_scope":null},{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817561","is_value_processed":false,"attribute_scope":null},{"type":"Magento\SalesRule\Model\Rule\Condition\Product","attribute":"sku","operator":"==","value":"100817579","is_value_processed":false,"attribute_scope":null}]}]}

那么,我们如何从这个条件中提取所有的SKU。

提前谢谢。

试试这样的东西:

<?php
ini_set('display_errors', '1');
ini_set('error_reporting', E_ALL);
use MagentoFrameworkAppBootstrap;
require __DIR__ . '/../app/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('MagentoFrameworkAppState');
$state->setAreaCode('frontend');
$objrules = $obj->create('MagentoSalesRuleModelRuleFactory')->create();
$rules = $objrules->getCollection()->addFieldToFilter("is_active", "1");
$skus = [];
if ($rules) {
foreach ($rules as $rule) {
$ruleData = $rule->getConditionsSerialized();
if ($ruleData) {
$ruleDataArray = json_decode($ruleData, true);
if (isset($ruleDataArray['conditions'])) {
$conditions = $ruleDataArray['conditions'];
foreach ($conditions as $condition) {
if (isset($condition['conditions'])) {
$productConditions = $condition['conditions'];
foreach ($productConditions as $productCondition) {
if (isset($productCondition['value'])) {
$skuValues = $productCondition['value'];
$skuValues = explode(",",$skuValues);
foreach ($skuValues as $skuValue) {
$skus[] = $skuValue;
}
}
}
}
}
}
}
}
}
$uniqSkus = array_unique($skus);
print_r($uniqSkus);
exit;

最新更新