2011-03-07 51 views
2

如何在Magento中的「頭部」部分動態加載樣式表僅在包含自定義Widget的頁面上?僅在Widget頁面上加載樣式表

對於我的劇本我這樣做:

if($this->getLayout()->getBlock('namespace_module_scripts')==false) { 
    $block = $this->getLayout() 
     ->createBlock('core/template', 'namespace_module_scripts') 
     ->setTemplate('namespace/module/scripts.phtml'); 
    $this->getLayout()->getBlock('before_body_end')->insert($block); 
} 

這是_prepareLayout()在我的Widget塊類中的當前內容。我嘗試使用相同的方法進行樣式設置,將before_body_end替換爲head,這對於放置Widget實例或將塊手動放置在我的佈局xml中非常有用,但是當在頁面內容中插入小部件內聯時,頭部部分似乎先前已渲染到Widget,因此我的樣式模板不能插入到頭部塊中。

我的(希望)臨時解決方案是加載我的佈局xml中的每個頁面上的樣式。有一個更好的方法嗎?

回答

2

它看起來像你SOL與您通過

{{widget...}}} 

標記插入到CMS的網頁小部件。與實例不同,或者通過Package Layout XML更新文件直接添加它,Magento似乎即時渲染這些塊。也就是說,直到toHtml在Magento實例化{{widget...}}塊的CMS內容塊上被調用。到那時頭塊已經渲染,並以編程方式操作它不再有任何效果。

這是我要採取的方法。這聽起來加入JavaScript仍然有效(這是有道理的,因爲CMS內容塊將在before_body_end塊之前呈現。)研究loading CSS files via Javascript的技術(舊鏈接,如果你想要某些網頁2j谷歌周圍)。這樣你可以添加一個可以添加CSS文件的JavaScript塊。這樣所有的代碼仍然侷限於小部件,並且您仍然可以驗證html輸出。這是一種非常常見的技術。

其它方法包括

  1. 只需添加您的樣式到文檔內聯。不好的HTML實踐和所有這些(風格不在腦海中),但你不會是第一個這樣做的人。

  2. 有一個塊是總是添加到頭,幷包含條件渲染邏輯。在渲染之前,讓它檢查小部件的佈局對象(通過類型),或者檢查此請求是否適用於CMS頁面,並且檢查CMS頁面的內容({{widget...}})是否適合渲染您的小部件。如果其中任何一個都是真的,那麼就渲染CSS鏈如果不是,鏈接不會呈現。

+0

謝謝艾倫,我有一種感覺,你會成爲回答這個問題的人。我希望我可以用Observer做些事情,但是沒有成功(可能是因爲我無法在加載頭文件之前過濾toHtml的輸出)。加載樣式與JS可能是一個選項,謝謝。 – bhamrick 2011-03-07 20:32:22

+0

事件也是可能的。在更新紅色事件之前或之後(或佈局的加載後)掛鉤到頁面塊之一,並按照#2中的建議進行操作。你在哪裏掛鉤取決於你,但總的想法(如果你不想要javascript方法)是檢查系統的狀態,確定你的小部件是否或將會在那裏然後[做些什麼]添加樣式。 – 2011-03-07 22:09:47

+0

好的,是的,工作。謝謝。 – bhamrick 2011-03-07 23:33:28

相關問題