我现在在magento工作,开发用于检查是否使用优惠券代码的模块。详细信息存储在新表中。在我的config.xml中,我指定了观察者页面,用于从db表中获取详细信息。但是我不知道magento中观察者页面的确切用法。我可以将观察者页面用于此用法吗?

但是它继续执行错误,我检查了日志文件:

a:5:{i:0;s:203:"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=' at line 1";i:1;s:1677:"#0 C:\wamp\www\Mymagento\lib\Varien\Db\Statement\Pdo\Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)


我的observer.php文件也显示如下

class Module_Voucher_Model_Observer {
    public function __contruct() {
        $coupon_code = trim(Mage::getSingleton("core/session")->getData("coupon_code"));
    }

    public function getresultofVoucher($coupon_code) {
        $resource = Mage::getSingleton('core/resource');
        $readConnection = $resource->getConnection('core_read');
        $table = "voucher_code_status_table";
        $query = 'SELECT * FROM ' . $table. 'WHERE value='.$coupon_code;
        $results = $readConnection->fetchAll($query);

        return $results;
    }
}


和我的Indexcontroller.php如下所示:

class Module_Voucher_IndexController extends Mage_Core_Controller_Front_Action {
    /**
    * Coupon code checking
    **/
    public function indexAction() {
        $this->loadLayout();
        $block = $this->getLayout()->createBlock('Mage_Core_Block_Template','vouchercode',
        array('template' => 'voucher/vouchercode.phtml')
        );
        $this->getLayout()->getBlock('left')->append($block);
        $this->renderLayout();
    }

    public function CheckAction() {
        $coupon_code = $this->getRequest()->getParam('coupon_code');
        //$coupon_code ='63663';
        if ($coupon_code != '') {
            Mage::getSingleton("core/session")->setData("coupon_code",$coupon_code);     //("checkout    /session")->
        }
        else {
            //
            //echo 'error : Voucher code issue';
        }
        if ($this->getRequest()->getParam('url')) {
            header('HTTP/1.1 301 Moved Permanently');
            $gclid = $this->getRequest()->getParam('');
            $url = $this->getRequest()->getParam('url');
            header('Location: /' . $url . '?voucherbox=' . $gclid);
            die();
        }
        else {
            $this->_redirect("/");
        }
    }
}


我认为没有选项可以在控制器页面中调用观察者页面函数。

最佳答案

@SIBI A,我只是想回答有关使用观察者的问题。

观察者主要用于在magento应用程序流程中发生特定事件时添加更多功能/更改某些现有行为。

在专注于观察者之前,我们应该对在magento中可以观察到的各种事件有所了解。例如,“ sales_order_place_after”是magento在下达新订单时触发的事件。

如果您在magento根文件夹中搜索字符串“ Mage :: dispatchEvent”,您会看到很多语句,这些语句会在不同情况下触发各种事件。

让我们考虑以下情形。它只是理解基本概念的一个示例。

场景:
 当客户下新订单时,我们需要更新sales_flat_order表中的“ customer_note”字段。(注意:sales_flat_order是保存有关每个订单基本信息的表)

即使可能存在许多实现此功能的常规方法,我们也可以通过新的观察者来实现。让我写出该过程的一些基本步骤


创建一个模块
创建一个模型类
添加一个观察者方法,该方法侦听事件“ order_place_after”
定义观察者方法,访问该方法内部的$ order对象
更新$ order对象中的“ customer_note”字段并保存。


如果上述步骤已完成且工作正常,当我们下新订单时,我们可以看到“ customer_note”列(在sales_flat_order表中)具有通过新的观察者方法更新的值。

如果检查Mage_Sales_Model_Order类中的place()函数,则可以看到magento触发了我们正在监听的事件“ sales_order_place_after”。它将当前$ order对象作为参数传递给事件。我们将在观察者方法中将此$ order对象作为参数,因为我们正在侦听此特定事件。

我在这里提供了可用于创建模块以完成上述操作的文件。

1)app / etc / modules / Research_OrderCustomerNoteModify.xml

<?xml version="1.0"?>
<config>
 <modules>
  <Research_OrderCustomerNoteModify>
   <active>true</active>
   <codePool>local</codePool>
  </Research_OrderCustomerNoteModify>
 </modules>
</config>


2)app / code / local / Research / OrderCustomerNoteModify / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Research_OrderCustomerNoteModify>
            <version>0.1.0</version>
        </Research_OrderCustomerNoteModify>
    </modules>
    <global>
        <models>
            <research_ordercustomernotemodify>
                <class>Research_OrderCustomerNoteModify_Model</class>
            </research_ordercustomernotemodify>
        </models>
        <events>
            <sales_order_place_after>
                <observers>
                    <research_ordercustomernotemodify_update_customernote_field>
                        <class>research_ordercustomernotemodify/observer</class>
                        <method>updateCustomernoteField</method>
                    </research_ordercustomernotemodify_update_customernote_field>
                </observers>
            </sales_order_place_after>
        </events>
    </global>
</config>


3)app / code / local / Research / OrderCustomerNoteModify / Model / Observer.php

<?php
class Research_OrderCustomerNoteModify_Model_Observer
{
    public function updateCustomernoteField($observer)
    {
        $order = $observer -> getEvent() -> getOrder();
        $currentNote = $order->getCustomerNote();
        $order->setCustomerNote('Customer has quoted this'.$currentNote);
        $order->save();
        return;
    }
}

10-07 19:24
查看更多