`
天梯梦
  • 浏览: 13763578 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

深入理解Magento – 第七章 – 自定义Magento系统配置

 
阅读更多

深入理解Magento

作者:Alan Storm
翻译:Hailong Zhang


第七章 – 自定义Magento系统配置

Magento拥有十分强大的后台管理系统。作为一名开发人员,这套后台管理系统可以让你的用户简单直接的配置Magento系统或者你创建的模 块。和Magento的其他功能一样,你第一次使用这套管理系统的时候可能觉得很麻烦,但是一旦你上手了,你会发现它强大的功能是那么吸引人。那么让我们 开始吧。我们这一章的例子依然是基于Helloworld模块。

 

添加系统配置文件

首先我们要为模块添加一个系统配置文件。这个文件和“config.xml”是不搭界的 app/code/local/Zhlmmc/Helloworld/etc/system.xml 和全局配置(global config)相似,系统配置也是单独存储的。我们可以通过下面这段代码来获取系统配置文件

//header('Content-Type: text/xml');        
header('Content-Type: text/plain');        
echo $config = Mage::getConfig()
->loadModulesConfiguration('system.xml')       
->getNode()
->asXML();         
exit; 
 

你可以把这段代码放到任何执行函数(Action Method)中。“loadModulesConfiguration”方法会搜索所有配置好的模块的“etc”文件夹,寻找以传入的参数为名字的文 件,在这个例子中是“system.xml”。Magento有很多不同的配置文件,比如api.xml, wsdl.xml, wsdl2.xml, convert.xml, compilation.xml, install.xml。你可以为你创建的模块创建这些配置文件。

 

添加一个标签页

我们首先在后台系统管理页面添加一个标签页(Tab)。标签页就是后台“System->Configuration”页面左侧的导航栏。默 认的标签页有General,Catalog,Customers,Sales,Services等等。我们来创建一个新的标签页叫做“Hello Config”。创建如下文件
Location: app/code/local/Zhlmmc/Helloworld/etc/system.xml

<config>
    <tabs>
        <helloconfig translate="label" module="helloworld">
            <label>Hello Config</label>
            <sort_order>99999</sort_order>
        </helloconfig>
    </tabs>
</config> 
 

我们来解释一下各个节点(Tag)的意思。【译者注:由于Tab和Tag中文翻译都是标签,所以这里我把Tag翻译成节点,以免混淆】 “<helloconfig>”就是我们要添加的标签页的定义节点,“helloconfig”是节点的ID。你可以任意命名这个ID,但是 必须全局唯一,也就是不能和别人用同样的ID。这个ID是用来唯一标示你的标签页的。“module=helloworld”,意思是这个标签页属于哪个 模块。“<label>”节点的内容是标签的名字,也就是要显示在界面上的名字。“<sort_order>”指明了这个标签页 显示的位置。

 

打开后台“System->Configuration”,你会看到如下错误

Fatal error: Class 'Mage_Helloworld_Helper_Data' not found in….
 

Magento Helper简介

正如许多其他的PHP MVC系统一样,Magento也有帮助类(Helper Classes)。这些类用来提供一些不适合放在模型,视图或者控制器中的功能。Magento的帮助类也是采用分组类名的机制。也就是说我们可以覆盖默 认的帮助类,同时我们需要在config.xml中指定帮助类的基类名。

 

Magento系统默认模块有一个默认的帮助类。正如我们上面的异常显示,我们的Helloworld模块并没有指定一个默认的帮助类。下面让我们来添加一个。修改config.xml
File: app/code/local/Zhlmmc/Helloworld/etc/config.xml

<!– … –>
<global>
    <!– … –>
    <helpers>
        <helloworld>
            <class>Zhlmmc_Helloworld_Helper</class>
        </helloworld>
    </helpers>
    <!– … –>
</global>
<!– … –> 
 

你现在应该对这类配置相当熟悉了。“<helloworld>”节点就是模块的名字,“<class>”就是帮助类的基类名,命名方式如下 Packagename_Modulename_Helper


帮助类是通过全局对象Mage的静态方法“helper”来装载的。

Mage::helper('helloworld/foo') 
 

根据我们的配置,上面这行代码将会装载以下类

app/code/local/Zhlmmc/Helper/Foo.php

class Zhlmmc_Helloworld_Helper_Foo


我们上面说过Magento默认每个模块有一个帮助类“data”

Mage::helper('helloworld');
Mage::helper('helloworld/data'); 
 

上面这两行代码是等价的,都会装载以下类

app/code/local/Zhlmmc/Helper/Data.php

class Zhlmmc_Helloworld_Helper_Data


下面我们来创建我们的帮助类
File: app/code/local/Zhlmmc/Helper/Data.php

class Zhlmmc_Helloworld_Helper_Data extends Mage_Core_Helper_Abstract
{
} 
 

清空Magento缓存,重新装载页面,你会发现错误不见了,但是我们的标签页还是没有出来。如果你好奇帮助类究竟能干什么,建议你去看看“Mage_Core_Helper_Abstract”类。

 

添加新的段

好了,帮助类的介绍到此结束。下面我们来看看为什么我们的标签页不显示出来。在Magento中,每一个标签页都包含很多段(section)。举 个例子,“Advanced”标签页默认包含“Admin, System, Advanced, Developer”四个段。如果一个标签页不包含任何段,那么这个标签页不会被显示出来。下面我们在system.xml中添加 “<section>”节点
Location: app/code/local/Zhlmmc/Helloworld/etc/system.xml

<config>
    <tabs>
        <helloconfig translate="label" module="helloworld">
            <label>Hello Config</label>
            <sort_order>99999</sort_order>
        </helloconfig>
    </tabs>
    <sections>
        <helloworld_options translate="label" module="helloworld">
            <label>Hello World Config Options</label>
            <tab>helloconfig</tab>
            <frontend_type>text</frontend_type>
            <sort_order>1000</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>                   
        </helloworld_options>
    </sections>    
</config> 
 

这里有些节点你应该很熟悉,就不多解释了,来讲讲以前没见过的。

 

什么是<helloworld_options />?

和前面的<hellowconfig>相似,这个节点是用来唯一标示你的段,“helloworld_options”就是段的ID,可以随意取名,只要不重复就好。

 

什么是<frontend_type />?

这个节点有点搞。“<frontend_type />”在配置文件的其他部分有用(稍后会讲),放在这里其实没什么作用。但是核心模块在此处的配置文件都包含这个节点,所以我们也把它添加进去。

 

什么是<show_in_default />,< show_in_website />,<show_in_store />?

这些节点的值是布尔类型的,0或者1。这些标签是用来控制在不同的环境下,当前段是否应该显示。

好了,我们已经配置好段了,清空缓存,再一次刷新页面,你应该看到“HELLO CONFIG”标签页显示出来了。

 

访问控制

如果你刚才点了我们创建的标签页下面的“Hello World Config Options”,你大概会很失望。什么都没有显示出来,连左边的导航栏都没有了。这是因为“Adminhtml”在权限控制列表(Access Control List, ACL)中找不到我们创建的段的权限信息。【译者注:Adminhtml就是Magento的后台管理系统,属于Magento的一个核心模块】

 

ACL是一个很复杂的话题,但是我会介绍一些最基本的概念,以便于理解Magento的权限控制。这部分内容和上下文关系不大,如果你不感兴趣,可以直接跳到本节结尾,复制一段XML到你的config.xml就行了。

 

在Magento中,对于有些资源的访问时有限制的。用户必须先经过认证才能访问相关资源。在这里,资源(Resource)是一个广义的概念,它可能是 指一个页面,也可能是一个功能。Magento的系统配置功能(System Config)就是需要认证才能访问的资源。

 

任何一个资源都是通过一个URI来标识。比如说“web”配置段(属于后台管理General标签页)的URI是
admin/system/config/web


我们“helloworld_options”段的URI是
admin/system/config/helloworld_options


当一个用户访问一个受保护的资源的时候,后台管理系统(Adminhtml)的执行控制器会执行以下步骤

  1. 为用户正在访问的资源生成一个URI
  2. 根据ACL系统检查该用户是否有权限访问指定的资源
  3. 如果用户拥有访问权限,那么进行用户指定的操作。否则,跳转到相应的错误页面(也可能是停止操作或者显示空白页面)。

如果你去“System -> Permissions -> Roles”页面,点击“Add New Role”按钮,你会看到所有系统的资源都以树形结构显示在页面上。

 

添加ACL权限

刚才说ACL中没有我们配置段的信息,那么我们来创建一个。请注意,如果你是创建一个新的段,那么你需要创建一个新的权限,如果你在已有的段上添加内容,你不需要创建权限。

 

在config.xml中,添加以下内容
File: app/code/local/Zhlmmc/Helloworld/etc/config.xml 

<config>   
    <!– … –>
    <adminhtml>
        <acl>
            <resources>
                <admin>
                    <children>
                        <system>
                            <children>
                                <config>
                                    <children>
                                        <helloworld_options>
                                            <title>Store Hello World Module Section</title>
                                        </helloworld_options>
                                    </children>
                                </config>
                            </children>
                        </system>
                    </children>
                </admin>
            </resources>
        </acl>
    </adminhtml>
    <!– … –>
</config> 
 

让我们来分析一下这段代码。所有的资源定义都包含在如下代码中

<adminhtml>
    <acl>
        <resources>
        </resource>
    </acl>
</adminhtml> 
 

在<resources>节点下面,每一个子节点都是URI的一部分,比如

<admin>
    <children>
        <system>
            <children> 
 

代表URI
admin/system


最后一个节点

<helloworld_options>
    <title>Store Hello World Module Section</title>
</helloworld_options> 
 

这里<title>的内容将会在后台权限管理的时候显示出来,也就是我们定义的权限的名字。

清空Magento缓存,刷新页面,你应该能看到我们创建的配置段了,标准的后台管理页面,但是主体内容是空的,只有一个“Save Config”按钮。你可能需要重新登录后台管理才能看到正确的页面。那是因为后台管理有一些额外的缓存。【译者注:我们添加了权限以后,管理员是默认拥 有该权限的,所以我们用管理员登录后台管理系统就能访问我们创建的段】

请注意,不懂事出于什么原因,Magento把<adminhtml />部分从全局配置中删掉了。所以,我们不能用之前创建的Configviewer来查看这部分内容。我正在研究Magento把<adminhtml />存在哪里了。

 

添加组

【译者注:按照逻辑,这里应该讲的内容是添加选项。Mageto中,选项是按照组(Group)来划分的,所以我们在添加选项之前得先添加组。】修改system.xml

Location: app/code/local/Zhlmmc/Helloworld/etc/system.xml

<config>
    <tabs>
        <helloconfig translate="label" module="helloworld">
            <label>Hello Config</label>
            <sort_order>99999</sort_order>
        </helloconfig>
    </tabs>
    <sections>
        <helloworld_options translate="label" module="helloworld">
            <label>Hello World Config Options</label>
            <tab>helloconfig</tab>
            <frontend_type>text</frontend_type>
            <sort_order>1000</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <messages translate="label">
                    <label>Demo Of Config Fields</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>1</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                </messages>
            </groups>
        </helloworld_options>
    </sections>    
</config> 
 

这里也没什么好解释的。刷新一下页面看看你就什么都明白了。

 

添加配置选项

最后,我们要添加每一个单独的配置选项。配置选项是以<fields />节点的形式添加到<messages />节点下面的。

<!– … –>
<messages translate="label">
    <label>Demo Of Config Fields</label>
    <frontend_type>text</frontend_type>
    <sort_order>1</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>1</show_in_store>
    <fields>
        <hello_message>
            <label>Message</label>
            <frontend_type>text</frontend_type>
            <sort_order>1</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
        </hello_message>
    </fields>
</messages>
<!– … –> 
 

这里有一个节点需要说明,“<frontend_type>”,刚才说这个节点没什么用。但是这里有用了,这个节点说明了这个选项的数据类 型。你可以把它换成别的类型,比如“time”。这里支持大部分默认的Varien定义的数据类型(lib/Varien/Data/Form /Element)。这个有点像是工厂(Factory)设计模式。让我们把类型改成“select”。你会看到一个下拉框,但是没有选项。我们来添加选 项。首先我们要添加一个源模型(Source Model)

<hello_message>
    <label>Message</label>
    <frontend_type>select</frontend_type>
    <!– adding a source model –>
    <source_model>helloworld/words</source_model>                          
    <sort_order>1</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>1</show_in_store>                   
</hello_message> 
 

“<source_model>”定义了源模型的URI。和我们以前创建的模型一样,源模型也是一个模型,为“select”提供了默认的数据。我想我不说你也明白,根据这里的URI定义,我们要创建以下文件
File: app/code/local/Zhlmmc/Helloworld/Model/Words.php

class Zhlmmc_Helloworld_Model_Words
{
    public function toOptionArray()
    {
        return array(
            array('value'=>1, 'label'=>Mage::helper('helloworld')->__('Hello')),
            array('value'=>2, 'label'=>Mage::helper('helloworld')->__('Goodbye')),
            array('value'=>3, 'label'=>Mage::helper('helloworld')->__('Yes')),
            array('value'=>4, 'label'=>Mage::helper('helloworld')->__('No')),
        );
    }
} 
 

源模型提供了一个方法“toOptionsArray”,返回的数据时用来填充我们之前定义的配置选项的。这个方法在运行时会被“initFields”调用。“initFields”在以下类中定义
app/code/core/Mage/Adminhtml/Block/System/Config/Form.php


我们这里调用了帮助类的翻译函数(__)来获取数据。虽然不是很必要,但调用翻译函数总是一个好习惯。说不定哪天你要将模块翻译成日文呢。【译者注:值得 注意的是我们这里创建的模型不需要继承任何父类,只需要拥有“toOptionArray”方法就可以了。我觉得这个很不科学,起码要继承一个接口吧】

 

在已有的配置段或者组中添加数据

除了新建一个标签页,或者配置段,你也可以利用已有的标签页和配置段,向里面添加内容。比如我们添加以下代码到system.xml
File: app/code/local/Zhlmmc/Helloworld/etc/system.xml

<config>
    <!– … –>
    <sections>
        <!– … –>
        <general>
            <groups>
                <example>
                    <label>Example of Adding a Group</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>1</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>                   
                </example>
            </groups>
        </general>
        <!– … –>
    </section>
</config> 
 

刷新页面,你会在“General”标签页下面看到一个新的组,叫做“Example of Adding a Group”。

 

如何获得配置数据

到目前为止,我们只是讲了如何设置Magento,可以让用户可以配置我们的模块。现在让我们来看看如何获取用户的配置数据。

Mage::getStoreConfig('helloworld_options/messages/hello_message'); 
 

上面这行代码就可以获取我们上面配置的那个“select”选项的数据。这个函数的参数是我们要获取的数据的URI,格式如下
section_name/group_name/field_name


你也可以通过以下代码来获取一个组或者段的所有值

Mage::getStoreConfig('helloworld_options/messages');
Mage::getStoreConfig('helloworld_options'); 
 

最后,如果你想获取针对某个特定店面(store)的数据,你可以传入store ID

Mage::getStoreConfig('helloworld_options',1);
 

总结

这一章我们讲了如何在Magento的后台管理中添加个性化的配置。我们也顺便介绍了帮助类的使用和ACL基础。这里最重要的内容是后台配置的层级 结构,标签页包含了配置段,配置段包含了组,组包含了配置选项。我们将在以后的章节中介绍系统配置的高级内容,包括自定义格式,数据验证等等。

 

 

from:http://www.zhlmmc.com/?p=674

 

 

 

 

分享到:
评论

相关推荐

    Magento-中文开发教程

    深入理解Magento-第七章 – 自定义Magento系统配置 深入理解Magento-第八章 – 深入自定义Magento系统配置(未完成) 深入理解Magento-第九章 – 修改、扩展、重写Magento代码 深入理解Magento-第十章 – 数据...

    The Definitive Guide to Magento (Apress出品 Magento权威指南)

    - **第7章:安全与性能优化** 随着网站流量的增长,安全性和性能成为不可忽视的问题。本章重点讨论了如何保护Magento免受攻击以及如何通过缓存机制等方式提高网站响应速度。 #### 专业知识点 1. **Magento核心...

    Magento php开发指南

    4. 模块开发:深入探讨如何创建和开发Magento模块,模块是Magento扩展功能的主要方式,包括如何注册和启用模块,如何定义配置文件、数据模型、控制器和视图文件等。 5. 主题和样式定制:指导开发者如何通过修改或...

    magento中文开发教程

    本教程将深入探讨Magento的开发技术,旨在帮助初学者和经验丰富的开发者更好地理解和利用这一平台。 1. **Magento架构与组件**:Magento采用模块化架构,由多个相互独立的模块组成,每个模块负责特定的功能。了解...

    magento电子商城源码

    Magento是一款强大的开源电子商务平台,专为在线商家设计,提供丰富的功能和高度的可定制性。它的源码结构清晰,业务流程设计专业,...深入理解和掌握Magento的源码,将有助于开发者打造高效、定制化的电商解决方案。

    magento源代码

    在深入理解Magento源代码之前,我们首先要了解其核心架构。Magento采用模块化设计,每个功能或服务通常由一个或多个模块组成。这些模块之间通过接口和事件机制进行通信,实现了高度解耦。这使得开发者可以轻松地添加...

    magento 1.9.0.2

    7. **集成第三方服务**:Magento 1.9.2.0易于与各种支付网关、物流和营销工具集成,扩展其核心功能。 8. **订单管理和报告**:强大的后台管理系统让商家可以跟踪订单状态,处理退款,同时提供详细的销售和客户行为...

    magento-1.9.1.1-2015-04-30-12-49-08

    这对于开发者来说是非常有价值的,因为他们可以根据业务需求自由定制功能,同时也可以深入理解Magento的工作原理。 在标签中,"magento"明确指出这是与Magento相关的项目。Magento作为一个强大的电子商务解决方案,...

    Magento2 dev65

    8. **主题与扩展**:Magento2支持自定义主题和第三方扩展,你可以根据需求安装合适的主题和插件以增强功能和视觉效果。 9. **性能优化**:为了提供更好的用户体验,你需要对Magento2进行性能优化,这可能包括开启...

    magento入门文档

    #### 一、Magento的配置系统 **1.1 设置组件的目录结构** Magento的配置系统是其核心组成部分之一,通过一套复杂的机制管理着系统的各个部分,包括模块、模型、类、模板等。配置系统的核心在于能够通过配置文件的...

    magento-1.7.0.7z

    - Magento 1.7.0包含多种预设主题,可以自定义布局、颜色和字体,或从市场上购买第三方主题。 **4. 扩展与插件** - Magento Connect市场提供了大量免费和付费的扩展,涵盖促销、报告、社交网络集成等多个领域,极大...

    magento design

    《Magento编程指南》由Mark Kimsal编写,本书全面介绍了Magento的基础知识、核心概念及高级开发技巧,旨在帮助读者深入理解Magento的工作原理,并掌握如何高效地开发和管理Magento网站。 #### 书籍概览 本书版权由...

    magento分页排序插件

    用户在升级Magento系统时,需要确保插件也能够顺利升级,避免出现不兼容问题。 六、安全性 任何第三方插件都可能引入安全风险,因此在使用插件时,必须确保它们来自可信赖的源,并且经常检查更新以修复可能的安全...

    magento 1.6 最新中文语言包

    对于中国用户来说,拥有一个完整的中文语言包至关重要,能够帮助国内商家更好地理解和操作Magento系统。 该“magento 1.6 最新中文语言包”提供了全面的中文翻译,覆盖了Magento系统的各个部分,包括前端界面、后台...

    Magento: Beginner's Guide ([Packt]出品 Magento新手指南)

    - **扩展功能**:通过安装第三方扩展,可以为商店添加更多高级功能,如社交登录、客户评论系统等。 - **主题设计**:Magento支持高度定制的主题设计,用户可以根据自己的品牌风格选择或创建主题模板。 #### 七、...

    magento汉化包完全版

    "magento汉化包完全版"意味着这个压缩包包含了Magento系统的所有中文翻译资源,使得国内用户能够更加方便地理解和操作这个平台,消除语言障碍,提升使用体验。 Magento的核心功能包括但不限于: 1. **多店铺管理**...

    The Definitive Guide to Magento.pdf

    通过深入浅出的方式,本书介绍了Magento的核心功能及其实现方法,旨在帮助读者掌握如何利用这一快速发展的电子商务平台来构建高效且可扩展的在线商店。 #### 二、Magento概述 1. **发展历程** - Magento自2008年...

    Magento Beginner's Guide

    - **开发自定义模块**:学习如何为Magento开发自定义功能模块。 - **API集成**:了解如何利用Magento API与其他外部系统集成。 #### 六、优化与维护 - **性能优化**:讨论如何通过缓存机制、CDN服务等手段提高网站...

    Magento2开发者指南

    ### Magento2开发者指南 #### 理解平台架构 **技术栈**:Magento 2采用了先进的技术栈,包括...通过深入学习这些概念和技术,开发者将能够更好地理解和掌握Magento 2平台,从而更有效地构建高质量的电子商务网站。

    Magento商城_目录结构说明

    Magento是一款强大的开源电子...这个结构设计允许开发者和管理员轻松地管理和定制Magento商城,包括皮肤、缓存、数据库操作、错误处理以及第三方扩展的集成。理解这个目录结构对于有效管理和优化Magento商店至关重要。

Global site tag (gtag.js) - Google Analytics