我现在在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;
}
}