【问题标题】:Future-proofing a Magento XML override面向未来的 Magento XML 覆盖
【发布时间】:2011-05-13 13:36:49
【问题描述】:

我知道 Magento 最佳实践模式说,如果我想修改 Magento 的核心文件之一,我应该将文件(和匹配的目录树结构)从 /app/code/core 复制到 /app /code/local 并修改副本以覆盖原始副本。我需要使用 Magento 的核心 XML 文件之一来执行此操作 - 我已经修改了该文件,并且我想确保以后升级 Magento 时它不会被覆盖。

现在,我有一个修改后的版本 /app/code/core/Mage/Page/etc/config.xml - 我对其进行了编辑以添加我网站所需的特定页面布局。现在我想将我的修改移出核心文件。我是在 /app/code/local/Mage/Page/etc/config.xml 中重新创建整个 XML 文件,还是只需将我的添加和更改放入本地覆盖文件?

如果是后者,谁能给我解释一下它的结构?

【问题讨论】:

    标签: xml magento overriding


    【解决方案1】:

    您不能以这种方式完全“覆盖” config.xml 文件。

    Magento 由代码模块组成。 Mage_Page 是单个模块。一个模块包含一个config.xml 文件和许多PHP 文件。

    您可以通过在

    中放置替换来覆盖 Magento 中某些类型的 PHP 文件
    app/code/local/Package/Module/Path/To/File.php
    

    这是因为 __autoloader 创建的包含语句看起来像这样

    include('Package/Path/To/File.php')
    

    PHP 会检查每个代码池中的文件。

    app/code/local
    app/code/community
    app/code/core
    

    通过在本地放置一个替换文件,Magento 会首先找到您的文件并跳过核心文件。

    你不能对config.xml 做同样的事情。如果您将 config.xml 文件放在

    app/code/local/Mage/Page/etc/config.xml
    

    Magento 会忽略它。当您在 Magento 中请求页面时,系统将创建一个活动模块列表(来自app/modules/etc),然后加载每个模块的 config.xml 文件。您根本不应该更改核心 config.xml 文件。

    根据您的问题,听起来您更改了此 config.xml 文件以添加额外的 layout.xml 文件。如果是这样的话,那么你要做的是

    1. 向 magento 添加一个新模块
    2. 在新模块的config.xml 文件中,添加新的布局节点。

    This page(自链接)涵盖了安装新模块所需的基本文件。但是,不要将观察者的东西添加到config.xml,而是添加新的布局节点

    <config>
        <frontend>
            <layout>
                <updates>
                    <my_unique_node_name>
                        <file>foo.xml</file>
                    </my_unique_node_name>
                </updates>
            </layout>
        </frontend>
    </config>    
    

    【讨论】:

    • 如果我能感谢你们两个(绿色勾号)我会的!我使用了 Aarons 方法,因为我需要快速完成。我将努力了解更多关于这个主题的信息,您的网站文章非常有用,所以请继续努力。谢谢!
    【解决方案2】:

    如果不是太多的 xml,您可以将其弹出到 app/etc/local.xml 中,这是我倾向于为自定义布局所做的。

    例如

    <config>
      <global>
        <!-- ... -->
        <page>
          <layouts>
            <three_columns_test module="page" translate="label">
              <label>3 Columns Test</label>
              <template>page/3columns-test.phtml</template>
              <layout_handle>page_three_columns_test</layout_handle>
            </three_columns_test>
            <new_homepage module="page" translate="label">
              <label>Homepage Layout</label>
              <template>page/homepage.phtml</template>
              <layout_handle>page_homepage</layout_handle>
            </new_homepage>
          </layouts>
        </page>
        <!-- ... -->
      </global>
    </config>
    

    【讨论】:

    • 我喜欢 Alans 上面的回答,但我对他的建议的满意程度不是现在应该达到的水平。我可能会稍后再谈。现在,我想试试这个建议。我假设这不会破坏我使用替代页面布局构建内容的任何页面?
    • Aaron,我是要简单地为我的额外页面复制 XML(5 xml 行),还是需要复制所有标准页面以及我的额外页面(复制 xml 部分)?
    • 只需复制自定义布局的内容,然后在 in local.xml 中的 标记之间弹出它
    • 我要感谢你们俩,但我不能 :-( 我已经使用你的快速修复方法 Aaron 更新了我的文件,一切正常。谢谢!XML 的限制是什么?这个 app/etc/local.xml 文件 - 你提到“如果不是太多 xml”?只是好奇!
    • local.xml 中的数量没有限制,这只是一个维护/良好实践的事情。如果您在 local.xml 中放置了如此多的布局,这表明您可能应该硬着头皮制作一个自定义模块并遵循 Alan 的方法。
    猜你喜欢
    • 2012-11-27
    • 2012-02-08
    • 1970-01-01
    • 2012-05-13
    • 2013-11-02
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多