Я хочу проверить, есть ли промоция продвижения продукта, а затем наклейте рекламную этикетку на этом продукте на странице списка категорий. Но я не знаю, как пройти через все правила корзины покупок и получить продукты/категории, связанные с каждым правилом.Показать список правил и категорий продуктов для покупок, связанных с каждым правилом
РЕДАКЦИЯ
Благодаря seanbreeden, но я не могу вытащить SKUs из $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);
}
}
он ничего не показывает, так что на самом деле не знаю, как вытащить SKUs здесь.
EDIT2 Как предложил Алаксандр, я не использую неэтериализованный подход. Я делаю это, как это сейчас:
$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;
А затем проверять в странице списка, если ы совпадает в пределах $ SKUs массива затем показать этикетку. Но опять же есть ограничение с этим подходом. Я думаю о другом подходе (я не уверен, что это возможно). Думая о создании новой таблицы (чтобы сохранить продукты правил продаж). Всегда сохраняйте правило продаж, ловите событие правила сохранения и обновите таблицу с именем правила и всеми связанными продуктами. Затем на странице списка проверьте, что таблица, если продукты существуют в таблице, показывает соответствующую метку. Теперь я думаю, что событие - adminhtml_controller_salesrule_prepare_save (не на 100% уверен), но я не знаю, как получить sku из условия правила в наблюдателе, чтобы сохранить в новой таблице.
Вы должны быть очень осторожны с несериализацией данных о правилах. Вы должны проверить правило для каждого из них, и это может быть очень сложным. Например, правило может быть, если sku является «sku001», но может также быть sku не «sku001». И есть также сочетание правил и так далее. Я не думаю, что вы получите хорошее направление ... – Alexandre
Спасибо Alexandre. Я подумал об этом, поэтому теперь не использую unserialized. Я обновил вопрос. См. Edit2 – Hum
Вы также не можете сделать это. Вы должны проверить правило для каждого продукта. Но, честно говоря, я думаю, что это слишком сумасшествие! Потому что тогда у вас может быть много ярлыков для одного продукта. Захват сохранения события будет недостаточным, потому что есть возможная дата окончания вашего правила. – Alexandre