這裏沒有單一的答案,就像任何與軟件相關的問題都是一個什麼對你,你的團隊和你的用戶最有效的問題,但是這裏有一些一般的經驗法則。
CMS小工具用於內容管理。當您想要創建一個簡單的用戶界面時,您可以創建一個小部件,其中商店所有者可以創建類型化的內容,然後將其插入到頁面中。分發需要修改頁面的擴展或創建開/關功能不是一個好的選擇。理想的使用案例是Magento解決方案提供商創建特定的小部件和小部件工作流,並且商店所有者內容人員在管理網站內容的同時更新小部件並將其添加到頁面。
local.xml
文件用於佈局更新本地到這個特定的商店/主題,並且需要很少的programatic邏輯。您特別提到的將local.xml
添加到app/design/frontend/base/default/layout
對於您分發的擴展程序來說是一個特別糟糕的選擇,因爲一旦用戶將其自己的local.xml
文件添加到主題中,用戶就會失去它。 local.xml
的理想用例是爲店主(即與該特定Magento安裝有長期關係)的開發人員,他們需要構建新頁面或非管理內容/交互模塊。第三方擴展不應該添加任何內容到local.xml
。
官方的祝福方式分發修改現有頁面將
- 擴展創建一個模塊
- 使用該模塊添加一個新佈局XML更新文件(見文件如核心模塊中的
catalog.xml
)
- 使用此佈局更新XML文件以進行更改
這使您在功能上與local.xml
相同,但保持您的代碼與本地用戶的系統代碼分離。如果您可以僅使用佈局更新xml文件(block
,reference
,action
,ifconfig
等)的功能來添加塊並實現您的功能,那麼這是一個不錯的選擇。
最後,使用core_block_abstract_to_html_after
觀察者。這將允許您使用純PHP添加塊。一些PHP開發人員(包括我自己)更喜歡使用此方法,因爲它比使用佈局更新xml文件更具編程透明性。使用這種方法的缺點是,如果你試圖抓住一個參考塊
$block = Mage::getSingleton('core/layout')->getBlock('some_block');
$block->setSomeMethod('foo');
和some_block
不存在,你會得到你致命PHP的錯誤調用非對象的方法。這意味着您的觀察家最終有很多像這樣的代碼
$block = Mage::getSingleton('core/layout')->getBlock('some_block');
if($block)
{
$block->setSomeMethod('foo');
}
對使用佈局XML更新文件的好處是這些類型的錯誤在生產存儲失敗默默(雖然它同樣沉默的失敗那是發瘋當發展一個功能)
希望有幫助,祝你好運!如果有疑問,請使用讓您完成工作的技巧 - 以後可以隨時重新分析。
謝謝,這實際上幫助了很多(連同你的教程)! – sgdesmet