9

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

网店应该有几个链接,并从公司网站所在的另一个域获取信息。我不希望对域名或 URL 进行硬编码,而是在某个地方定义它,并在整个 webshop 的 phtml 模板中使用该值。当我们在开发、登台和生产 URL 之间移动站点时,这使得调整它变得很容易。

任何人都可以建议 Magento 这样做的方式吗?最好我们可以在后端的 Store 的配置 GUI 中添加一个字段,类似于设置 {{base_url}} 的方式。还是我想错了?

4

5 回答 5

36

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

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

创建一个空的 Magento 模块

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

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

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

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

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

随机 Magento 提示:magento 系统的某些部分认为空格很重要,因此最好不要在属性值中包含空格(<active>true</active> vs. <active> true </active>

接下来,创建以下文件夹

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>   

<design>是您的配置将在其中显示的部分的名称。“General, Web, Design, Currency Setup, etc.” 总的来说,这将是标题的小写版本,即“General”变成“general”,“Design”变成“design”。如果您不确定这个外部标签应该是什么,请搜索核心 magento 模块。即,对“货币设置”的 grepping 揭示了在

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

所以你会使用标签 <currency /<,而不是更直观的 <currency_setup />

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

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

<my_or_their_group />

但在界面中,群组会有标题

一组配置值。使您自己的,或我们现有的组。

最后,<my_config translate="label"> 是 yoru conifg 值的名称。再次注意translate 属性。适用与上述相同的规则。

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

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

Mage::getStoreConfig('design/my_or_their_group/my_config');     
于 2009-06-15T21:25:56.797 回答
17

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

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

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

您可以通过在 CMS 页面中显示自定义变量{{customVar code=my_variable}}

或在.phtml页面中:

$variableHtml = Mage::getModel('core/variable')->loadByCode('my_variable')->getValue('html');
$variablePlain = Mage::getModel('core/variable')->loadByCode('my_variable')->getValue('plain');
于 2010-07-29T11:27:33.817 回答
1

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

如何覆盖配置值

于 2009-06-05T07:12:19.610 回答
1

我太新了,无法对艾伦的回答添加评论,但这里有一些来自 Magento 的更多信息:

  • 用于管理配置的XML——“本文档描述了如何在配置部分定义供模块使用的字段。”

-埃德。

于 2010-10-08T15:32:13.337 回答
0

艾伦,谢谢你的回答!它是为我解开谜团的钥匙。即使在我阅读了您出色的指南之后。由于我正在尽最大努力不修改核心文件,因此我开始为我的电子商务业务进行扩展。我得到了一个我认为足以发布给人们的版本,但我希望能够在管理员中对其进行配置,这样就不需要编辑文件了。

我从上面的代码开始,发现添加的“菜单”不在“常规”中,而是在“常规-常规”或“常规-Web”、“常规-设计”等中。我希望我的东西出现在“常规”中,但我不想像其他人一样为我的扩展添加整个菜单组。

如果读者从谷歌来到这里只是想把我的选项放在管理员的某个容易的地方,那么请继续阅读(这就是我添加另一个答案的原因)。第一:按照艾伦上面所说的去做。让您的菜单显示在 General->General->Your Menu 中。注意:您需要清除缓存并注销,因为会话中存储了一些信息。

为了让您自己的菜单显示在“常规”下,您必须像获得自己的组一样执行相同的操作,甚至顶部菜单栏中的 Tab,您必须授予自己 ACL 权限config.xml

<!-- 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”模块对此进行了建模。还有一个陷阱:ytf并且ytfeed与他们的条目有细微的差别。ytf当您转到 Admin -> config 并在 General 组的左侧查看时,就会显示该条目。ytfeed是当您点击“General->Youtube Feed”时在页面中心打开的“栏”

<!-- 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/

更新:对此答案进行了扩展

于 2013-03-02T02:26:58.513 回答