我需要开发一个magento扩展,它会向特定页面添加一些内容,例如产品视图页面。更具体地说,在产品页面上,需要添加一个按钮/链接以将产品添加到第三方心愿单网站。
现在我做了一些研究,并不完全清楚最好的方法是什么:
理想情况下,扩展程序的用户需要进行最小配置(或XML编辑),并且扩展程序必须与现有布局或用户完成的修改兼容。
答案 0 :(得分:7)
这里没有单一的答案,就像任何与软件相关的问题都是关于什么最适合你,你的团队和你的用户的问题,但这里有一些一般的经验法则。
CMS小部件用于内容管理。当您想要创建一个简单的用户界面时,您可以创建一个小部件,其中商店所有者可以创建键入的内容,然后可以将其插入到页面中。分发需要修改页面的扩展或创建开/关功能不是一个好选择。理想的用例是Magento解决方案提供商创建特定的小部件和小部件工作流,商店所有者内容人员更新小部件并将其添加到页面,同时管理网站的内容。
local.xml
文件用于针对此特定商店/主题本地的布局更新,并且需要很少的编程逻辑。您对local.xml
添加app/design/frontend/base/default/layout
的具体提及对于您正在分发的扩展程序来说是一个特别糟糕的选择,因为用户在添加自己的local.xml
文件后会立即丢失该扩展程序一个主题。 local.xml
的理想用例是为商店所有者工作的开发人员(即与此特定Magento安装有长期关系),他们需要构建新页面或非管理内容/交互模块。第三方扩展程序不应向local.xml
添加任何内容。
分发修改现有网页的扩展程序的官方祝福方式是
catalog.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更新文件的一个好处是这些错误在生产商店中无声地失败(尽管同样的静默失败在开发某个功能时令人抓狂)
希望有所帮助,祝你好运!如果有疑问,请使用让您完成工作的技术 - 您可以随时重新考虑因素。