当扩展程序必须进行布局更新时,以下内容对我不起作用:
命名空间/模块的/ 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 ...有什么建议吗?
答案 0 :(得分:2)
如果你读到它是
对于古老版本的Magento
公然不正确
布局更新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合并布局更新指令的逻辑。