最近用magento搭了2个站,于是仔细研究了一下其购物车。
在购物车中SaveBilling处理大致可分以下几步
1.通过Ajax提交到OnePageController.php的saveBillingAction方法
2.处理saveBillingAction中saveBilling方法
2.1 分析sales_flat_quote_address表中有无addressid(一条billing信息就有一个addressid与之相对应),有则更新,无则追加
2.2$this->getQuote()->collectTotals();进行金额计算,展开这个方法,会发现这个方法是在app/code/core/Mage/Sales/Model/Quote/Address.php中定义,其内用反射来找到当前需要计算的模块,而collect函数则在app/code/core/Mage/Sales/Model/Quote/Address/Total/下(通过getTotalModels可以看到其命名空间),也就是说,不管是shipping、subtotal、grand、handling fee、tax、discount等运算规则,其内的运算方法名是统一的,名为collect()。这也就是模板模式。
3.根据用户是否选择the same as shipping information来决定执行_getShippingMethodsHtml
4.执行_getShippingMethodsHtml,返回layout中的checkout_onepage_shippingmethod块信息(其内有显示available.phtml与additional.phtml的信息。具体请参见layout/checkout.xml下block="checkout_onepage_shippingmethod"下的附属块结点所对应模板的phtml文件)
5.将块信息进行json编码,返回给opcheckout.js的savebilling的ajax
6.在opcheckout.js中 savebilling成功后调用onSave,而onSave指向的是nextstep函数
其它模块类似