目前Magento作为全世界最先进的电子商务框架,无数人趋之若鹜, 惊讶于它的完美,惊世之作呼之欲出,但也无数人拜倒在这位巨人的迷宫中,留下走不出之旋窝的遗憾,现本人把自己对Magento的苦苦专研得出的一些见解给大家分享,希望解救需要帮助的人。

本人对Magento的整体框架做了一些研究并抽象出Magento的程序执行流程图,仅代表个人对Magento的研究结果,如有出入,请留言告知。

下面是对该执行图做的注释:

F ①: Magento的URL形式分为两种, 一种是Page类型, 是来之Magento后端的CMS中创建的页面, 也即是对CMS模块的请求, 另外一种是对其他模块的URL请求。 所有这些URL都可以通过Magento中的核心Modules和自定义Modules或全局配置文件Config。xml中获知所使用的控制器和方法, 全局配置文件Config。xml中的模块名称, 找到模块, 从而能找到该模块对应的Layout文件….xml。

F ②: 根据URL中的{模块名称}_{控制器}_{方法}来在该layout文件中匹配控制标签而找到该URL使用的layout。 在layout文件对可以看到对于每个layout都有说明, 对于layout文件中…布局, 是默认每个页面都会使用的布局, 这些layout包括catalog_msrp.xml, catalog.xml, checkout.xml, cms.xml, customer.xml, googleanalytics.xml, newsletter.xml, page.xml, poll.xml, rss.xml, tag.xml, wishlist.xml里面的…。 layout中是通过reference的方式来增加或替换Block, 通过remove来移除Block, 通过update来更新Block, 通过after或before来调整Block位置等等。

F ③: 根据使用的layout中的block标签中的template=”….phtml”找到使用的模板, Page模块对应的Template是母模板, 这个母模板是自动加载进来, 用于被其他的Template使用$this->getChildHtml(‘Block as value’)的方式(使用该方式的前提是这个Block一定是嵌套在其他Block之内)或从相应的Block实例对象$this来增加内容。

F ④: 根据使用的layout中的block标签中的type=”…”找到使用的Block, Page模块对应的Block是所有其他Block的“父类”, 会自动加载, 这个Block里面的方法可以被其他Block使用。

D ①: 控制器和方法中会通过Mage静态工厂方式(例如: Mage:: getModel(‘catalog/product’), Mage:: helper(‘checkout/cart’)等)根据参数从对应模块中的Model和Helper文件中的模型获取数据。

D ②: 每个Block其实就是对应template的一个控制器, 它也是通过Mage静态工厂方式(同上)获取数据。

D ③: Block获取的数据是存储在该Block的实例对象中, 对应的template可以通过$this(即该Block的实例对象)来获取数据, 放置在Html中。

(提示: 本文为个人原创, 请尊重辛苦劳作, 拷贝本文, 请附上链接: Magento执行流程详解