2013-03-19 63 views
0

當分機必須做一個佈局更新,以下爲我不起作用:Magento擴展布局更新:在config.xml中不可能?

命名空間/模塊的/ 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> 

然後,我只是把相關的佈局更新:應用程序/設計/前端/基/默認/佈局/ modulename.xml

我可以發誓,我在一個教程前段時間讀到辦法#1 ,但現在我再也找不到它了。那個教程是錯誤的,並且是方法#2正確的方法來做到這一點?這似乎有點哈克把我的佈局更新文件到前端/基地 ...任何建議?

+1

'config XML!= layout XML' – benmarks 2013-03-19 18:07:47

回答

2

如果你瞭解這是不是

  1. 對於一個古代版的Magento的

  2. 公然不正確

佈局更新XML文件是從全球的獨立系統​​3210配置樹。佈局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; 
} 

加載儘管此代碼並獲得與

$updatesRoot = Mage::app()->getConfig()->getNode($area.'/layout/updates'); 

<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; 
    } 
} 
+0

啊,對,謝謝。我一定記得不正確。但是將佈局更新真的放在app/design/frontend/base/default/layout/modulename.xml中是否正確? – 2013-03-19 18:17:31

+0

如果您想要修改現有佈局,則建議使用local.xml#2 – oscprofessionals 2013-03-19 18:33:18

+0

@LouisBataillard正確取決於您的上下文。如果你修改佈局而不重新分配模塊,'local.xml'是這些更新的最佳/最簡單的地方。如果你重新分配一個模塊,並希望你的佈局更新適用於所有主題,那麼'app/design/frontend/base/default/layout/modulename.xml是最好的地方。 – 2013-03-19 18:36:15