Magento 1.7观察者模块

时间:2013-09-07 00:12:43

标签: php magento observers

我一直在努力让我的观察者模块发挥作用。我正在使用Magento 1.7.0.2,一切似乎都是正确的XML。没有错误,但我不相信它正在解雇。我希望它在事件sale_order_save_after上做三件事情如下:

如果订单状态为“完成”,请执行以下操作:

1)将自定义属性“location”更改为“SOLD”

2)将目录/搜索的可见性更改为目录。

3)将所有指定类别的订单中的所有产品移至一个新类别(ID:80)

最后保存/刷新缓存。我的PHP代码不完整,但我至少会喜欢它。第一步和第二步应该有效,不知道如何处理以编程方式更改类别。

以下是我的代码:

应用/代码/本地/尖峰/自动存档的/ etc / config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Pinnacle_Autoarchive>
            <version>0.0.1</version>
        </Pinnacle_Autoarchive>
    </modules>
    <global>
        <models>
                <Pinnacle_Autoarchive>
                    <class>Pinnacle_Autoarchive_Model</class>
                </Pinnacle_Autoarchive>
        </models>
    </global>        
            <adminhtml>
                 <events>
                     <sales_order_save_after>
                         <observers>
                             <pinnacle_autoarchive>
                                <type>model</type>
                                <class>pinnacle_autoarchive/observer</class>
                                <method>salesOrderSaveAfter</method>
                             </pinnacle_autoarchive>
                         </observers>
                     </sales_order_save_after>
                </events>
       </adminhtml>
</config>     

应用/代码/本地/尖峰/自动存档/型号/ Observer.php

<?php
/*
 * Auto Archive all products on last order when status is complete
 */
class Pinnacle_Autoarchive_Model_Observer
{

public function salesOrderSaveAfter($observer)

{
   $order = $observer->getEvent()->getOrder();
        $orderStatus = $order->getStatus();


        if ($orderStatus == 'complete') {
                $items = $order->getAllItems();
                foreach ($items as $item) {
                    $productsToUpdate[] = $item->getProductId();
                }
                $theAttributeToUpdate = 'location';
                $theAttributeValue = 'SOLD';
                Mage::getSingleton('catalog/product_action')->updateAttributes($productsToUpdate, array($theAttributeToUpdate => $theAttributeValue), 0);
                }

        if ($orderStatus == 'complete') {
                $items = $order->getAllItems();
                foreach ($items as $item) {
                    $productsToUpdate[] = $item->getProductId();
                }
                $theAttributeToUpdate = 'visibility';
                $theAttributeValue = 'Catalog';
                Mage::getSingleton('catalog/product_action')->updateAttributes($productsToUpdate, array($theAttributeToUpdate => $theAttributeValue), 0);
                }

        //if ($orderStatus == 'complete') {
                //$items = $order->getAllItems();
                //foreach ($items as $item) {
                //    $productsToUpdate[] = $item->getProductId();
                //}

                //Mage::getSingleton('catalog/product_action')->$productsToUpdate->setCategoryIds(array(80));
                //}//            

}
?>

任何帮助都会受到赞赏,因为我似乎无法解决这个问题。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用此链接

http://snipplr.com/view/56959/

并制作你的etc / modules / config.xml

或者您可以将现有代码与此代码进行比较,您可以确定找到解决方案,以便在任何订单放置后以保存方法添加代码。

希望这对您有所帮助。

答案 1 :(得分:0)

看起来您config.xml就是问题所在。您在adminhtml内定义了观察者,而不是global

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Pinnacle_Autoarchive>
            <version>0.0.1</version>
        </Pinnacle_Autoarchive>
    </modules>
    <global>
        <models>
                <Pinnacle_Autoarchive>
                    <class>Pinnacle_Autoarchive_Model</class>
                </Pinnacle_Autoarchive>
        </models>

        <events>
             <sales_order_save_after>
                   <observers>
                        <pinnacle_autoarchive>
                           <type>model</type>
                           <class>Pinnacle_Autoarchive_Model_Observer</class>
                           <method>salesOrderSaveAfter</method>
                         </pinnacle_autoarchive>
                    </observers>
              </sales_order_save_after>
         </events>

    </global>        
</config>