Magento扩展布局更新:在config.xml中不可能?

时间:2013-03-19 17:42:12

标签: php xml magento

当扩展程序必须进行布局更新时,以下内容对我不起作用:

命名空间/模块的/ etc / config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<config> 
    <modules>
        <Namespace_Modulename>
            <version>0.0.1</version>
        </Namespace_Modulename>
    </modules>
    <frontend>
        <layout>
            <updates>
                <catalog_product_view>
                    <reference name="content">
                        <remove name="product.info.upsell" />
                    </reference>
                </catalog_product_view>
            </updates>
        </layout>
    </frontend>
</config>

但这确实有效:

命名空间/模块的/ etc / config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<config> 
    <modules>
        <Namespace_Modulename>
            <version>0.0.1</version>
        </Namespace_Modulename>
    </modules>
    <frontend>
        <layout>
            <updates>
                <Namespace_Modulename>
                    <file>modulename.xml</file>
                </Namespace_Modulename>
            </updates>
        </layout>
    </frontend>
</config>

然后我将相关的布局更新放在: app / design / frontend / base / default / layout / modulename.xml

我可能已经发誓说我在一段时间内在教程中读到过关于#1的方法,但现在我再也找不到它了。该教程是错误的,并且正确的方法是#2吗?将我的布局更新文件放入 frontend / base ......似乎有点hacky ...有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果你读到它是

  1. 对于古老版本的Magento

  2. 公然不正确

  3. 布局更新XML文件是与全局config.xml配置树不同的系统。布局XML加载在

    #File: app/code/core/Mage/Core/Model/Layout/Update.php
    public function getFileLayoutUpdatesXml($area, $package, $theme, $storeId = null)
    {
        if (null === $storeId) {
            $storeId = Mage::app()->getStore()->getId();
        }
        /* @var $design Mage_Core_Model_Design_Package */
        $design = Mage::getSingleton('core/design_package');
        $layoutXml = null;
        $elementClass = $this->getElementClass();
        $updatesRoot = Mage::app()->getConfig()->getNode($area.'/layout/updates');
        Mage::dispatchEvent('core_layout_update_updates_get_after', array('updates' => $updatesRoot));
        $updateFiles = array();
        foreach ($updatesRoot->children() as $updateNode) {
            if ($updateNode->file) {
                $module = $updateNode->getAttribute('module');
                if ($module && Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $module, $storeId)) {
                    continue;
                }
                $updateFiles[] = (string)$updateNode->file;
            }
        }
        // custom local layout updates file - load always last
        $updateFiles[] = 'local.xml';
        $layoutStr = '';
        foreach ($updateFiles as $file) {
            $filename = $design->getLayoutFilename($file, array(
                '_area'    => $area,
                '_package' => $package,
                '_theme'   => $theme
            ));
            if (!is_readable($filename)) {
                continue;
            }
            $fileStr = file_get_contents($filename);
            $fileStr = str_replace($this->_subst['from'], $this->_subst['to'], $fileStr);
            $fileXml = simplexml_load_string($fileStr, $elementClass);
            if (!$fileXml instanceof SimpleXMLElement) {
                continue;
            }
            $layoutStr .= $fileXml->innerXml();
        }
        $layoutXml = simplexml_load_string('<layouts>'.$layoutStr.'</layouts>', $elementClass);
        return $layoutXml;
    }
    

    虽然此代码确实使用

    引用了<updates/>节点
    $updatesRoot = Mage::app()->getConfig()->getNode($area.'/layout/updates');
    

    这仅用于汇总文件列表

    foreach ($updatesRoot->children() as $updateNode) {
        if ($updateNode->file) {
            $module = $updateNode->getAttribute('module');
            if ($module && Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $module, $storeId)) {
                continue;
            }
            $updateFiles[] = (string)$updateNode->file;
        }
    }
    

答案 1 :(得分:1)

Mage_Core_Model_Layout_Update::getFileLayoutUpdatesXml() (link)是为了配置视图而合并基于文件的布局更新的方法,它不具备从配置DOM合并布局更新指令的逻辑。