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

电商订单系统设计简析(二) 终于等到周日,每周唯一的休息天,还是先把文章写完再休息。令我惊喜的是,上次的那篇文章已经得到了部分认可,给了我更新的动力。今天就写上次的剩下的半部分,后面我会根据网友的补充再重新整理出一份完整的,方便大家阅读。订单系统的完整性离不开几个部分,上次讲订单字段,各种字段信息组成了一个订单详情页。如果将字段信息比喻成订单系统的血液,那订单状态的切换就好比订单系统灵活的神经,没有订单状态之间的切换,就构成... 阅读详情

除了强大的面向对象机制,比如重写或者继承来覆盖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~

转载请表明出处,谢谢!


OpenCart之商品评论(Reviews)教程 本文由opencart中国网站制作,如有转载请注明出处:http://www.opencartchina.com/bbs/topic991.html 如果对opencart感兴趣,可以加入QQ群:282797742进行讨论。 访问路径:商品目录(Catalog) -> 商品评论 (Downloads),点击后出现下图所示: 后台部分显示所有网站前台或后台管理员添加的针对某 阅读详情

相关推荐

SMPTE ST 2110 概论(三)

SMPTE ST 2110 概论(三)ST 2110-30:未压缩的PCM音频流ST 2110-31:非PCM音频传输ST 2110-40:辅助数据传输结语 ST 2110-30:未压缩的PCM音频流 鉴于音频系统是广播系统中最复杂,也是最重要的一套系统,我们先来回顾一下广电音频系统的历史。 最老式的音频都是基于模拟信号的,具有有限的动态范围,并且用连续的电压变化来描述音频。再后来就基于数字信号(...

Cidd0422的博客 1万+

magento2 观察者模式的介绍

一、magento2 观察者模式介绍 mageno2在很多地方使用了观察者模式,方便解耦和扩展 ,典型的有在注册成功后会发布customer_register_success事件 在customer/controller/account/CreatePost文件可以查看到 $this->_eventManager->dispatch( 'custom...

qq_26511139的博客 375

三维视觉智能焊接系统:免示教技术的工业应用实践

本文深入探讨了三维视觉智能焊接系统中免示教技术的工业应用实践。该系统通过三维视觉相机实时扫描工件,自动识别焊缝并生成轨迹,将产线换型时间从数小时缩短至几分钟,显著提升了生产柔性。文章详细解析了其核心硬件、算法及工厂部署流程,并展望了与数字孪生、工艺智能化融合的未来趋势。

weixin_29091105的博客 432

magento2中的事件Events和观察者详细介绍

这些事件是使用Magento\Framework\event\Manager类调度的,该类实现了Magento\ Framework\event \ ManagerInterface。要调度事件,我们只需调用事件管理器实例的调度方法,为其提供我们正在调度的事件的名称以及我们希望传递给观察者的可选数据数组。Magento\Sales\Model\Order等,我们可以看到,这些实体类型中有很多本质上是从Magento\Framework\Model\AbstractModel扩展而来的,

github_31369641的博客 225

LTM4644 四通道并联 16A 输出配置:PCB 布局 3 要点与热仿真验证

本文详细解析了LTM4644四通道并联实现16A输出的PCB布局与热管理要点,包括电流路径对称性设计、热优化布局技巧和接地系统优化。通过实际工程案例,展示了如何确保电流均流、热分布均衡及长期可靠性,为FPGA、ASIC和服务器主板供电设计提供高效解决方案。

weixin_33314040的博客 399

uni-app - 修改默认端口,H5 项目控制台运行出来的 IP 地址的默认端口号(H5 项目运行后控制台,修改项目运行到内置浏览器默认 8080 端口号)

uni-app运行到H5修改默认端口号,uni-app如何修改默认端口,uni-app修改默认端口,uni-app本地运行修改调试已上线微信H5项目,请问在UNIAPP的H5运行调试时候的IP是否可以自己设置固定,uni-app开发环境,如何设置h5服务器的端口,uni-app如何修改默认端,uni-app修改默认端口,uni-app指定端口号,uni-app-修改H5项目控制台运行出来的IP地址的默认端口号(H5项目运行后控制台,修改项目运行到内置浏览器默认8080端口号)

🏆 前端领域优质创作者 9887

Laravel 的 Events(事件) 及 Observers(观察者)

Laravel 的 Events(事件) 及 Observers(观察者) 你是否听说过单一职责原则(single responsibility principle)?我希望是的。它是程序设计的基本原则之一,它基本上的意思就是,一个类有且只有一个职责。换句话说,一个类必须且只能做一件事,而不做其他任何事。 通常,当你构建软件的第一个版本时,一切都好说。但总会发生下面的情况。你的老板会说:是时候推出一些新的功能了。尤其是当更新意味着在这里插入一些额外的行为的时候,你的代码库会变得笨重和马虎。然后你不得不与期限

Ty201313的博客 1493

Xilinx平台SRIO介绍(五)示例工程Example Design介绍

理解IP的使用,少不了Example Design的学习。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

magento目录解析

Magento文件模板目录分布:         /app     _ 应用程序文件夹             /code       _ 存放全部模块             /design     _ 存放用 .xml输出文件 和 .phtml模板文件                 /adminhtml   -用户后台设计                 /frontend

观察者 1076

ABAP Secure Storage 在事务码 SM59 中的应用

系统管理人员在进行维护时,应关注相关日志信息,及时发现可能出现的安全异常,并针对不同安全等级的操作制定相应的备份与恢复策略,以降低潜在风险。该区域在设计上具备高度隔离性,仅允许经过授权的组件访问。保存后,系统会将密码存储在 Secure Storage 中,这种处理方式充分体现了 SAP 标准程序在安全设计上的考量。对于系统管理员而言,这种机制在日常维护与审计中提供了有力的支持,可以通过比对存储数据的哈希值或其他完整性校验手段,及时发现异常变动,保障系统长期稳定运行。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 675

主题035:计算流体力学(CFD)

计算流体力学(Computational Fluid Dynamics, CFD)是利用数值方法求解流体流动、传热传质等问题的学科。CFD已成为化学反应工程中反应器设计和优化的重要工具。∂ρ∂t+∇⋅(ρu)=0 \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{u}) = 0 ∂t∂ρ​+∇⋅(ρu)=0对于不可压缩流动:∇⋅u=0 \nabla \cdot \mathbf{u} = 0 ∇⋅u=0动量方程:∂(ρu)∂t+∇⋅(ρ

kkchenjj的博客 268

javascript设计模式之Observer(观察者)模式

Observer(观察者)是一种设计模式,一个对象(subject)维持一系列依赖于它(观察者)的对象,将任何状态的任何变更自动通知给它们。 Suject(目标) 维护一系列的观察者,方便添加或者删除观察者。 Observer(观察者) 为那些在目标状态发生改变时需获得通知的对象提供更新接口   首先,建立Observer所需要的代码 function ObserverList

vuturn的专栏 8280

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

E-commerce 中订单系统的设计

Schema::create('payments', function (Blueprint $table) { $table-&gt;increments('id'); $table-&gt;unsignedInteger('method_id')-&gt;comment('支付方式'); $table-&gt;unsignedInteger('order_id');7...

weixin_44047053的博客 725

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

订单支付和评论——基于Django框架的天天生鲜电商网站项目系列博客(十五)

系列文章目录 需求分析——基于Django框架的天天生鲜电商网站项目系列博客(一) 网站框架搭建——基于Django框架的天天生鲜电商网站项目系列博客(二) 用户注册模块——基于Django框架的天天生鲜电商网站项目系列博客(三) 用户登录模块——基于Django框架的天天生鲜电商网站项目系列博客(四) 用户中心模块——基于Django框架的天天生鲜电商网站项目系列博客(五) 分布式FastDFS文件系统——基于Django框架的天天生鲜电商网站项目系列博客(六) 首页——基于Django框架的天天生鲜电

IronmanJay 1336

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

laravel model层建立(以及控制器调用)

我们编程一般都是采用mvc的形式,这个想法对我们来说根深蒂固,当我们了解lavarel框架的时候已经被它优雅的编程所折服,那么刚开始我们都会有疑问laravel的model层文件去哪里了,当我们使用PHP artisan make:model privilegeModel(名字随便写,可以不加Model) 创建model 时它默认放在了app同级目录下,那么下面我们就开始在创建的model层中开发

woshihaiyong168的博客 1万+

Magento设置cronjob来让系统自动发送newsletter

用Newsletter来让Magento系统自动发送邮件给已经subscribe的客户email,相信应该是很多人想知道具体怎么操作的,在此小生说明下,有错误的地方欢迎指正! 要让系统自动发送邮件 需要设置cronjob这个东西,他可以自动帮我们完成一些计划任务,这是针对Unix linux机器而言的。linux机器进去Terminal,如果是用虚拟机或者vps进去ssh命令行输入:cronta

YIP 3635

Magento结账时如何移除运费选择步骤(Skip shipping step on onepage checkout)

1.修改app\code\core\Mage\Checkout\Block \Onepage.php 我们需要做的是修改默认的step,就是修改getStep function public function getSteps() { $steps = array(); if (!$this->isCustomerLoggedIn()) { $steps['login'] = $this

YIP 2963

Magento操作Cookie 并且使用观察者&事件来禁用单页面全页缓存(EE FPC)

Groupon(http://www.groupon.hk/)的首次访问会弹出一个框让客户输入电子邮件来订阅他们的最新咨询,只要提交表单或者点已经提交的按钮该框就会消失 并且以后访问都不会出现  大家应该见过  最近按照公司的要求需要在magento里面开发类似的效果。 首先明确这其中使用的原理是cookie 那magento该怎么操纵cookie呢 其实在core的model里面有一个cooki

YIP 2771

Magento 中使用AJAX异步提交数据(Using Ajax with Magento)

如果你想用ajax提交magento的表单数据,可以尝试这种写法 getUrl('yourmoduleCompanyName/index/moduleIndexControllerAction') ?>', {asynchronous:true, evalScripts:fal

YIP 2759

Magento外部Add to cart操作(广告需要)

quick shopping Sku: Qty: Add to cart 以前觉得外部add to cart没什么用,后来才发现可以再帮我们坐推广的网站上使用,其实网站外只需要几行html代码,把如上代码放在外部: 然后add to cart的时候需要做了一跳转: <?php include_once 'app/Mage.php'; Mage:

YIP 2645

Magento前台只有产品的缩略图不显示?

最近发现一个怪异的现象,Magento前台只有产品的缩略图不显示。我检查了之前的操作,后台产品图片的选择设置,media文件夹的权限,缓存等一系列可能引发的因素,发现缩略图还是不显示,那就奇怪了,其他服务器上包括本地都是没问题的。缩略图通常是保存在media下类似这样的路径med

YIP 2595

Magento 新闻模块开发教程 (三) 创建前后端控制器

之前创建了骨架目录并且激活了新模块,现在要为模块创建前台和后台的控制器。1. 首先在app/code/local/Voodoo/News/controllers/ 中创建一个名为IndexController.php的前端控制器:class Voodoo_Ne

YIP 2544

Magento如何通过url参数给购物车添加商品?

<br />如题,如果是简单商品:<br />1.登录后台Catalog|Manage Products,查看对应商品的ID号,比如7<br /> <br />2.然后直接在地址栏输入 url<br />http://yourstoreurl/checkout/cart/add?product=[id]&qty=[qty]<br /> 或者<br /> http://yourstoreurl/checkout/cart/add/product/[id]/qty/[qty]<br /> <br />如果I

YIP 2392

Magento的路由分发机制

有半年没写东西了吧 不是没继续学 确实是懒了 好吧 言归正传! Magento的路由主要为了完成以下三个任务: 1.接收并处理浏览器数据讲它传送给系统的其他部分; 2.定义controller和action来供routes使用; 3.展示浏览器请求数据给blocks,templates和model数据。 其中最核心的前端Controller是Mage_Core_Contr

YIP 2352
上一篇: Get Custom Attribute on frontend list page and cart page(列表页获取自定义属性的三种方法)
下一篇: Magento "Source model metarobots/product_attribute_source_unit not found for attribute"
ddjohn
博客等级 码龄17年 36粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值