Magento2:如何从购物车价格规则中的序列化条件中获取 SKU
Magento2: how to get the SKUs from the serialized condition in cart price rules
我需要从购物车价格规则中获取 SKU 以向它们分配特定属性,但条件保存在序列化的数据库中,我想进行 foreach 循环以从序列化条件中提取所有 SKU:
?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objrules = $obj->create('Magento\SalesRule\Model\RuleFactory')->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 Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objrules = $obj->create('Magento\SalesRule\Model\RuleFactory')->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;
我需要从购物车价格规则中获取 SKU 以向它们分配特定属性,但条件保存在序列化的数据库中,我想进行 foreach 循环以从序列化条件中提取所有 SKU:
?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objrules = $obj->create('Magento\SalesRule\Model\RuleFactory')->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 Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objrules = $obj->create('Magento\SalesRule\Model\RuleFactory')->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;