Запускает что-то, когда правило цены каталога становится активным/неактивным
В принципе, мне нужен способ узнать, когда правило цены становится активным/неактивным, и на какие продукты оно влияет. Как при выполнении вручную, так и в соответствии с датой, указанной в правиле.
Я пробовал использовать catalogrule_after_apply
, но не могу извлечь из него никаких соответствующих данных.
Есть какие-нибудь предложения?
Редактировать:
Я довольно много возился, сбрасывая данные:
<catalogrule_after_apply>
<observers>
<my_module_catalogrule_after_apply>
<type>singleton</type>
<class>My_Module_Model_Observer</class>
<method>catalogruleProductApiUpdate</method>
</my_module_catalogrule_after_apply>
</observers>
</catalogrule_after_apply>
И
class My_Module_Model_Observer
{
public function catalogruleProductApiUpdate (Varien_Event_Observer $observer)
{
$product = $observer->getEvent()->getProduct();
Mage::log('crPAU ran:' . print_r($product, true));
}
}
И подобные вещи - просто не нашел все, что имеет отношение к делу. Я успешно использовал catalog_product_save_commit_after
и catalog_product_attribute_update_before
.
В дополнительной заметке он также запускается каждый раз, когда я сохраняю продукт - независимо от того, имеет ли указанный продукт правило цены или нет, - а затем выводит идентификатор продукта в журнале.
Я немного не уверен, что это даже подходящее событие для запуска.
1 answers
Этот код может не решить точно, какова ваша конечная цель, но, надеюсь, он покажет вам, как извлечь некоторую информацию из таблиц catalogrule.
Моя цель состояла в том, чтобы заполнить значение атрибута продукта либо Да, либо Нет в зависимости от того, влияет ли в настоящее время на данный продукт Правила цен каталога (для использования в Корпоративном визуальном мерчандайзере.)
Это работает на Magento EE 1.14, но должно работать на современном Magento CE как хорошо:
public function hookCatalogruleAfterApply(Varien_Event_Observer $observer) {
$product = $observer->getEvent()->getProduct();
if ($product) {
$this->updateAnyCprAppliedSingle($product);
} else {
$this->updateAnyCprAppliedMany();
}
}
protected function updateAnyCprAppliedSingle($product_id) {
/*
* DB Setup
*/
$resource = Mage::getSingleton('core/resource');
$readConnection = $resource->getConnection('core_read');
$crp = $resource->getTableName('catalogrule_product');
$sql = <<<SQL
SELECT DISTINCT crp.product_id FROM {$crp} crp
WHERE crp.product_id = '{$product_id}'
SQL;
$productRuleStatus = $readConnection->fetchRow($sql);
$actionModel = Mage::getModel('catalog/product_action');
if (!empty($productRuleStatus)) {
$actionModel->updateAttributes(
array($product_id),
array('any_cpr_applied' => 1),
0
);
} else {
$actionModel->updateAttributes(
array($product_id),
array('any_cpr_applied' => 0),
0
);
}
}
protected function updateAnyCprAppliedMany() {
/*
* DB Setup
*/
$resource = Mage::getSingleton('core/resource');
$readConnection = $resource->getConnection('core_read');
$cpe = $resource->getTableName('catalog_product_entity');
$crp = $resource->getTableName('catalogrule_product');
$sql = <<<SQL
SELECT DISTINCT cpe.entity_id, IF(crp.product_id IS NULL, 0, 1) as applied
FROM {$cpe} cpe
LEFT JOIN {$crp} crp
ON cpe.entity_id = crp.product_id
SQL;
$productRuleStatuses = $readConnection->fetchAll($sql);
if (!empty($productRuleStatuses)) {
$actionModel = Mage::getModel('catalog/product_action');
$yes = array();
$no = array();
foreach ($productRuleStatuses as $productRuleStatus) {
if ($productRuleStatus['applied'] == 1) {
$yes[] = $productRuleStatus['entity_id'];
} else {
$no[] = $productRuleStatus['entity_id'];
}
}
if (!empty($yes)) {
$actionModel->updateAttributes(
array_values($yes),
array('any_cpr_applied' => 1),
0
);
}
if (!empty($no)) {
$actionModel->updateAttributes(
array_values($no),
array('any_cpr_applied' => 0),
0
);
}
}
}
Я намеренно назвал это "any_cpr_applied", потому что это не учитывает веб-сайт или группу клиентов. Если вам нужны более подробные сведения о том, на каком веб-сайте затрагивается продукт, для какой группы клиентов затрагивается продукт или как это влияет на продукт, вам потребуется объединить больше таблиц.
Краткое замечание о моих прямых запросах к таблицам. Вы можете полностью заменить это использованием моделей Magento, однако я пытался быстро разработать это и просто сделал конечно, у меня были имена динамических таблиц.