读完这篇文章后tweet来自Ivan Chepurnyi并且必须为客户网站的 OnePage Checkout(又名 OPC)添加一个步骤,我认为这是学习新东西的绝佳机会。
我是事件/观察者的忠实粉丝,并尝试尽可能多地使用它们,但正是对于 OPC,到目前为止我发现使用它们并不是很优雅。我的意思是,没有可以使用的有用事件(据我所知)。
例如,从我的脑海中,我想到了两件事我必须改变,并且重写很容易,而事件/观察者会过于复杂:
- 步骤:
Mage_Checkout_Block_Onepage::getSteps()
定义组成 OPC 的不同步骤。我真的看不出什么事件可以让我改变这一点 - goto:完成一个步骤后,
Mage_Checkout_OnepageController
的相应操作会返回下一步的 html 以及goto_section
和update_section
数据。再说一次,我没有看到任何有趣的事件
这只是没有真正研究我必须实现的每个细节,我想还有更多的陷阱。
javascript 部分也是如此:我用来扩展 checkout js 类:
var MyModule = Class.create(Checkout, {
//write some code here
});
但我想知道是否有更好的方法。
我意识到 Ivan 的推文是针对 PSP 开发人员的,而且我正在为最终客户工作,但我想学习一些新东西
最佳答案
该推文的主要思想是,大多数开发自定义支付方式的开发人员并不关心与网站上的其他模块或自定义项的冲突。
单页结账步骤
至于你的第一步,这是Magento核心的问题,它的_getSteps()
方法中的所有结帐步骤都是硬编码的,你不能在不覆盖的情况下更改它。
Controller 覆盖
即使仅使用 controller_action_predispatch
和 controller_action_postdispatch
操作,第二个也很容易实现。
在 preDispatch
上 Magento 为您提供了很大的自由度,可以通过使用 FLAG_NO_DISPATCH
、FLAG_NO_PRE_DISPATCH
和 FLAG_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/