Magento2: как получить SKU из сериализованного условия в правилах цены корзины - PullRequest
0 голосов
/ 25 октября 2019

Мне нужно получить 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 из этого условия.

заранее спасибо.

1 Ответ

1 голос
/ 28 октября 2019

попробуйте что-то вроде этого:

<?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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...