在 Magento 中设置全局变量,GUI 方式?
Posted
技术标签:
【中文标题】在 Magento 中设置全局变量,GUI 方式?【英文标题】:Setting a global variable in Magento, the GUI way? 【发布时间】:2010-10-31 06:58:01 【问题描述】:我最近开始将 Magento 用于客户的网上商店,但仍需要掌握它的系统。
网店应该有几个链接,并从公司网站所在的另一个域获取信息。我不希望对域名或 URL 进行硬编码,而是在某个地方定义它并在整个 webshop 的 phtml 模板中使用该值。当我们在开发、暂存和生产 URL 之间移动网站时,这使得调整它变得容易。
任何人都可以建议使用 Magento 的方法吗?最好我们可以在后端的 Store 的配置 GUI 中添加一个字段,类似于设置 base_url 的方式。还是我想错了?
【问题讨论】:
基于 Alan 的出色回答,我构建了一个简单的 youtube 提要扩展。阅读 Alan 的答案,然后您可以看到我的 Alan 帮助我进行下一步的地方。包的链接也在那里。 【参考方案1】: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');
【讨论】:
在产品或类别属性中使用自定义变量会很好开箱即用的 magento,但我们使用以下模块来解决这个问题scommerce-mage.co.uk/magento-custom-variable-anywhere.html。现在我们可以在任何我们想要的地方使用自定义变量:)【参考方案2】:艾伦,谢谢你的回答!它是为我解开谜团的钥匙。即使在我成为reading your excellent guide 之后。由于我正在尽最大努力不修改核心文件,因此我开始为我的电子商务业务进行扩展。我得到了一个我认为足以发布给人们的版本,但我希望能够在管理员中对其进行配置,这样就不需要编辑文件了。
我从上面的代码开始,发现添加的“菜单”不在“General”中,而是在“General-General”,或 General-Web、General-Design 等中。我想让我的东西显示总的来说,但我不想像其他人一样为我的扩展程序添加整个菜单组。
如果读者从 Google 来到这里只是想将我的选项放在管理员的某个简单位置,那么请继续阅读(这就是我添加另一个答案的原因)。 首先:按照 Alan 上面所说的去做。让您的菜单显示在 General->General->Your Menu 中。注意:您需要清除缓存并注销,因为会话中存储了一些信息。
为了让您自己的菜单显示在“常规”下,您必须像获得自己的组一样执行相同的操作,甚至在顶部菜单栏上的 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”模块对此进行了建模。还有一个问题: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/
更新:我发了an extension out of this answer。
【讨论】:
【参考方案3】:Magento 为自定义配置值提供(相对)简单的支持。我发现完成此任务的最佳方法是创建一个包含所有自定义配置值的单个 magento 模块。
就像任何 Magento 一样,有很多步骤,任何一个错误都可能让你(或我!)绊倒。
创建一个空的 Magento 模块
首先,您需要设置一个 magento 模块来保存所有自定义配置值。创建一个magento模块涉及
-
在 app/etc/modules 中创建一个 xml 文件
在 app/code/local/Companyname 中创建文件夹结构
Companyname 是用作命名空间的唯一字符串,大多数 magento 教程建议您在此处使用您的公司名称。出于本教程的目的,我将使用“***”。无论您在何处看到字符串 ***,都将其替换为您自己的唯一字符串。
因此,对于第 1 步,在 app/etc/modules 中创建一个名为“***_Customconfig.xml”的文件,并将以下内容放入其中
<?xml version="1.0"?>
<config>
<modules>
<***_Customconfig>
<active>true</active>
<codePool>local</codePool>
</***_Customconfig>
</modules>
</config>
随机 Magento 提示:magento 系统的某些部分认为空格很重要,因此最好不要在属性值中包含空格(true vs. true
接下来,创建以下文件夹
mkdir app/code/local/***/Customconfig
mkdir app/code/local/***/Customconfig/etc
并在
创建一个文件app/code/local/***/Customconfig/etc/config.xml
以下内容
<?xml version="1.0"?>
<config>
<modules>
<***_Customconfig>
<version>0.1.0</version>
</***_Customconfig>
</modules>
</config>
恭喜,您刚刚设置了一个新的 Magento 模块。如果您清除您的 magento 缓存并转到
System -> Configuration -> Advanced -> Disable Modules Output
您应该会看到您的模块已列出。
将 System.xml 文件添加到您的模块中
接下来,我们将添加一个 system.xml 文件。此文件用于向 magento 添加自定义配置值,您可以在 magento 请求周期中获取您想要的任何位置。在
处添加文件app/code/local/***/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>
app/code/core/Mage/Directory/etc/system.xml
<currency translate="label" module="directory">
<label>Currency Setup</label>
所以你会使用标签
您还会注意到此处的 translate 属性,以及相应的标签标记。这允许您在 HTML 界面中使用您想要的任何字符串作为组标题,但在内部将名称保留为有效的 XML 标记名称。我们的标签被命名为
<my_or_their_group />
但在界面中,群组会有标题
一组配置值。建立您自己的小组,或让我们成为现有小组。
最后,
需要其他 xml 结构,并且(主要)用于控制将用于您的配置的 HTML 输入类型。如果您想要特定的界面元素,请在核心模块中找到示例并复制 XML 结构。
这将允许您在 Magento GUI 界面中设置和查找配置值。您可以使用全局 Mage 对象的静态 getStoreConfig 方法并指定配置值的 URI 来检索您的值。 URI 是使用配置的部分/组/名称创建的。
Mage::getStoreConfig('design/my_or_their_group/my_config');
【讨论】:
惊人的详细答案...只是好奇(在阅读了您在此处和您的网站上的帖子后),您是如何弄清楚这一切的?你是为 Varien 工作还是你使用了其他一些黑魔法:P 不是瓦里安员工,也没有黑魔法。只是努力工作和大量代码探索(Mage::Log 是你的朋友)。 感谢艾伦的详细回答。这会做得很好。 不像第一次出现那样痛苦。很有帮助! 惊人的奉献精神...有趣的是,在这个标签旁边,当前打开的页面是alanstorm.com/magento_default_system_configuration_values。多么巧合。这家伙真是个天才。【参考方案4】:我太新了,无法对 Alan 的回答添加评论,但这里有一些来自 Magento 的更多信息:
XML for Admin Configurations -- “本文档描述了如何在配置部分定义供模块使用的字段。”-Ed.
【讨论】:
【参考方案5】:最简单的方法是将节点添加到 magento 的核心配置 xml 文件中。但不建议这样做,因为它会导致升级出现问题。要在不编辑核心的情况下设置自定义值....查看此链接
How to override config values
【讨论】:
感谢您提供的良好链接。我还找到了另一种方法,就是在db的core_config_data表中增加一行,使用getStoreConfig()函数获取它的值。不过,我还没有弄清楚如何在 Magento 管理 GUI 中显示此字段。 Martijn,在下方(或上方)添加一个比 cmets 允许的 600 个字符长一点的答案。以上是关于在 Magento 中设置全局变量,GUI 方式?的主要内容,如果未能解决你的问题,请参考以下文章