2

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

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

  1. 步骤Mage_Checkout_Block_Onepage::getSteps()定义组成 OPC 的不同步骤。我真的看不出有什么事件可以让我改变它
  2. goto:当一个步骤完成时,相应的操作将返回 html以及数据Mage_Checkout_OnepageController以供下一步使用。同样,我没有看到任何有趣的事件goto_sectionupdate_section

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

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

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

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

4

1 回答 1

2

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

单页结帐步骤

至于您的第一步,这是 Magento 核心的问题,它在_getSteps()方法中的所有结帐步骤都是硬编码的,如果不覆盖就无法更改它。

控制器覆盖

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

preDispatchMagento 上,您可以通过使用 和 等控制器标志来自由控制控制器动作的FLAG_NO_DISPATCH流程。FLAG_NO_PRE_DISPATCHFLAG_NO_POST_DISPATCH

您可以通过postDispatch修改响应对象的主体来修改现有结果。在返回 JSON 的情况下,您可以轻松地将此数据转换回数组,对其进行修改并设置回 JSON。

是的,这个解决方案实施起来可能更复杂,但它大大增加了您的模块与其他模块的兼容性,因为您可以安全地使用其他模块可能覆盖同一控制器。

JavaScript 自定义

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

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

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

如果您想了解更多关于这个 JS 语言功能的信息,请参考这个网站:http ://www.crockford.com/javascript/javascript.html

于 2013-01-30T21:01:32.833 回答