从tweet阅读此Ivan Chepurnyi后,必须为客户网站的OnePage Checkout(又名OPC)添加一个步骤,我认为这是学习新内容的绝佳机会。 /> 我是事件/观察者的忠实粉丝,尽可能地尝试使用它们,但到目前为止,我发现使用它们并不是很优雅。我的意思是,没有可用的有用事件(据我所知)。
例如,从我的头脑中,我想到了两件我需要改变的事情,并且在重写时非常容易,而事件/观察者会很复杂:
Mage_Checkout_Block_Onepage::getSteps()
定义组成OPC的不同步骤。我真的看不出哪个事件会让我改变那个Mage_Checkout_OnepageController
的相应操作会返回下一步的html以及goto_section
和update_section
数据。再一次,我没有看到任何有趣的事件这只是没有真正研究我必须实施的每一个细节,我想还有更多的陷阱。
javascript部分也是一样:我习惯扩展checkout js类:
var MyModule = Class.create(Checkout, {
//write some code here
});
但我想知道是否有更好的方法。
我意识到Ivan的推文适用于PSP开发者,我正在为最终客户工作,但我想学习新的东西
答案 0 :(得分:2)
推文的主要思想是,大多数开发自定义付款方式的开发人员并不关心与网站上的其他模块或自定义设备的冲突。
至于你的第一步,它是Magento核心的问题,它在_getSteps()
方法中的所有结帐步骤都是硬编码的,你不能在没有覆盖的情况下更改它。
即使仅使用controller_action_predispatch
和controller_action_postdispatch
操作,第二个也很容易实现。
On preDispatch
Magento通过使用FLAG_NO_DISPATCH
,FLAG_NO_PRE_DISPATCH
和FLAG_NO_POST_DISPATCH
等控制器标志,为您提供了很大的自由来控制控制器操作流程。
在postDispatch
上,您可以通过修改响应对象的主体来修改现有结果。如果返回JSON,您可以轻松地将此数据转换回数组,修改它并将其设置为JSON。
是的,这个解决方案实现起来可能更复杂,但它会大大增加您与其他解决方案的模块兼容性,因为您可以安全地覆盖其他模块对同一控制器的覆盖。
对于JavaScript,您应该始终认为它是动态语言,并且语言级别上没有类本身,一切都是对象,您始终可以通过使用自己的实现替换现有对象原型来扩展现有功能变量:
window.Checkout = Class.create(Checkout, {
someMethod: ($super, param1, param2) {
// Do you custom staff before
$super(param1, param2);
// Do you custom staff after
}
});
在以下示例中,Checkout“class”的原型将被您的实例替换,该实例会自定义其someMethod
功能。 $super
变量包含父“方法”的Function
对象,它被覆盖并且它将与同一种类的另一种方法(甚至是同一种方法)一起使用,因为它只是仅修改包含该方法定义的属性。
如果您想了解有关此JS语言功能的更多信息,请参阅此网站:http://www.crockford.com/javascript/javascript.html