2012-02-01 35 views
0

我想使頁面的一部分可用於通過AJAX獲取。我想要使​​用URL參數bare,它會告訴Magento顯示一個頁面,其中應用於塊的不同模板。該模板看起來是這樣的:有條件地設置Magento中的模板

<?php echo $this->getChildHtml('content'); ?> 

這就是它!這個想法是,JavaScript方法可以抓取另一個頁面的content,並在適當的地方將其插入到DOM中。 (我不希望這是可能的只有任何頁面 - 只有頁面已被標記爲這樣做在佈局xml。)

我讀過其他地方I should avoid conditional layout xml。我能想到的唯一方法是重寫Page/Html塊本身,創建一個修改的setTemplate方法,如下所示。本能地,我擔心壓倒Magento這樣的核心部分。

public function setTemplate($template, $bareTemplate='') 
{ 
    $bareMode = Mage::app()->getRequest()->getParam('bare'); 
    $targetTemplate = (!empty($bareTemplate) && $bareMode === '1') ? $bareTemplate : $template; 
    return parent::setTemplate($targetTemplate); 
} 

還有什麼更好的方法沒有想到?

+0

如果我們要提供「更好的方法」,這將有助於理解目的並查看期望結果的示例:)否則,任何建議可能有點泛化,是的?什麼是期望的目標?你真的想讓頁面看起來像屬於不同的主題嗎?或者您是否想要爲特定產品/類別/銷售獲得一些自定義佈局? – Kato 2012-02-01 17:53:17

+0

@Kato通過添加* bare *模板的示例及其用途編輯。 – kojiro 2012-02-01 17:58:44

+0

您是否考慮過僅通過HTTP獲取頁面並提取有用的部分?如果它只是您想要的純HTML代碼,這應該是一個很好的/簡單的答案,併爲您創建額外的模板或更換核心節省很多麻煩。 – Kato 2012-02-01 18:01:58

回答

2

獲取所需內容的關鍵是刪除作爲輸出塊,將其替換爲內容。輸出塊只是renderLayout()的入口點;

要在沒有包含路徑黑客入侵的情況下在Magento中執行此操作,請注意在基本操作控制器類中觸發的作用域事件controller_action_layout_render_before_$this->getFullActionName()(參考號Mage_Core_Controller_Varien_Action::renderLayout()方法)。

首先配置你的模型類組和前端事件觀察者。您需要確定需要此邏輯的任何路由的完整操作名稱。見Mage_Core_Controller_Varien_Action::renderLayout()。下面的示例配置。

<?xml version="1.0"?> 
<config> 
    <global> 
     <models> 
      <your_classgroup> 
       <class>Your_Classgroup_Model</class> 
      </your_classgroup> 
     </models> 
    </global> 
    <frontend> 
     <events> 
      <controller_action_layout_render_before_FULL_ACTION_NAME...> 
       <observers> 
        <your_observer_config> 
         <type>model</type> 
         <class>your_classgroup/observer</class> 
         <method>makeContentBlockTheOutputBlock</method> 
        </your_observer_config> 
       </observers> 
      </controller_action_layout_render_before_FULL_ACTION_NAME...> 
     </events> 
    </frontend> 
</config> 

事件觀察者邏輯很簡單。這樣做:

public function makeContentBlockTheOutputBlock($observer) 
{ 
    //Edit: action not passed in to this event; passed in generic generate_blocks event 
    if(Mage::app()->getRequest()->getParam('bare')) 
    { 
     Mage::app()->getLayout()->removeOutputBlock('root')->addOutputBlock('content'); 
    } 
} 

HTH。