在GUI方式中设置Magento中的全局变量?

时间:2009-06-04 10:41:42

标签: php xml configuration magento

我最近开始将Magento用于客户的网上商店,但仍然需要掌握其系统。

网上商店应该有几个链接,并且还可以从公司网站所在的另一个域获取信息。我宁愿不对域名或URL进行硬编码,而是在某个地方定义它,并在整个网店的phtml模板中使用该值。这样,当我们在dev,staging和production URL之间移动网站时,可以轻松调整它。

有人能建议采用Magento的方式吗?我们最好在后端添加一个字段到Store的Config GUI,类似于{{base_url}}的设置方式。或者我想错了路?

5 个答案:

答案 0 :(得分:36)

Magento为自定义配置值提供(相对)轻松支持。我发现完成此任务的最佳方法是创建一个包含所有自定义配置值的magento模块。

像任何Magento一样,有很多步骤,任何一个错误的人都可以绊倒你(或我!)。

创建一个空的Magento模块

首先,您需要设置magento模块来保存所有自定义配置值。创建magento模块涉及

  1. 在app / etc / modules
  2. 中创建一个xml文件
  3. 在app / code / local / Companyname
  4. 中创建文件夹结构

    Companyname是一个唯一的字符串,用作命名空间,大多数magento教程建议您在此处使用您的公司名称。出于本教程的目的,我将使用“Stackoverflow”。无论您在何处看到字符串Stackoverflow,请将其替换为您自己的唯一字符串。

    因此,对于第1步,在名为“Stackoverflow_Customconfig.xml”的app / etc / modules中创建一个文件,并将以下内容放在

    <?xml version="1.0"?>
    <config>
        <modules>
            <Stackoverflow_Customconfig>
                <active>true</active>
                <codePool>local</codePool>
            </Stackoverflow_Customconfig>
        </modules>
    </config>
    

    随机Magento提示:magento系统的某些部分会考虑空白显着,因此最好不要在属性值中包含空格(&lt; active&gt; true&lt; / active&gt; vs.&lt; active&gt; true&lt; /活性&GT;

    接下来,创建以下文件夹

    mkdir app/code/local/Stackoverflow/Customconfig
    mkdir app/code/local/Stackoverflow/Customconfig/etc
    

    并在

    创建一个文件
    app/code/local/Stackoverflow/Customconfig/etc/config.xml
    

    包含以下内容

    <?xml version="1.0"?>
    <config>
        <modules>
            <Stackoverflow_Customconfig>
                <version>0.1.0</version>
            </Stackoverflow_Customconfig>
        </modules>
    </config>
    

    恭喜,您刚刚设置了一个新的Magento模块。如果清除magento缓存并转到

    System -> Configuration -> Advanced -> Disable Modules Output
    

    你应该看到列出了你的模块。

    将System.xml文件添加到模块

    接下来,我们将添加一个system.xml文件。此文件用于向magento添加自定义配置值,您可以在magento请求周期中随意抓取任何位置。在

    添加文件
    app/code/local/Stackoverflow/Customconfig/etc/system.xml
    

    包含以下内容

    <config>
        <sections>
            <design>
                <groups>
                    <my_or_their_group translate="label">
                        <label>A grouping of config values.  Make your own, or us an existing group.</label>
                        <frontend_type>text</frontend_type>
                        <sort_order>50</sort_order>
                        <show_in_default>1</show_in_default>
                        <show_in_website>0</show_in_website>
                        <show_in_store>0</show_in_store>
                        <fields>
                            <my_config translate="label">
                                <label>This will be my config's label</label>
                                <frontend_type>text</frontend_type>
                                <sort_order>50</sort_order>
                                <show_in_default>1</show_in_default>
                                <show_in_website>0</show_in_website>
                                <show_in_store>0</show_in_store>
                            </my_config>
                        </fields>
                    </my_or_their_group>
                </groups>
            </design>
        </sections>
    </config>   
    

    &lt; design&gt; 是您的配置将显示在的部分的名称。“常规,网络,设计,货币设置等”总的来说,这将是标题的小写版本,即“General”变为“general”,“Design”变为“design”。如果您不确定该外部标记应该是什么,请搜索核心magento模块。即,“货币设置”的点击显示在

    中提及
    app/code/core/Mage/Directory/etc/system.xml
    <currency translate="label" module="directory">
        <label>Currency Setup</label>
    

    所以你要使用标签&lt; currency /&lt;,而不是更直观的&lt; currency_setup /&gt;

    &lt; my_or_their_group translate =“label”&gt;是您的配​​置变量将显示的组的名称。组是包含配置字段的Ajax下拉列表。例如,“常规”部分具有“国家/地区选项”组和“本地选项”组。如果您不确定如何在现有组中放置值,请再次检查现有核心模块。

    您还会在此处注意到翻译属性以及相应的标签标记。这允许您在HTML界面中使用任何您想要的字符串作为组标题,但在内部保留该名称是有效的XML标记名称。我们的标签名为

    <my_or_their_group />
    

    但在界面中,该组将具有标题

      

    一组配置值。制作自己的,或我们现有的团体。

    最后,&lt; my_config translate =“label”&gt;是yoru conifg值的名称。再次注意 translate属性。适用上述规则。

    需要另一个xml结构,并且(主要)用于控制将用于配置的HTML输入类型。如果需要特定的接口元素,请在核心模块中查找示例并复制XML结构。

    这将允许您在Magento GUI界面中设置和查找配置值。您可以使用全局Mage对象的静态getStoreConfig方法检索值,并指定配置值的URI。使用配置的/ group / name部分创建URI。

    Mage::getStoreConfig('design/my_or_their_group/my_config');     
    

答案 1 :(得分:17)

Magento从版本1.4开始提供自定义变量。

登录管理员端,系统 - &gt;自定义变量 - &gt;使用代码“my_variable”创建一个新的自定义变量。

输入此变量的HTML内容和纯文本

您可以通过放置此{{customVar code=my_variable}}

在CMS页面中显示自定义变量

.phtml页:

$variableHtml = Mage::getModel('core/variable')->loadByCode('my_variable')->getValue('html');
$variablePlain = Mage::getModel('core/variable')->loadByCode('my_variable')->getValue('plain');

答案 2 :(得分:1)

最简单的方法是将节点添加到magento的核心配置xml文件中。但不推荐这样做,因为它会导致升级问题。要在不编辑核心的情况下设置自定义值....请查看此链接

How to override config values

答案 3 :(得分:1)

我太新了,无法为Alan的回答添加评论,但这里有来自Magento的更多信息:

-Ed。

答案 4 :(得分:0)

艾伦,谢谢你的回答!这是为我揭开神秘面纱的关键。即使在我reading your excellent guide之后。由于我正在尽力不修改核心文件,因此我开始为我的电子商务业务进行扩展。而且我得到了一个我认为足以向人们发布的内容,但我希望能够在管理员中进行配置,因此无需编辑文件。

我从上面的代码开始,看到添加的“菜单”不在“常规”中,而是在“General-General”,或General-Web,General-Design等中。我希望我的东西显示一般来说,但我不想像其他人一样做,并为我的扩展添加一个完整的菜单组。

如果读者来自谷歌只是想在管理员中轻松选择我的选项,那么请继续阅读(这就是为什么我要添加另一个答案)。 首先:做艾伦上面所说的话。让您的菜单显示在General-&gt; General-&gt;您的菜单中。注意:您需要清除缓存并注销,因为会话中存储了一些信息。

为了让你自己的菜单显示在“常规”下,你必须做同样的事情,就好像你正在获得自己的组,甚至是顶部菜单栏中的Tab,你必须给自己config.xml中的ACL权限:

<!-- file: config.xml -->
<config>
    <adminhtml>
        <acl>
            <resources>
                <admin>
                    <children>
                        <system>
                            <children>
                                <config>
                                    <children>
                                        <ytf translate="title">
                                            <title>Youtube Feed</title>
                                        </ytf>
                                    </children>
                                </config>
                            </children>
                        </system>
                    </children>
                </admin>
            </resources>
        </acl>
    </adminhtml>
</config>

这是我的system.xml,与配置相对应。请注意,ytf是父菜单。我模仿了TniyBrick的“True Order Edit”模块。另外一个问题:ytfytfeed与其条目有细微差别。 ytf条目是您转到管理员时显示的内容 - &gt;配置并查看“常规”组中的左侧。当您点击“常规 - &gt; Youtube Feed”时,ytfeed是在页面中心打开的“栏”

<!-- file: system.xml -->
<config>
    <sections>
        <ytf translate="label" module="ytfeed">
            <label>Youtube Feed</label>
            <tab>general</tab>
            <frontend_type>text</frontend_type>
            <sort_order>700</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <ytfeed translate="label" module="ytfeed">
                    <label>Youtube Feed</label>
                    <sort_order>50</sort_order>
                    <expanded>1</expanded>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <username translate="label">
                        <!-- Mage::getStoreConfig('ytf/ytfeed/username');  -->  
                            <label>YouTube Username:</label>
                            <comment>(or YouTube channel name)</comment>
                            <frontend_type>text</frontend_type>
                            <sort_order>10</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </username>
                    </fields>
                </ytfeed>
            </groups>
        </ytf>
    </sections>
</config>

另一个对我有帮助的链接:
http://www.scorgit.com/blog/custom-options-in-a-magento-back-end-dropdown-menu/

更新:我制作了an extension out of this answer