Запускает что-то, когда правило цены каталога становится активным/неактивным


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

Я пробовал использовать 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.

В дополнительной заметке он также запускается каждый раз, когда я сохраняю продукт - независимо от того, имеет ли указанный продукт правило цены или нет, - а затем выводит идентификатор продукта в журнале.

Я немного не уверен, что это даже подходящее событие для запуска.

Author: Floddy, 2015-01-25

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, однако я пытался быстро разработать это и просто сделал конечно, у меня были имена динамических таблиц.

 0
Author: Tyler V., 2015-04-16 23:11:38