Magento入门开垦教程,使用体验

检查链接是或不是有错误

Modules->模块

Modules->模块 Controller->控制器 Model->模型 Magento是这个星球上最强大的购物车网店平台。当然,你应该已经对此毫无疑问了。不过,你可能还不知道,Magento同样是一个面向对象的PHP框架。你可以配合Magento购物车程序强大的功能,开发动态WEB应用程序。 这是Magento中文开发手册的开篇,我们会在整个手册中介绍绝大部分Magento的开发框架特性。不要想在这片文章中立刻掌握所有的特性。这仅仅是个开始,但是足够让你在同行中鹤立鸡群了。 在这片文章中,你将了解到: 

www.5929.com 1

链接错误常常有三个大概,一个是拼写错误;另三个是后台开启了将 store view
code 加在链接里,但测量试验的时候从不写到地址栏 – –

Controller->控制器

  • Magento模块(Magento
    Modules)代码组织格局
  • 配置型MVC架构
  • Magento控制器(Magento Controllers)
  • 基于U奥迪Q5I的模型实例化(Context-based UENCOREI Model Loading)
  • Magento模型(Magento Models)
  • Magento助手(Magento Helpers)
  • Magento布局(Magento Layouts)
  • 事件监听(Observers)
  • Magento类重写(Class Overrides)
  • 总结

以下是各自详细解读深入分析程序的各档案的次序源码:

检查组件是不是已开荒

Model->模型

始发此前,你能够试着看下Magento
MVC格局的三个图形化直观反映。Magento_MVC.pdf

MAGENTO_ROOT:

部分时候因为某个原因组件未有被开启,那样相关的调整器自然不可用了。能够到后台
System / Configuration > ADVANCED / Advanced
查找组件是不是存在于列表中。

Magento是其一星球上最强劲的购物车网店平台。当然,你应有已经对此确实无疑了。然而,你只怕还不领悟,Magento一样是二个面向对象的PHP框架。你能够兼容Magento购物车程序庞大的功效,开垦动态WEB应用程序。

Magento模块中的代码组织形式

Magento通过将代码放入独立的模块进行公司。在贰个第一名的PHP
MVC应用中,全数的调节器会被放在两个文本夹中,全数的模子会被放在另外多个文件夹里,等等。而在Magento中,文件是依附功效拓展分组的,这种分组后的代码块叫做模块。

Magento的代码:

比喻来讲,假设你想搜索Magento中有关付款的功力,你一味必要找到下边代码中的文件夹,就会获得具有的调整器,模型,帮手,Blocks等。

app/code/core/Mage/Checkout

设若你想寻觅Magento中有关谷歌Checkout的机能,也只有须求找到如下文件夹,就能够获得具备你想要的新闻。

app/code/core/Mage/GoogleCheckout

您的代码:

一旦你想扩充Magento,千万不要想当然的去修改core文件夹中的文件,也毫无将你协和的调节器,模型,助手或然Blocks放在Core文件夹中。全数对于Magento的恢宏,都就要local文件夹中进行。

app/code/local/<Package>/<Modulename>

Package(也可称之为命名空间,当然那不是PHP手册中涉及的命名空间)是不二法门的命名,通过Package来标记你的百货店,社团或个人。通过Package,世界范围内的Magento社区在开立模块扩充时,能够选拔他们和煦的Package名称,以幸免与别的开辟者有命名争论。

创办叁个新的模块时,你必要报告Magento新模块的有关音讯。能够通过增添二个XML文件在上边包车型大巴目录中。

app/etc/modules

在这一个目录中有两类xml文件,第一种用来开启独立的模块,以下列格局命名:

Packagename_Modulename.xml

其次种文件用来从三个Package中拉开四个模块,以下列方法命名:

Packagename_All.xml

//入口文件 /index.php

借使组件确实尚未张开,一般都以布局文件或然程序的拼写难题导致的。极其是这种本地可用但松开服务器上出标题标,百分之九十都以因为大小写不得法
– –

那是Magento汉语开垦手册的开张营业,我们会在全路手册中介绍绝超过46%Magento的支付框架脾气。不要想在那片小说中立刻明白全体的特征。那只是是个开端,不过丰裕令你在同行中高人一等了。

配置型MVC系统

Magento是一个陈设型MVC(Configuration-based
MVC)系统。另外一种MVC系统则是超过半数PHP框架使用的,约定性MVC(convertion-based
MVC)。

在约定型MVC系统中,假若您加多三个调控器,可能多少个模子,只需求依赖约定的剧情,创设那几个文件以及类就能够,系统会自动识别它。

而在布署型MVC系统中,举例Magento,除了供给加上相应的文书及类之外,还索要明显的报告系统该类的存在。在Magento中,每一种模块都有三个config.xml文件。这么些文件中富含了三个模块相关的配备消息。在运作时,全体模块的安排文件,都会被加载到叁个光辉的铺排文件树中(前面的篇章会介绍怎么着查看这些布局树)。

比如,想在模块中利用模型。你须要增加类似下边包车型地铁代码,来报告Magento你会在这一个模块中运用那一个模型。

<``models``>

`<packagename`>

`<class>Packagename_Modulename_Model</class`>

`</packagename`>

<``models``>

当然,这种布局不止限于模型,对于调节器,助手,Blocks,路由,事件句柄等都急需在该模块的config.xml中打开连锁的布置。

—————–|

自己商量组件的 config.xml 配置文件

在那片文章中,你将理解到:

Magento控制器(Magento Controllers)

在别的PHP系统在那之中,宗旨文件断定是PHP文件。Magento也不例外,index.php是Magento的基本文件。

但是,永世不要编辑index.php中的任何代码。在MVC系统中,index.php的左右概略有以下几项:

  • 检测URL地址。
  • 依靠路由法则,将探望的U逍客L地址分发到调整器类中的方法。
  • 伊始化调整器,并调用相应的动作方法。这一步骤叫做分发。Dispatching。

那意味着Magento(或其余MVC系统)每一个得力的entry
point都以调控器文件中的一个办法。一齐来看下边这么些ULANDL:

http://example.com/catalog/category/view/id/25

上述域名后U瑞虎L地址能够被分拆为以下几个部分。

Front Name – catalog

该UOdysseyL的首先局地被誉为Front
Name。它用来提示Magento应该在哪个模块中搜寻U福特ExplorerL中的调节器。在那几个例子中,catalog就是Front
Name,对应于catalog模块。

Controller Name – Category

第二某个提示Magento应该合营的调控器。每一个具备调节器的模块都富含四个‘controllers’的文书夹,用来寄存在该模块下的保有调控器。上述UEscortL地址,相称了上边这么些调节器文件。

app/code/core/Mage/Catalog/controllers/CategoryController.php

其间的类定义格式大概为:

class Mage_Catalog_CategoryController ``extends
Mage_Core_Controller_Front_Action

{

}

在Magento中,全体的调整器都三翻五次自Mage_Core_controller_Front_Action类。

Action Name – view

其三局地是二个action方法的名称。在此U科雷傲L中,view就是多少个action方法的名字。

class Mage_Catalog_CategoryController ``extends
Mage_Core_Controller_Front_Action {

``public function viewAction() {

``}

}

Paramater/Value – id/25

任何献身action方法名自此的路径,都会被感到是key/value方式传递的GET变量。那么在大家的例子个中,’id/25′表示有三个值为25的$_GET[‘id’]变量。

如前所述,假若您想让自定义模块使用调整器,你必须对它进行布局。上边是在模块中拉开调整器的代码。

<``frontend``>

`<routers`>

`<catalog`>

`<use>standard</use`>

`<args`>

`<module>Mage_Catalog</module`>

`<frontName>catalog</frontName`>

`</args`>

`</catalog`>

`</routers`>

</``frontend``>

近些日子不亮堂上述剧情都以怎么看头还没涉及,不过注意<frontName>catalog</frontName>。那是用来波及模块与UCRUISERL地址中frontname的。Magento大旨代码采用将一个模块的名字与frontname一致,但那不是恐吓规定的。

1.论断php版本是不是高于5.2
2.引进Magento主要的主干类/app/Mage.php
3.决断是或不是已经下载安装,是不是站点维护,是或不是开拓方式
4.实施Mage::run,网站前台的第一入口点。

以原生产品组件为例,前台调整器的配置格局如下:

  • Magento模块(Magento Modules)代码组织方式
  • 配置型MVC架构
  • Magento控制器(Magento
    Controllers)
  • 依据U智跑I的模型实例化(Context-based UXC60I
    Model Loading)
  • Magento模型(Magento Models)
  • Magento助手(Magento Helpers)
  • Magento布局(Magento Layouts)
  • 事件监听(Observers)
  • Magento类重写(Class Overrides)
  • Magento入门开垦教程,使用体验。总结
Multiple Routers

地方提到的路由准绳首如果对准Magento购物车程序(即你所能看到的前端)。倘若Magento在U昂CoraL中不能合作到正确的调控器/动作,它会尝试选择针对Admin程序(后台管理端)的另一套路由准绳。假若照旧不恐怕精确相称,它会利用三个出奇的调整器Mage_Cms_IndexController。

CMS调节器会检查Magento内容管理类别中是否有内容须求输出,假诺有内容输出,则读取该内容,倘诺找不到,则输出404页面。

诸如,Magento默许的首页正是在行使CMS调节器。

—————-|

<config>
    …
    <frontend>
        <routers>
            <catalog>
                <use>standard</use>
                <args>
                    <module>Mage_Catalog</module>
                    <frontName>catalog</frontName>
                </args>
            </catalog>
        </routers>
    </frontend>
    …
</config>

开首以前,你能够试着看下Magento MVC格局的一个图形化直观反映。Magento_MVC.pdf

Context-Based UTiguanI 模型读取

方今甘休,我们已经确立了二个调节器以及五个措施,到实例化一个类做点什么的时候了。Magento提供了一种特别的主意去实例化模型,帮手以及Blocks,即选用Mage全局类提供的静态工厂方法。举个例子,

Mage::getModel(``'catalog/product'``);

Mage::helper(``'catalog/product'``);

‘catalog/product’字符串被喻为Grouped Class Name。经常堪当UXC60I。Grouped
Class
Name的首先片段用来提示该类存在于哪个模块当中。第二部分用来决定哪些类将被调用。

那正是说,上述例子中,‘catalog’对应于app/code/core/Mage/Catalog模块,也就表示我们的类宿将以Mage_Catalog起初,然后依据调用的种类,将product类名到场到最后一部分。即,

Mage::getModel(``'catalog/product'``);

Mage_Catalog_Model_Product;

Mage::helper(``'catalog/product'``);

Mage_Catalog_Helper_Product;

/app/Mage.php run()

假诺必要重写那个调整器,能够如此安顿:

Magento模块中的代码协会方式

Magento通过将代码放入独立的模块实行组织。在三个顶级的PHP MVC应用中,全体的调控器会被放在二个文件夹中,全体的模型会被放在其他多个文书夹里,等等。而在Magento中,文件是基于功效举办分组的,这种分组后的代码块叫做模块。

Magento的代码:

比世尊讲,假设你想搜寻Magento中有关付款的功效,你独有要求找到上面代码中的文件夹,就会获取具备的调节器,模型,帮手,Blocks等。

app class=”pun”>/code/ class=”pln”>core/Mage class=”pun”>/ class=”typ”>Checkout

一旦您想搜寻Magento中关于谷歌(Google) Checkout的作用,也单独需求找到如下文件夹,就可以获取具备你想要的音信。

app class=”pun”>/code/ class=”pln”>core/Mage class=”pun”>/ class=”typ”>GoogleCheckout

你的代码:

纵然你想扩展Magento,千万不要想当然的去修改core文件夹中的文件,也决不将你本身的调节器,模型,助手也许Blocks放在Core文件夹中。全部对于Magento的扩大,都将要local文件夹中张开。

app class=”pun”>/code/ class=”kwd”>local/<Package class=”pun”>> class=”str”>/<Modulename>

Package(也可称之为命名空间,当然那不是PHP手册中涉嫌的命名空间)是独一的命名,通过Package来标志你的公司,组织或个人。通过Package,世界范围内的Magento社区在创建模块扩张时,可以利用他们友善的Package名称,以免止与其余开辟者有命名争持。

始建二个新的模块时,你供给告诉Magento新模块的连锁消息。能够经过加多多少个XML文件在底下的目录中。

app/ class=”pln”>etc/ class=”pln”>modules

在那些目录中有两类xml文件,第一种用来拉开独立的模块,以下列格局命名:

class=”typ”>Packagename_Modulename. class=”pln”>xml

第两种文件用来从一个Package中张开四个模块,以下列方式命名:

class=”typ”>Packagename_All. class=”pln”>xml

Magento 模型

和现行反革命的大部框架同样,Magento也提供ORM帮衬。ORM令你能够专注于数据,而非点不清的SQL语句。比方,

$model = Mage::getModel(``'catalog/product'``)->load(27);

$price = ``$model``->getPrice();

$price += 5;

$model``->setPrice(``$price``)->setSku(``'SK1231414'``);

$model``->save();

在下边那几个例子中,大家调用了“getPrice”和“setPrice”方法。不过,在Mage_Catalog_Model_Product类中并未此措施。那为啥上边这几个例子能够选择这么些情势呢?因为Magento的ORM系统中运用了PHP的_get和_set魔术点子。

调用$product->getPrice()会博得模型属性price,而调用$product->setPrice()会设置price属性。当然,全体的那几个都假使模型类没有getPrice和setPrice方法。假诺它们存在于模型类中,PHP魔术方法会被忽略。要是您有乐趣知道那是怎么着促成的,可以参见Varien_Object类,全体的模型类都继承自该类。

假如您想博得模型在那之中全数的数据,能够间接调用$product->getData()方法,它会回来富含全部字段的叁个数组。

您或然曾经注意到上例中的方法存在使用->符号链接的款型:

$model->setPrice($price)->setSku(‘SK12312542′);

可见运用这种措施调用方法,最要害的来由是享有的set方法都会回到二个模子的实例。
你会日常在Magento的着力代码中见到此类调用方法的款式。

Magento的ORM系统中还包罗一种通过Collections接口查询三个对象的章程。下例会读取系统中全体5港币的出品。

$product_collection = Mage::getModel(``'catalog/product'``)

->getCollection()

->addAttributeToSelect(``'*'``)

->addFieldToFilter(``'price'``,``'5.00'``);

那边大家又叁重播到了链接调用方法的花样。Collections use the PHP Standard
Library to implement Objects that have array like
properties.(这句赶上了解范围)。

foreach``(``$products_collection as $product``)

{

`echo` `$product->getName();`

}

在上边的四个事例个中,你恐怕注意到了addAttributeToSelect方法。这里单独提到此办法,是因为它代表了Magento模型中的多个品类。Magento具备三种情势的模子对象。一种是价值观的“二个对象,一张表”的Active
Record模型。当您实例化这个模型的时候,全数的性质都会被机关选拔。

Magento中第三种模型叫做Entity Attribute
Value(EAV)模型。这种模型会依照一定的准则将数据分散累积在数据库差别的表中。EAV模型的高端本性,让Magento不用在加码一种产品性情的时候更动数据库模型(一般的购物车系统在大增新的质量时,有三种方法,一种是增好多据库字段,一种是选取预留的空字段。),进而有限支撑了Magento系统的冲天扩展性。当创立二个EAV模型的collection时,Magento会conservative
in它会询问的字段数,全体你能够使用addAttributeToSelect来制定你想获取的列,只怕选取addAttributeToSelect(*)来收获全体列。

1.开始Varien_Profiler::start(),那些类的效果与利益是有利开垦进度中的代码品质深入分析,各类profiler各消耗多少内部存款和储蓄器和时间。私下认可是剥夺的,开启需求登入后台在”System
> Configuration > Advanced > Developer > Debug > Profiler
设置为
Yes”,页面尾巴部分会唤起总的内存使用状态,同不时间index.php文件中撤废注释#:Varien_Profiler::enable();则显得每个单元的损耗。
2.创造四个app实例,new Mage_Core_Model_App();

<config>
    …
    <frontend>
        <routers>
            <catalog>
                <args>
                    <modules>
                        <Infinity_www.5929.com,Catalog
before=”Mage_Catalog”>Infinity_Catalog</Infinity_Catalog>
                    </modules>
                </args>
            </catalog>
        </routers>
Magento入门开垦教程,使用体验。    </frontend>
    …
</config>
 

配置型MVC系统

Magento是三个布署型MVC(Configuration-based
MVC)系统。别的一种MVC系统则是大大多PHP框架使用的,约定性MVC(convertion-based MVC)。

在约定型MVC系统中,要是您加多贰个调节器,或许二个模子,只需求依照约定的内容,创造这么些文件以及类就可以,系统会自动识别它。

而在布局型MVC系统中,比方Magento,除了必要增加相应的文书及类之外,还需求明白的告知系统该类的存在。在Magento中,各类模块都有叁个config.xml文件。那个文件中涵盖了八个模块相关的安排新闻。在运维时,全部模块的布局文件,都会被加载到二个有影响的人的布署文件树中(前面包车型地铁稿子会介绍怎样查看那个布局树)。

举个例子,想在模块中应用模型。你供给丰盛类似上边包车型大巴代码,来告诉Magento你会在那个模块中选用那些模型。

<``models``>

`<packagename`>

`<class>Packagename_Modulename_Model</class`>

`</packagename`>

<``models``>

道理当然是那样的,这种安顿不仅只限于模型,对于调整器,帮手,Blocks,路由,事件句柄等都亟需在该模块的config.xml中打开连锁的计划。

Magento Helpers 助手

Magento的助手类富含一种种实用的办法,通过那一个方式能够对目标及变量做平时性的操作。举例,

$helper = Mage::helper(``'catalog'``);

是还是不是注意到这里放任了Grouped Class
Name的第二部分?每一个模块都有三个暗许的data帮手类。上边包车型地铁言语与地点的法力是平等的,即暗中同意使用模块下的data帮手类。

$helper = Mage::helper(``'catalog/data'``);

多数的助手类承袭自Mage_Core_Helper_Abstract,暗许提供了广大选用的议程。

$translated_output = ``$helper``->__(``'Magento is Great'``);

if (``$helper``->isModuleOutputEnabled()) {

}

——————|

检查组件及调节器的文件名、类名、方法名

Magento控制器(Magento Controllers)

在任何PHP系统个中,核心文件肯定是PHP文件。Magento也不例外,index.php是Magento的基本文件。

不过,永世不要编辑index.php中的任何代码。在MVC系统中,index.php的左右大概有以下几项:

  • 检测URL地址。
  • 依赖路由法则,将探望的ULX570L地址分发到调节器类中的方法。
  • 开端化调控器,并调用相应的动作方法。这一步骤叫做分发。Dispatching。

那象征Magento(或任何MVC系统)每叁个可行的entry point都以调整器文件中的一个措施。一同来看下边那几个U兰德HighlanderL:

class=”pln”>http class=”pun”>: class=”com”>//example.com/catalog/category/view/id/25

上述域名后UCR-VL地址能够被分拆为以下多少个部分。

Front Name –
catalog

该ULacrosseL的第一有的被称之为Front
Name。它用来提醒Magento应该在哪个模块中检索ULacrosseL中的调整器。在这一个例子中,catalog正是Front
Name,对应于catalog模块。

Controller Name –
Category

其次部分提示Magento应该合营的调整器。每一个具有调整器的模块都带有一个‘controllers’的文书夹,用来寄存在该模块下的装有控制器。上述U翼虎L地址,相称了下边这些调节器文件。

app class=”pun”>/code/ class=”pln”>core/Mage class=”pun”>/Catalog/ class=”pln”>controllers/ class=”typ”>CategoryController. class=”pln”>php

个中的类定义格式大致为:

class Mage_Catalog_CategoryController``extends Mage_Core_Controller_Front_Action

{

}

在Magento中,全数的调控器都接二连三自Mage_Core_controller_Front_Action类。

Action Name –
view

其三局地是贰个action方法的名号。在此U路虎极光L中,view便是三个action方法的名字。

class Mage_Catalog_CategoryController``extends Mage_Core_Controller_Front_Action {

``public
function viewAction() {

``}

}

Paramater/Value – id/25

其他投身action方法名之后的门径,都会被感到是key/value情势传递的GET变量。那么在大家的事例个中,’id/25′表示有多个值为25的$_GET[‘id’]变量。

如前所述,假令你想让自定义模块使用调控器,你不能够不对它进行配置。上边是在模块中拉开调整器的代码。

<``frontend``>

`<routers`>

`<catalog`>

`<use>standard</use`>

`<args`>

`<module>Mage_Catalog</module`>

`<frontName>catalog</frontName`>

`</args`>

`</catalog`>

`</routers`>

</``frontend``>

未来不精晓上述剧情都是如何看头还没涉及,可是注意<frontName>catalog</frontName>。那是用来波及模块与U奥迪Q5L地址中frontname的。Magento大旨代码选取将二个模块的名字与frontname一致,但那不是挟持规定的。

Magento Layout 布局

如今结束,我们已经介绍了调节器,模型以及帮手。在优秀的PHP
MVC系统个中,在操作模型之后,一般会

  • 传递变量到视图中。
  • 系统会活动读取暗中同意的外层布局
  • 继之将视图读取到外围布局中

不过,假设您精心察看Magento 调节器动作方法,你不会看到那几个步骤,

public function galleryAction() {

`if` `(!$this`->_initProduct()) {

`if`
`(isset(
$_GET[‘store’]) && !$this`->getResponse()->isRedirect()) {

`$this->redirect('');`

`}elseif`(!``$this``->getResponse()->isRedirect()) {

`$this->_forward('noRoute');`

``}

`return;`

``}

`$this->loadLayout();`

`$this->renderLayout();`

}

不相同于规范PHP
MVC方式的是,调控器动作方法,以五个出口布局的情势截至。所以说,Magento
MVC系统中的V视图部分大概与您时常应用的大相径庭。因为,你必须在调控器中料定的输出布局。

与此同偶然间,Magento的布局本人也分别与您时常应用的MVC系统。Magento布局是三个饱含嵌套只怕树状的Block对象的对象。每一个Block对象输出一部分HTML,输出HTML的环节饱含五个部分,PHP代码组成的Block以及.phtml模板文件。

Blocks对象承担与Magento系统交互并从模型中获取数据,而phtml模板文件则为页面生成必须的HTML代码。

例如说,页面尾部Block文件app/code/core/Mage/Page/Block/Html/Head.php运用与其对应的page/html/head.phtml模板文件。

换种方法说的话,Blocks类就如Mini调整器,而.phtml文件就是视图像和文字件。

默许的,当您调用,

 

$this``->loadLayout();

$this``->renderLayout();

Magento will load up a Layout with a skeleton site
structure(此段能够驾驭,但想不到顶级翻译,大约意思是Magento会读取网址的布局框架)。那个构造Blocks用来输出head,body以及设定单栏或多栏的布局。其他,还会有局地内容Blocks担负实际出口像导航,产品分类等。

“结构”和“内容”Blocks在布局种类中是轻巧安装的。一般不会在代码中特意增添代码,从而区分三个Block是结构依然内容,但是Blocks要么属于“结构”,要么属于“内容”。

为了抬高三个内容Blocks到布局中,你需求告诉Magento系统

“Magento,快把那多少个Blocks添加到内容Block 里”

或者

“Magento,把那边多少个Blocks放到“左侧栏”结构Block里”

这么些足以由此调整器中的代码实行支配,

public function indexAction() {

`$block`
`=
$this->getLayout()->createBlock(‘adminhtml/system_account_edit’`);

`$this->getLayout()->getBlock('content')->append($block);`

}

然则更常用的方法(至少在前台购物车应用中)是选拔基于XML文件的布局体系。

在一款风格中,基于XML文件的布局
允许你剔除符合规律输出的Blocks或许加上私下认可的skeleton区域(即Structure
Blocks)。比如上边那些XML布局文件,

<``catalog_category_default``>

`<reference`name``=``"left"``>

`<block`type``=``"catalog/navigation"
name``=``"catalog.leftnav" after``=``"currency"
template``=``"catalog/navigation/left.phtml" />

`</reference`>

</``catalog_category_default``>

地点这段代码的效应是,在catalog模块的category调整器的私下认可动作方法中,将catalog/navigation
Block插入到左侧栏结构Block中,并行使catalog/navigation/left.phtml模板文件。

关于Blocks还或许有一个十分重大的特征。在模板文件中,你会看到相当的多近乎下边包车型地铁代码,

1

$this``->getChildHtml(``'order_items'``)

这是Block输出套嵌Block的法子。但是,除非在XML布局文件中显著宣称叁个Block包罗另三个子Block时,才具在模板文件中经过getChildHtml()方法调用子Block的模版文件。

比方说,在XML布局文件中,

<``catalog_category_default``>

`<reference`name``=``"left"``>

`<block`type``=``"catalog/navigation"
name``=``"catalog.leftnav" after``=``"currency"
template``=``"catalog/navigation/left.phtml"``>

`<block`type``=``"core/template" name``=``"foobar"
template``=``"foo/baz/bar.phtml" />

`</block`>

`</reference`>

</``catalog_category_default``>

那正是说从catalog/navigation
Block中,大家才足以调用$this->getChildHtml(‘foobar’);

Mage/Core/Model/App.php run()

Magento 的零件目录有七个调控器相关的文本夹,三个是 Controller,另三个是
controllers。前面一个一般是用来定义路由艺术的,仿佛相当少用到;前面一个才是调节器安置的地点。与任何常用部件(Block、Helper、Model)不一致,调控器文件夹的首字母是小写,且最终有个
s(很想奚弄做架构那位是暗恋小s么,行吗小编了然你 “小” 是因为重写方法跟
“大” 的不雷同,“s” 是用来跟 Controller 作区分)。

Multiple Routers

地方提到的路由法则首若是本着Magento购物车程序(即你所能看到的前端)。假诺Magento在U福睿斯L中不可能协作到精确的调整器/动作,它会尝试使用针对Admin程序(后台管理端)的另一套路由法则。若是还是不能够正确相配,它会选用二个格外的调控器Mage_Cms_IndexController。

CMS调控器会检查Magento内容管理种类中是或不是有内容必要输出,若是有内容输出,则读取该内容,即便找不到,则输出404页面。

比方,Magento私下认可的首页正是在运用CMS调整器。

Observers 观察者

和大多奇妙的面向对象系统一样,Magento通过兑现观看者格局给用户作为钩子。对于在页面伏乞时(模型存款和储蓄,用户登入等)调用的特定动作方法,Magento会生成八个事件复信号。

当成立新的模块时,你能够“监听”那个事件。比如说,你想在一定用户登陆集团的时候发一封邮件到助理馆员邮箱里,能够通过“监听”customer_login事件做到。

<``events``>

`<customer_login`>

`<observers`>

`<unique_name`>

`<type>singleton</type`>

`<class>mymodule/observer</class`>

`<method>iSpyWithMyLittleEye</method`>

`</unique_name`>

`</observers`>

`</customer_login`>

</``events``>

接下去是当用户登入时应该运行的代码:

class Packagename_Mymodule_Model_Observer

{

`public` `function` `iSpyWithMyLittleEye($observer`)

``{

`$data` `=$observer`->getData();

``//code to check observer data for out user,

``//and take some action goes here

``}

}

1.确定是或不是有缓存,有则一贯回到;
2.不曾Cache则初步化模块、商场并:
3.起先化央求:$this->_initRequest();通过Mage/Core/Controller/Request/Http.php的setPathInfo()方法。
4.重新提交前台调节器(Mage_Core_Controller_Varien_Front)先开端化$this->getFrontController():$this->_frontController->init();

调整器的文书名是

Context-Based UPRADOI 模型读取

如今停止,我们早已建构了二个调控器以及三个艺术,到实例化二个类做点什么的时候了。Magento提供了一种特其他办法去实例化模型,助手以及Blocks,即利用Mage全局类提供的静态工厂方法。举例,

Mage::getModel(``'catalog/product'``);

Mage::helper(``'catalog/product'``);

‘catalog/product’字符串被叫做Grouped
Class Name。平时称为USportageI。Grouped Class Name的率先局地用来提醒该类存在于哪个模块在那之中。第二片段用来调整哪些类将被调用。

那么,上述例子中,‘catalog’对应于app/code/core/Mage/Catalog模块,也就意味着大家的类老马以Mage_Catalog发轫,然后依照调用的品类,将product类名加入到结尾一片段。即,

Mage::getModel(``'catalog/product'``);

Mage_Catalog_Model_Product;

Mage::helper(``'catalog/product'``);

Mage_Catalog_Helper_Product;

Class Overrides 类的复写

最终,Magento系统还提供了类的复写功用,你能够透过和谐的代码覆盖大旨代码里的模子,帮手,和Blocks类。

下边举些例子扶助你更易于精晓那么些作用。产品的模子类是Mage_Catalog_Model_Product.无论什么时候,上边包车型大巴代码被调用时,就能够扭转二个Mage_Catalog_Model_Product对象。

1

$product = Mage::getModel(``'catalog/product'``);

这是工厂方式。Magento的类复写系统运维情势大意是那般,

“Magento!
要是有要求对应catalog/product,不要实例化Mage_Catalog_Model_Product,让Packagename_Modulename_Model_Foobazproduct接手”

在模型中,类的掩饰情势及命名法规如下,

class Packagename_Modulename_Model_Foobazproduct ``extends
Mage_Catalog_Model_Product

{

}

通过这种艺术,你能够转移父类中艺术的行为,並且完全承继父类的具备机能。

class Packagename_Modulename_Model_Foobazproduct ``extends
Mage_Catalog_Model_Product

{

``public function validate() {

``//添加一些自定义的验证功能

`return` `$this;`

}

和从前所说的一模一样,复写同样须要在config.xml配置文件中打开安插。

<``models``>

``<!-- tells the system this module has models -->

`<modulename`>

`<class>Packagename_Modulename_Model</class`>

`</modulename`>

``<!-- does the override for catalog/product-->

`<catalog`>

`<rewrite`>

`<product>Packagename_Modulename_Model_Foobazproduct</product`>

`</rewrite`>

`</catalog`>

</``models``>

——————–|

[决定器名(首字母大写)]Controller.php

Magento 模型

和未来的大部框架一样,Magento也提供ORM补助。ORM让您能够专注于数据,而非不计其数的SQL语句。比方,

$model = Mage::getModel(``'catalog/product'``)->load(27);

$price =``$model``->getPrice();

$price
+= 5;

$model``->setPrice(``$price``)->setSku(``'SK1231414'``);

$model``->save();

在上头这些事例中,大家调用了“getPrice”和“setPrice”方法。不过,在Mage_Catalog_Model_Product类中并未此情势。那怎么上边这一个事例能够使用那几个方式吧?因为Magento的ORM系统中应用了PHP的_get和_set魔术点子。

调用$product->get普赖斯()会获得模型属性price,而调用$product->setPrice()会安装price属性。当然,全体的这几个都假若模型类未有getPrice和setPrice方法。固然它们存在于模型类中,PHP魔术方法会被忽视。借使您有意思味知道那是什么促成的,能够参见Varien_Object类,全体的模型类都继承自该类。

若是您想博得模型当中全部的数量,能够直接调用$product->getData()方法,它会回到富含全数字段的三个数组。

您大概早就注意到上例中的方法存在使用->符号链接的样式:

$model class=”pun”>->setPrice( class=”pln”>$price)-> class=”pln”>setSku(‘ class=”pln”>SK12312542 class=”pun”>′);

能够使用这种艺术调用方法,最要紧的因由是具备的set方法都会回去三个模子的实例。你会平常在Magento的基本代码中看出此类调用方法的款式。

Magento的ORM系统中还隐含一种通过Collections接口查询多个目的的方法。下例会读取系统中全部5美元的成品。

$product_collection
= Mage::getModel(``'catalog/product'``)

->getCollection()

->addAttributeToSelect(``'*'``)

->addFieldToFilter(``'price'``,``'5.00'``);

此地我们又一回见到了链接调用方法的款型。Collections use the PHP Standard Library to implement Objects that have array like
properties.(那句超越驾驭范围)。

foreach``(``$products_collection as $product``)

{

`echo` `$product->getName();`

}

在上边的二个例子当中,你大概注意到了addAttributeToSelect方法。这里单独提到此情势,是因为它表示了Magento模型中的三个连串。Magento具有三种方式的模型对象。一种是价值观的“八个指标,一张表”的Active Record模型。当您实例化这一个模型的时候,全数的质量都会被机关选取。

Magento中第三种模型叫做Entity
Attribute Value(EAV)模型。这种模型会安分守己一定的法规将数据分散累积在数据库分裂的表中。EAV模型的高端级脾性,让Magento不用在增多一种产品品质的时候改动数据库模型(一般的购物车系统在加码新的天性时,有二种艺术,一种是充实数据库字段,一种是行使预留的空字段。),从而确定保障了Magento系统的莫斯中国科学技术大学学扩展性。当创设一个EAV模型的collection时,Magento会conservative in它会询问的字段数,全数你能够行使addAttributeToSelect来制订你想得到的列,或然应用addAttributeToSelect(*)来获得全体列。

Mage/Core/Controller/Varien/Front.php init()

诸如原生产品前台调整器文件名称叫ProductController.php。也是跟另外常用部件(Block、Helper、Model)区别样,前边带了个
Controller。

Magento Helpers 助手

Magento的帮手类包括一名目相当多实用的方式,通过这么些主意能够对指标及变量做平常性的操作。比方,

$helper = Mage::helper(``'catalog'``);

是或不是注意到此处遗弃了Grouped Class Name的第3局地?每一个模块都有三个暗中同意的data助手类。上面包车型地铁言辞与地点的功用是大同小异的,即暗中认可使用模块下的data帮手类。

$helper = Mage::helper(``'catalog/data'``);

绝大比比较多的帮手类承继自Mage_Core_Helper_Abstract,暗中同意提供了成千上万应用的主意。

$translated_output
=``$helper``->__(``'Magento is Great'``);

if (``$helper``->isModuleOutputEnabled()) {

}

1.dispatchEvent(‘controller_front_init_before’)
2.初阶化进度中经过addRouter()增加路由和路由类型。
3.dispatchEvent(‘controller_front_init_routers’)
4.addRouter()加多暗中同意路由。
5.先河化后再举办dispatch:$this->getFrontController()->dispatch().

调控器的类名是

Magento Layout 布局

近年来截止,大家曾经介绍了调节器,模型以及帮手。在第一名的PHP MVC系统当中,在操作模型之后,一般会

  • 传递变量到视图中。
  • 系统会自行读取私下认可的外层布局
  • 紧接着将视图读取到外围布局中

但是,要是您留心考查Magento 调控器动作方法,你不会看出这么些手续,

public
function galleryAction() {

`if` `(!$this`->_initProduct()) {

`if` `(isset($_GET[‘store’]) && !$this`->getResponse()->isRedirect()) {

`$this->redirect('');`

`}elseif`(!``$this``->getResponse()->isRedirect()) {

`$this->_forward('noRoute');`

``}

`return;`

``}

`$this->loadLayout();`

`$this->renderLayout();`

}

差别于规范PHP MVC形式的是,调整器动作方法,以五个出口布局的办法甘休。所以说,Magento MVC系统中的V视图部分也许与你平常采纳的大有径庭。因为,你必须在调节器中分明的出口布局。

再就是,Magento的布局自己也分别与您时偶尔采用的MVC系统。Magento布局是三个涵盖嵌套恐怕树状的Block对象的对象。每一个Block对象输出一部分HTML,输出HTML的环节包涵五个部分,PHP代码组成的Block以及.phtml模板文件。

Blocks对象承担与Magento系统交互并从模型中获取数据,而phtml模板文件则为页不熟悉成必须的HTML代码。

诸如,页面尾部Block文件app/code/core/Mage/Page/Block/Html/Head.php使用与其对应的page/html/head.phtml模板文件。

换种方式说的话,Blocks类就像Mini调控器,而.phtml文件便是视图像和文字件。

暗许的,当您调用,

1

2

$this``->loadLayout();

$this``->renderLayout();

Magento will load up a Layout
with a skeleton site structure(此段能够驾驭,但想不到极品翻译,差不离意思是Magento会读取网址的布局框架)。这个构造Blocks用来输出head,body以及设定单栏或多栏的布局。别的,还会有一点内容Blocks肩负实际出口像导航,产品分类等。

“结构”和“内容”Blocks在布局系列中是随便安装的。一般不会在代码中特意增加代码,进而区分四个Block是结构依然内容,不过Blocks要么属于“结构”,要么属于“内容”。

为了丰硕一个内容Blocks到布局中,你必要告诉Magento系统

“ class=”typ”>Magento,快把那多少个 class=”typ”>Blocks增加到剧情 class=”typ”>Block class=”pun”>里”

或者

“ class=”typ”>Magento,把那边多少个 class=”typ”>Blocks放到“右侧栏”结构 class=”typ”>Block class=”pun”>里”

这一个足以通过调节器中的代码举行支配,

public
function indexAction() {

`$block` `=$this->getLayout()->createBlock(‘adminhtml/system_account_edit’`);

`$this->getLayout()->getBlock('content')->append($block);`

}

而是更常用的章程(至少在前台购物车应用中)是应用基于XML文件的布局系列。

在一款风格中,基于XML文件的布局 允许你剔除不奇怪输出的Blocks或许增加暗中同意的skeleton区域(即Structure Blocks)。举例上面那些XML布局文件,

<``catalog_category_default``>

`<reference`name``=``"left"``>

`<block`type``=``"catalog/navigation" name``=``"catalog.leftnav" after``=``"currency" template``=``"catalog/navigation/left.phtml" />

`</reference`>

</``catalog_category_default``>

上边这段代码的法力是,在catalog模块的category调节器的暗许动作方法中,将catalog/navigation Block插入到左边栏结构Block中,并应用catalog/navigation/left.phtml模板文件。

有关Blocks还应该有一个比较重大的特色。在模板文件中,你拜会到十分的多看似上边包车型大巴代码,

1

$this``->getChildHtml(``'order_items'``)

那是Block输出套嵌Block的法子。不过,除非在XML布局文件中分明声美赞臣个Block富含另几个子Block时,工夫在模板文件中通过getChildHtml()方法调用子Block的模版文件。

诸如,在XML布局文件中,

<``catalog_category_default``>

`<reference`name``=``"left"``>

`<block`type``=``"catalog/navigation" name``=``"catalog.leftnav" after``=``"currency" template``=``"catalog/navigation/left.phtml"``>

`<block`type``=``"core/template" name``=``"foobar" template``=``"foo/baz/bar.phtml" />

`</block`>

`</reference`>

</``catalog_category_default``>

那么从catalog/navigation Block中,大家才得以调用$this->getChildHtml(‘foobar’);

——————–|

[取名空间(首字母大写)]_[组件名(首字母大写)]_[支配器名(首字母大写)]Controller
比方原生产品前台调控器类名称叫Mage_Catalog_ProductController。依然跟另外常用部件(Block、Helper、Model)不等同,把
“Controller” 那么些本性名词放到了类名末尾,并不是 [组件名] 之后。

Observers 观察者

和重重地利人和的面向对象系统同样,Magento通过达成观察者格局给用户作为钩子。对于在页面伏乞时(模型存款和储蓄,用户登录等)调用的一定动作方法,Magento会生成一个平地风波时限信号。

当创制新的模块时,你能够“监听”这几个事件。比方说,你想在一定用户登入公司的时候发一封邮件到管理员邮箱里,能够因而“监听”customer_login事件造成。

<``events``>

`<customer_login`>

`<observers`>

`<unique_name`>

`<type>singleton</type`>

`<class>mymodule/observer</class`>

`<method>iSpyWithMyLittleEye</method`>

`</unique_name`>

`</observers`>

`</customer_login`>

</``events``>

接下去是当用户登陆时应有运转的代码:

class
Packagename_Mymodule_Model_Observer

{

`public`
`function` `iSpyWithMyLittleEye(
$observer`)

``{

`$data` `=$observer`->getData();

``//code to check observer data for out user,

``//and take some action goes here

``}

}

Mage/Core/Controller/Varien/Front.php dispatch()

表现的措施名是

Class Overrides 类的复写

最后,Magento系统还提供了类的复写功用,你能够经过投机的代码覆盖焦点代码里的模型,助手,和Blocks类。

上边举些例子扶助你更便于驾驭那几个意义。产品的模型类是Mage_Catalog_Model_Product.无论曾几何时,上面包车型客车代码被调用时,就可以调换一个Mage_Catalog_Model_Product对象。

1

$product = Mage::getModel(``'catalog/product'``);

那是工厂格局。Magento的类复写系统运维方式大致是如此,

“ class=”typ”>Magento! class=”pun”>借使有央浼对应catalog class=”pun”>/product class=”pun”>,不要实例化 class=”typ”>Mage_Catalog_Model_Product,让 class=”typ”>Packagename_Modulename_Model_Foobazproduct class=”pun”>接手”

在模型中,类的遮掩情势及命名法则如下,

class Packagename_Modulename_Model_Foobazproduct``extends Mage_Catalog_Model_Product

{

}

通过这种办法,你能够变动父类中方法的行事,况兼完全承袭父类的具有机能。

class Packagename_Modulename_Model_Foobazproduct``extends Mage_Catalog_Model_Product

{

``public
function validate() {

``//添加一些自定义的验证功能

`return` `$this;`

}

和事先所说的平等,复写一样须要在config.xml配置文件中开始展览配备。

<``models``>

``<!-- tells the system this module has models -->

`<modulename`>

`<class>Packagename_Modulename_Model</class`>

`</modulename`>

``<!-- does the override for catalog/product-->

`<catalog`>

`<rewrite`>

`<product>Packagename_Modulename_Model_Foobazproduct</product`>

`</rewrite`>

`</catalog`>

</``models``>

1.断定是或不是启用了url_rewrite,有则先进行重写:Mage/Core/Model/Url/Rewrite.php
rewrite() line 195.
2.将搜聚到的路由与须要实行相称match:$router->match($this->getRequest()),由路由项目决定动用哪个种类router,比如标准router:

[作为(首字母小写)]Action

——————-|

且该措施必须是 public
的,一般不带参。举例原生前台产品详细页方法名那样定义的:public function
viewAction()。

Mage/Core/Controller/Varien/Router/Standard.php match()

通过插入代码检查

1.从$request获取module、controller、action名称。
2.通过Mage::getControllerInstance()实例化获取到的controller类。
3.对实例化的controller实行分发:$controllerInstance->dispatch($action);

相似的话通过上述几步就足以减轻难题了,借使如故那些的话就要到以下八个措施中插入
log 代码,检查有关的模块、调节器、行为是或不是出了哪些难点。

——————–|

Mage_Core_Controller_Varien_Router_Standard::match
Mage_Core_Controller_Varien_Front::dispatch

Mage/Core/Controller/Varien/Action.php dispatch()

  1. preDispatch();(Mage::dispatchEvent)
  2. 行业内部施行action的事务逻辑:$this->$actionMethodName();
  3. postDispatch();(Mage::dispatchEvent)

迄今,Magento
Dispatch全体完了,进入action实施url要求的事务逻辑,起初职业引进MVC架构

Magento的 app/code/core/Mage/ 
宗旨代码以模块格局组织文件,先看下各种模块下的文本结构:

  • app/code目录:/app/code/core/Mage/ModuleName/  controllers | Model |
    Helper | Block  | data | etc | sql | Exception.php
  • app/design目录:/app/design/frontend/base/default/
    (/app/design/Area/Package/Theme/)  etc | layout |  template

内部 controllers
看名就会知道意思调整器,相当于决定中枢施行工作逻辑。下边以user央求/catalog/category/view/id/8/这一个url为例举行求证,首先magento的router会依次匹配catalog Model -> category controller -> view action ->
参数id为8,即 Catalog/controllers/CategoryController.php
类中的viewAction() 方法,能够看看 Magento 这里的命名格式为
***Controller.php   ***Action()。下边看下viewAction() 实施的逻辑:

  1. _initCatagory()起头化category并加载该产品分类的多寡。
  2. (Mage::dispatchEvent before)
  3. 从呼吁中获取分类id:$categoryId = (int)
    $this->getRequest()->getParam(‘id’, false);   //8
  4. Model层加载分类数据:Mage::getModel(‘catalog/category’) 
    ->load($categoryId);
    单态形式的Model:Mage::getSingleton(‘catalog/session’)
  5. Helper类支持函数:Mage::helper(‘catalog/category’) 
    ->canShow($category)
  6. (Mage::dispatchEventafter)
  7. 调节器初始化分类和加载分类成功后:

Design

  1. 赢得该分类的design设置:$settings =
    Mage::getSingleton(‘catalog/design’)->getDesignSettings($category);
  2. 选拔自定义的design package和theme
    (若有自定义):$design->applyCustomDesign($settings->getCustomDesign()); 
    Mage_Catalog_Model_Design

Layout

  1. 添加default handle:$update =
    $this->getLayout()->getUpdate()->addHandle(‘default’); 
    Mage_Core_Model_Layout_Update
  2. 累加当前Action handle:$this->addActionLayoutHandles();  
    /Mage/Core/Controller/Varien/Action.php
  3. 增多任何handle:……
  4. 更新Layout:$this->loadLayoutUpdates();  
    /Mage/Core/Controller/Varien/Action.php
    (表达:$this->getLayout()->getUpdate()->load()
    方法通过merge($handle)依次加载前几步增添的handle,当中Mage_Core_Model_Layout_Update 
    getFileLayoutUpdatesXml()
    等函数先一回性读取design包里layout目录下的兼具启用的.xml文件,何况保障最后读入的是钦点模板下的xml,所以它抱有最高优先级,能够覆盖暗中认可的handles,因而生成的是四个非常大的
    packageLayout;然后fetchPackageLayoutUpdates($handle)
    函数依据handles 来更新加载生成当前页面包车型客车 pagelayout)
    (在Magento设计教程中提及,Magneto会依照package 和theme的
    custom->default->base
    层级依次读取到对应的layout,template,skin
    files;laytout文件依照模块来组织文件只是方便管理,并不严酷供给handle绝对要在有个别地点。因而Magento
    后台能够启用Template
    Hints,方便统一希图职员找到呼应的模块的template或layout)。
  5. 加载自定义设置中的Layout更新:$update->addUpdate($layoutUpdate) 
    Mage_Core_Model_Layout generateXml()  generateBlocks()

Template

  1. 扭转布局xml文件和布局块:$this->generateLayoutXml()->generateLayoutBlocks() 
    Mage_Core_Model_Layout 的_generateBlock()
    引入template,即生成block content时从template返回了html。
  2. 动用自定义设置的template:$this->getLayout()->helper(‘page/layout’)->applyTemplate($settings->getPageLayout())
  3. 谈到底调整器进行展现: $this->renderLayout(); 
    Mage_Core_Controller_Varien_Action。同期收取js,图片,css等静态文件,重临http
    response,输出到浏览器。

Leave a Comment.