Magento MVC详解

Magento Alan 11年前 (2014-06-26) 6688次浏览 0个评论 扫描二维码

模型-Models

Magento采用对象关系映射(Object Relational Mapping,简称ORM)方法,尽管还可以使用Zend_Db来直接连接数据库,但大多数的时候我们将使用模型来获取数据。要实现这一任务,Magento提供了如下两种模型:

  • 简易模型(Simple models):这种模型通过简单的一个对象对应一张表的映射方法,也就是说对象属性对应各字段以及表结构
  • EAV模型(Entity Attribute Value):此类模型用于能通过动态的属性数量来描述实体(entities)

Magento中模型层被分成两个部分:一个是处理业务逻辑的模型,另一个是处理数据交互的资源。这种设计使得Magento可以最终支持多个数据库平台,而无需修改模型内的任何逻辑。
Magento ORM采用PHP的魔术方法来动态连接对象属性。后面我们会更加深入地探讨模型、Magento ORM以及数据集合方法的内容。
注:Magento的模型不一定要与任何数据库中的表或EAV实体来关联,后面我们将要讲到的observer就是这方面的例子。

视图-Views

与其它的MVC应用相比,Magento的视图层可以说是独树一帜,不同于传统的MVC模型,Magento的视图层分为如下三个部分:

  • Layouts:布局文件(layout)是一些用于定义块结构、像name之类的属性以及我们可以使用的模板文件等的XML文件。每个Magento模块都有其自己的布局文件。
  • Blocks:Magento通过将大多数的逻辑转移到块(block)中来降低控制器的压力。
  • Templates:模板是一些包含HTML和PHP代码的phtml文件。

布局文件让Magento前端具有极大的灵活性,每个模块都有自己的XML布局文件,用于告诉Magento在哪里包含和处理各个页面请求。通过使用布局文件,我们可以在store中移动、添加或者删除块,完全无需修改对应XML以外的任何文件。

布局文件详解

下面我们来看看一个核心布局文件catalog.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<layout version="0.1.0">
 
    <default>
 
    <reference name="left">
 
        <block type="core/template" name="left.permanent.callout"
 
        template="callouts/left_col.phtml">
 
            <action method="setImgSrc">
 
            <src>images/media/col_left_callout.jpg</src></action>
 
            <action method="setImgAlt" translate="alt"
 
            module="catalog"><alt>
 
            Our customer service is available 24/7.
 
            Call us at (555) 555-0123.</alt></action>
 
            <action method="setLinkUrl">
 
            <url>checkout/cart</url></action>
 
        </block>
 
    </reference>
 
    <reference name="right">
 
        <block type="catalog/product_compare_sidebar"
 
        before="cart_sidebar" name="catalog.compare.sidebar"
 
        template="catalog/product/compare/sidebar.phtml"/>
 
        <block type="core/template" name="right.permanent.callout"
 
        template="callouts/right_col.phtml">
 
        <action method="setImgSrc">
 
        <src>images/media/col_right_callout.jpg</src></action>
 
        <action method="setImgAlt" translate="alt"
 
        module="catalog"><alt>
 
        Visit our site and save A LOT!</alt></action>
 
        </block>
 
    </reference>
 
    <reference name="footer_links">
 
        <action method="addLink" translate="label title"
 
        module="catalog" ifconfig="catalog/seo/site_map">
 
        <label>Site Map</label><url
 
        helper="catalog/map/getCategoryUrl" />
 
        <title>Site Map</title></action>
 
    </reference>
 
    <block type="catalog/product_price_template"
 
    name="catalog_product_price_template" />
 
</default>

可以看出布局文件由如下三个主要XML节点(node)组成:

  • handle:每个页面请求都会包含多个句柄(handle),布局通过这些句柄来通知Magento对于每个页面加载并渲染哪些块。最常用的句柄为default和
    [frontname]_[controller]_[action]。default句柄在设置全局块时尤为重要,比如在每个页面的header块中加入CSS和JavaScript
  • reference:节点用于引用一个块,多用于指定一个嵌套块或修改一个已存在的块。上面的示例代码中,内部就指定了一个新的子块。
  • block:节点用于加载块,每个块节点可带有如下属性:
    • type:它是实际块类的一个标识符,例如catalog/product_list引用了Mage_Catalog_Block_Product_List
    • name:这是其它块用于引用当前块的名称。
    • before/after:这两个属性用于指定当前块相对于其它块的位置,它们两个还可通以使用破折号-作值来指定模块在顶部或底部显示。
    • template:这一属性用于指定渲染块的.phtml模板文件
    • action:每个块类型都有可影响前端功能的动作。比如page/html_head就可通过addJs和addCss这两个动作来添加CSS和JavaScript
    • as:用于指定我们在模块中调用块的唯一标识符,比如通过getChildHtml(‘block_name’)来调用子块。

块是Magento采用的一个新的概念,用于减少对控制器的加载。通常是一些直接连接模块的数据资源,在需要的时候可以操作这些数据并传递给视图。
此外,PHTML模板文件中可包含html和php标签,用于控制模型中数据的格式以及显示。下面让我们来看看产品视图模板文件中的一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<div class="product-view">
 
...
 
    <div class="product-name">
 
        <h1><?php echo $_helper->productAttribute
 
        ($_product, $_product->getName(), 'name') ?></h1>
 
    </div>
 
...
 
    <?php echo $this->getReviewsSummaryHtml
 
    ($_product, false, true)?>
 
    <?php echo $this->getChildHtml('alert_urls') ?>
 
    <?php echo $this->getChildHtml('product_type_data') ?>
 
    <?php echo $this->getTierPriceHtml() ?>
 
    <?php echo $this->getChildHtml('extrahint') ?>
 
...
 
    <?php if ($_product->getShortDescription()):?>
 
        <div class="short-description">
 
            <h2><?php echo $this->__('Quick Overview') ?></h2>
 
            <div class="std"><?php echo $_helper->
 
            productAttribute($_product, nl2br($_product->
 
            getShortDescription()), 'short_description') ?></div>
 
        </div>
 
    <?php endif;?>
 
...
 
</div>

下面是有关MVC结构的图表:
Magento MVC详解

控制器-Controllers

Magento中的MVC控制器采用轻量级控制器设计,这种轻量级控制器包含较少的业务逻辑,多用于驱动应用的请求。一个基本的Magento控制器动作会加载并渲染布局:

1
2
3
4
5
6
7
8
9
public function viewAction()
 
{
 
    $this->loadLayout();
 
    $this->renderLayout();
 
}

这以后就通过块来处理显示逻辑、从模型中获取数据、准备数据并将数据发送给视图。

喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址