Отображение коллекции правил корзины покупок и категорий товаров, связанных с каждым правилом - PullRequest
4 голосов
/ 28 февраля 2012

Я хочу проверить, есть ли рекламная акция на продукт, а затем наклеить этикетку с рекламой на этот продукт на странице списка категорий.Но я не знаю, как пройтись по всем правилам корзины покупок и получить товары / категории, связанные с каждым правилом.

РЕДАКТИРОВАНИЕ

Спасибо, seanbreeden, но яне могу вытащить скуса из $conditions.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;}}}}}

, но когда я перебираю $ условия, т. Е.

$rules = Mage::getResourceModel('salesrule/rule_collection')->load();

foreach ($rules as $rule) {
    $conditions = $rule->getConditionsSerialized();
    foreach ($conditions as $condition) {
        var_dump($condition);
    }
}

, это ничего не показывает, поэтому я не знаю, как тянуть сюда скуса.

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 ]

4 голосов
/ 29 февраля 2012

Я бы посоветовал вам сделать это так.Когда у вас есть товар в корзину, проверяются все правила, чтобы рассчитать окончательную цену и скидку.Вы можете знать, какие правила применяются к каждому товару в вашей корзине.В таблице sales_flat_quote_item у вас есть столбец applied_rule_ids.Я думаю, что вы можете получить доступ к этому в php, с помощью функции getAllItemsInCart или что-то вроде этого (вы должны выяснить).После того, как вы выполните $item->getAppliedRuleIds() и, наконец, вы сможете получить название правила, применимого к элементу (продукту).

Удачи:)

Редактировать:

Я прочиталснова ваш запрос, и я думаю, что мой ответ не соответствует вашему запросу.Ваш случай еще сложнее.Для каждого продукта на странице вашего каталога вы должны применять все правила вашего сайта.Но Mage_SalesRule_Model_Validator обрабатывает ожидаемый элемент, а не продукт ... Если у вас много правил, эта задача замедлит ваш каталог, и это действительно не хорошо!Лучше всего было бы кешировать этот результат метки правил в базе данных, может быть в таблице catalog_category_product или ... (а еще лучше создать этот кеш автоматически).

Edit2:

Другой возможностью будет создание нового поля при создании правила, в котором вы вручную устанавливаете связанные продукты (sku).Вы сохраняете эти данные в таблице salesrule или в новой таблице salesrule_related_sku.Затем, когда вы отображаете каталог, вы проверяете sku и если правило все еще активно.Это решение будет самым простым: -)

3 голосов
/ 28 февраля 2012

Вы можете извлечь getMatchingProductsIds из /app/code/core/Mage/CatalogRule/Model/Rule.php и сравнить их с отображением на странице списка категорий.

 $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();

НТН

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);
0 голосов
/ 23 марта 2018

Я хотел то же самое, что и ты.Я хотел получить связанные SKUS, Category Ids и любые другие значения условий для создания каналов Google, которые будут использоваться в рекламных акциях Google merchant.

Я использовал рекурсивную функцию, чтобы достичь последних потомков условия и извлечь его значение.

Я проверяю на основе значения атрибута условия.Если значение атрибута пустое, то сделайте один шаг вниз и проверьте, присутствует ли значение атрибута, и если да, то выберите его значение, в противном случае продолжайте снижаться.

Вот код, который я использовал для получения значений.Это также будет работать для случая, когда два условия находятся на одном уровне.

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"}}

PS Я не PHP-разработчик.Итак, игнорируйте кодировку непрофессионала.:)

0 голосов
/ 28 февраля 2012

Правила связаны со всем продуктом для веб-сайта. Не существует правил, установленных для конкретных товаров / категорий с точки зрения базы данных. Для каждого продукта в корзине Magento проверит все ваши правила для веб-сайта. Эта операция выполняется в классе Mage_SalesRule_Model_Validator. Единственный способ решить ваш запрос - расширить функциональный процесс из этого класса (по крайней мере, я так думаю: p).

...