自定义Events&Observer来实现订单评论(Custom Order Comments)

原创 2012年03月25日 18:03:24

除了强大的面向对象机制,比如重写或者继承来覆盖Magento本身的行为之外,还可以通过事件观察者模式来更新Magento固有的工作线路。


事件(Events)是发生在某一特定的地方的顺序流。打个比方说,客户下订单的顺序流:

1. 保存订单的详细信息

2. 发送订单的确认信息给客户

事件则可能在邮件的发出之前或者之后来引入自定义逻辑。


观察者(Observer)是一个事件的处理程序。它监听对应的事件,并且做出相应的反应。


使用Events + Observer 来覆盖行为类

简单地说,假设你需要彻底改变或者延长核心的逻辑,那么你的新逻辑将被重用或者覆盖现有的核心逻辑。如果你是对Magento提供的现有逻辑比较熟悉,并且需要添加新的核心逻辑的话,请使用事件。


举个例子,客户下单前,可以添加自己的附近信息。

Step 1 激活你的module 
我们创建一个叫CustomerOrderComments的模块,并且以Yip来作为命名空间。

<?xml version="1.0"?>
<config>
    <modules>
        <Yip_CustomerOrderComments>
            <active>true</active>
            <codePool>local</codePool>
        </Yip_CustomerOrderComments>
    </modules>
</config>
Step 2 创建模块的配置文件

针对checkout_type_onepage_save_order事件,我们加入自己的观察者来进行监听,我们把observer类命名为Yip_CustomerOrderComments_Model_Observer

<?xml version="1.0"?>
<config>
    <modules>
        <Yip_CustomerOrderComments>
            <version>0.1.0</version>
        </Yip_CustomerOrderComments>
    </modules>
	<frontend>
		<events>
			<checkout_type_onepage_save_order>
				<observers>
					<Yip_CustomerOrderComments_Onepage>
						<type>singleton</type>
						<class>Yip_CustomerOrderComments_Model_Observer</class>
						<method>setCustomerOrderComments</method>
					</Yip_CustomerOrderComments_Onepage>
				</observers>
			</checkout_type_onepage_save_order>
		</events>
	</frontend>
</config>
Step 3 创建模版

在app\design\frontend\default\your_template\template\checkout\onepage下重新写agreements.phtml模版,这里主要是加入textarea元素,命名name为customerOrderComments,方便Observer接收。

<?php if (!$this->getAgreements()) return; ?>
<form action="" id="checkout-agreements" onsubmit="return false;">
<ol class="checkout-agreements">
<?php foreach ($this->getAgreements() as $_a): ?>
    <li>
        <div class="agreement-content"<?php echo ($_a->getContentHeight() ? ' style="height:' . $_a->getContentHeight() . '"' : '')?>>
            <?php if ($_a->getIsHtml()):?>
                <?php echo $_a->getContent() ?>
            <?php else:?>
                <?php echo nl2br($this->htmlEscape($_a->getContent())) ?>
            <?php endif; ?>
        </div>
        <p class="agree">
            <input type="checkbox" id="agreement-<?php echo $_a->getId()?>" name="agreement[<?php echo $_a->getId()?>]" value="1" /> 
            <label for="agreement-<?php echo $_a->getId()?>"><?php echo $_a->getCheckboxText()?></label>
        </p>
    </li>
<?php endforeach ?>
</ol>

<ol class="checkout-agreements">
    <li>
		<label for="customerOrderComments"><?php echo Mage::helper('core')->__('Other Quote Information') ?></label>
		<br/><textarea name="customerOrderComments" id="customerOrderComments" style="width:450px;height:100px;"></textarea>
	</li>
</ol>

</form>


Step 4 创建观察者类

class Yip_CustomerOrderComments_Model_Observer
{
    public function setCustomerOrderComments(Varien_Event_Observer $observer)
    {
        $_order = $observer->getEvent()->getOrder();
        $_request = Mage::app()->getRequest();
		
        $_comments = strip_tags($_request->getParam('customerOrderComments'));

        if(!empty($_comments)){
            $_order->setCustomerNote('<br/><strong>Extra Instructions:</strong> ' .$_comments);
			$_order->addStatusHistoryComment('<br/><strong>Extra Instructions:</strong> ' .$_comments);
			//$_order->save();
        }
		
        return $this;
    }
}

这里用getparam接收模版中的customerOrderComments,并且将其用setCustomerNote的方法来保存。OK,附上两个效果图:

前台下单前:


后台订单页:


That's all! Thanks~

转载请表明出处,谢谢!


版权声明:本文为博主原创文章,未经博主允许不得转载。

10-3 实现自定义模型(Implementing Custom Models)

Qt预定义的类已经提供了方便处理和显示数据的方式。然而,一些数据源不能直接使用这些定义好的模型,这就需要创建自定义的模型,优化对这些数据的处理。 在创建自定义模型之前,让我们首先回顾一下Qt的mod...

Qt中 实现自定义模型(Implementing Custom Models)

Qt预定义的类已经提供了方便处理和显示数据的方式。然而,一些数据源不能直接使用这些定义好的模型,这就需要创建自定义的模型,优化对这些数据的处理。 在创建自定义模型之前,让我们首先回顾一下Qt的mod...

Volley实现自定义的网络请求Implementing a Custom Request

编写:kesenhoo - 原文:http://developer.android.com/training/volley/request-custom.html 这节课会介绍如何实现你自定义的请求...

自定义tableViewCell实现自定义表格(需代码实现)ui中tableviewcell设置成custom

设计自定义的原型单元格 对于很多应用来说,使用默认的单元格风格就OK了,但是我偏偏要在每一个单元格的右边加上一个一个图片来表示选手的评级,但是添加图片对于默认类型的单元格来说并不支持...

使用Custom Control自定义控件

  • 2010年07月01日 09:43
  • 66KB
  • 下载

自定义窗体Custom Form

  • 2010年02月22日 11:47
  • 233KB
  • 下载

Node.Js events模块(二)-EventEmitter自定义操作事件

说明 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个f...

自定义RatingBar,五星评论

  • 2016年10月20日 14:51
  • 544KB
  • 下载

Folding Custom Regions with Line Comments -- 解决idea中代码收起的问题

Folding Custom Regions with Line Comments With IntelliJ IDEA, you can surround a fragment of so...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义Events&Observer来实现订单评论(Custom Order Comments)
举报原因:
原因补充:

(最多只允许输入30个字)