2014-09-05 124 views
0

我正在創建自定義頁面佈局。我已將必要的XML添加到模塊的config.xml文件中,創建了該模板,並且可以在管理面板中選擇該模板。如何使用佈局處理修改頁面佈局

我似乎無法修改佈局句柄的頁面佈局。通過修改,我的意思是添加JS頭部,添加一個體類等。在我的config.xml中我有以下幾點:

<config> 
    <frontend> 
     .... 
     <layout> 
      <updates> 
       <mymodule_layout> 
        <file>mymodule.xml</file> 
       </mymodule_layout> 
      </updates> 
     </layout> 
    </frontend> 
    ... 
    <global> 
     <page> 
      <layouts> 
       <mymodlue_pagelayout module="page" translate="label"> 
        <label>My Module - A Custom Layout</label> 
        <template>page/customlayouttest.phtml</template> 
        <layout_handle>mymodlue_pagelayout</layout_handle> 
       </mymodlue_pagelayout> 
      </layouts> 
     </page> 
    .... 
    </global> 
</config> 

然後在mymodule.xml,我有以下XML。它沒有任何作用。當我使用我的頁面佈局訪問類別時,以下所有更改都不會生效。我錯過了什麼?

<mymodlue_pagelayout translate="label"> 
    <label>My Module - A Custom Layout</label> 
    <reference name="root"> 
     <action method="setTemplate"><template>page/customlayouttest.phtml</template></action> 
     <!-- Mark root page block that template is applied --> 
     <action method="setIsHandle"><applied>1</applied></action> 
     <action method="addBodyClass"><className>grid-4</className></action> 
     <action method="addBodyClass"><className>stl-category</className></action> 
    </reference> 

    <reference name="product_list"> 
     <action method="setTemplate"><template>catalog/product/list-alternate.phtml</template></action> 
     <action method="setData"><name>list_golfers</name><value>true</value></action> 
    </reference> 

    <reference name="product_list_toolbar"> 
     <action method="setDefaultGridPerPage"><limit>15</limit></action> 
     <action method="addPagerLimit"><mode>grid</mode><limit>15</limit></action> 
     <action method="addPagerLimit"><mode>grid</mode><limit>all</limit></action> 
    </reference> 

    <reference name="head"> 
     <action method="addJs"><script>jquery/jquery-1.7.1-min.js</script></action> 
     <action method="addJs"><script>varien/product.js</script></action> 
     <action method="addJs"><script>varien/configurable.js</script></action> 
     <action method="addJs"><script>amasty/amconf/configurable.js</script></action> 
     <action method="addJs"><script>jquery/magiczoom.js</script></action> 
     <action method="addJs"><script>prototype/window.js</script></action> 
     <action method="addJs"><script>jquery/jquery-magnificPopup.0.9.9.js</script></action> 
    </reference> 
</mymodlue_pagelayout> 
+0

也許是錯字? mymodlue_pagelayout – 2014-09-08 13:21:15

回答

1

這個問題的簡短答案是,Magento根本不會在類別頁面的佈局句柄中使用這些信息,它會被直接忽略。 Alan Storm向我們提供了一個類似SO問題的解釋:https://stackoverflow.com/a/20257191/2124039

雖然我們現在知道爲什麼佈局手柄不工作,我們仍然需要一個解決方案 - 我們如何修改佈局處理頁面佈局?我發現最簡單的解決方案是創建一個觀察器來偵聽事件controller_action_layout_load_before,確定正在查看的頁面是否爲類別頁面,然後將佈局句柄添加到我們正在使用的佈局頁面的佈局對象(如果有)。

建成一個獨立的模塊,這將是這樣的:

config.xml中

<config> 
    <modules> 
     <Callmetwan_CategoryLayoutHandler> 
      <version>1.0.0.0</version> 
     </Callmetwan_CategoryLayoutHandler> 
    </modules> 
    <frontend> 
     <events> 
      <controller_action_layout_load_before> 
       <observers> 
        <pm_shopthelook_model_observer> 
         <class>Callmetwan_CategoryLayoutHandler_Model_Observer</class> 
         <method>addCustomHandles</method> 
        </pm_shopthelook_model_observer> 
       </observers> 
      </controller_action_layout_load_before> 
     </events> 
    </frontend> 
</config> 

observer.php:

class Callmetwan_CategoryLayoutHandler_Model_Observer extends Varien_Object 
{ 
    public function addCustomHandles($observer) { 

     $pageConfig   = (object) Mage::getModel('page/config'); 
     $allLayoutHandles = (array) $pageConfig->getPageLayoutHandles(); 


     // Determine if we are in a category 
     $category = Mage::registry('current_category'); 
     $product = Mage::registry('current_product'); 

     if ($category && !$product) 
     { 

      // Get all design settings applied to current category 
      $design = (object) Mage::getSingleton('catalog/design')->getDesignSettings($category); 

      // Get current page layout current category is using 
      $pageLayout = (string) $design->getPageLayout(); 


      foreach ($allLayoutHandles as $layout => $handle) 
      { 
       // Cycle through each layout to find current layout, then add current page's layout handle to the layout object 
       if ($pageLayout === $layout) 
       { 
        $update = (object) Mage::getSingleton('core/layout')->getUpdate(); 
        $update->addHandle($handle); 
        break; 
       } 
      } 
     } 
    } 
} 

回顧一下,你會結束有兩個獨立的模塊。你的佈局頁面將是一個模塊的一部分(使用問題中的例子,它將是MyModule),它將定義一個定製的mymyodule.xml佈局文件,其中包含佈局頁面的所有更新。然後上面的代碼(Callmetwan_CategoryLayoutHandler)將負責將佈局處理程序添加到佈局對象。