magento - 向 OPC 添加步骤而不覆盖

标签 magento checkout extend

读完这篇文章后tweet来自Ivan Chepurnyi并且必须为客户网站的 OnePage Checkout(又名 OPC)添加一个步骤,我认为这是学习新东西的绝佳机会。
我是事件/观察者的忠实粉丝,并尝试尽可能多地使用它们,但正是对于 OPC,到目前为止我发现使用它们并不是很优雅。我的意思是,没有可以使用的有用事件(据我所知)。

例如,从我的脑海中,我想到了两件事我必须改变,并且重写很容易,而事件/观察者会过于复杂:

  1. 步骤:Mage_Checkout_Block_Onepage::getSteps() 定义组成 OPC 的不同步骤。我真的看不出什么事件可以让我改变这一点
  2. goto:完成一个步骤后,Mage_Checkout_OnepageController 的相应操作会返回下一步的 html 以及 goto_sectionupdate_section 数据。再说一次,我没有看到任何有趣的事件

这只是没有真正研究我必须实现的每个细节,我想还有更多的陷阱。
javascript 部分也是如此:我用来扩展 checkout js 类:

var MyModule = Class.create(Checkout, {
    //write some code here
});

但我想知道是否有更好的方法。

我意识到 Ivan 的推文是针对 PSP 开发人员的,而且我正在为最终客户工作,但我想学习一些新东西

最佳答案

该推文的主要思想是,大多数开发自定义支付方式的开发人员并不关心与网站上的其他模块或自定义项的冲突。

单页结账步骤

至于你的第一步,这是Magento核心的问题,它的_getSteps()方法中的所有结帐步骤都是硬编码的,你不能在不覆盖的情况下更改它。

Controller 覆盖

即使仅使用 controller_action_predispatchcontroller_action_postdispatch 操作,第二个也很容易实现。

preDispatch 上 Magento 为您提供了很大的自由度,可以通过使用 FLAG_NO_DISPATCHFLAG_NO_PRE_DISPATCHFLAG_NO_POST_DISPATCH

postDispatch上,您可以通过修改响应对象的主体来修改现有结果。如果返回 JSON,您可以轻松地将这些数据转换回数组,修改它并设置回 JSON。

是的,这个解决方案的实现可能更复杂,但它大大提高了您的模块与其他模块的兼容性,因为您可以安全地处理其他模块可能覆盖的同一 Controller 。

JavaScript 自定义

对于 JavaScript,您应该始终认为它是动态语言,并且在语言级别上没有类本身,一切都是对象,并且您始终可以通过使用分配的方法用自己的实现替换现有对象原型(prototype)来扩展现有功能变量:

window.Checkout = Class.create(Checkout, {
      someMethod: ($super, param1, param2) {
          // Do you custom staff before
          $super(param1, param2);
          // Do you custom staff after
      }
});

在下面的示例中,Checkout“类”的原型(prototype)被替换为自定义其 someMethod 功能的实例。 $super 变量包含父“方法”的 Function 对象,该对象会被覆盖,并且它将与另一个方法的同一类(甚至是相同),因为它只修改包含该方法定义的属性。

如果您想了解更多有关此 JS 语言函数的信息,请参阅此网站:http://www.crockford.com/javascript/javascript.html

关于magento - 向 OPC 添加步骤而不覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607492/

相关文章:

Magento - cms/页面集合 - 应用过滤器仅返回给定商店 ID 唯一的页面(即未分配给其他商店)

php - 未捕获的类型错误:传递给 Mage_Core_Model_Store_Group::setWebsite() 的参数 1 必须是 Mage_Core_Model_Website 的实例,给定 null

php - 在 woocommerce 结账时添加自定义税值

css - LESS 是否具有 "extend"功能?

javascript - "Object doesn' t support method“在IE8中扩展Element.prototype时出错

php - Magento - 高级产品导入

magento - 在 Magento 中通过商店明智地获取产品价格和描述

php - 如何让 Woocommerce 不保存结账账单字段

php - 有条件地将邮政编码结帐字段设置为必填字段(WooCommerce 中的特定国家/地区除外)

javascript - 将两个数组与对象合并