0

我需要开发一个 magento 扩展,将一些内容添加到特定页面,例如产品视图页面。更具体地说,在产品页面上,需要添加按钮/链接以将产品添加到第三方愿望清单站点。

现在我做了一些研究,目前还不完全清楚最好的方法是什么:

  1. 使用事件/观察者拦截 'core_block_abstract_to_html_after' 事件并在需要时添加我的 html
  2. 使用 app/design/frontend/base/default/layout/ 中的 local.xml 使用“参考”或“更新”标签将我的块添加到正确的页面上。但是,我可以将此 local.xml 打包到我的扩展程序中吗?如果是这样,它不会覆盖用户自己的local.xml。
  3. 使用 Magento 小部件?看起来小部件需要手动添加到管理 CMS 面板中的页面,而最好在管理配置中有一个开关来禁用或启用包含额外内容。

理想情况下,扩展的用户需要进行最小配置(或 XML 编辑),并且扩展必须与现有布局或用户所做的修改兼容。

4

1 回答 1

7

这里没有单一的答案,就像任何与软件相关的东西一样,这都是关于什么对您、您的团队和您的用户最有效的问题,这里有一些一般的经验法则。

CMS Widgets 用于内容管理。当您想要创建一个简单的用户界面时,您可以创建一个小部件,店主可以在其中创建类型化的内容,然后可以将其插入到页面中。分发需要修改页面的扩展或创建开/关功能不是一个好选择。理想的用例是 Magento 解决方案提供商创建特定的小部件和小部件工作流程,并且商店所有者内容人员更新小部件并将它们添加到页面,同时管理站点的内容。

local.xml文件用于此特定商店/主题本地的布局更新,并且需要很少的编程逻辑。local.xml您对添加to的具体提及app/design/frontend/base/default/layout对于您正在分发的扩展来说是一个特别糟糕的选择,因为一旦用户将自己的local.xml文件添加到主题中,他们就会失去它。理想的用例local.xml是为需要构建新页面或非管理内容/交互式模块的商店所有者(即与此特定 Magento 安装有长期关系)工作的开发人员。第三方扩展不应向local.xml.

分发修改现有页面的扩展的官方祝福方式是

  1. 创建一个模块
  2. 使用该模块添加的布局 xml 更新文件(参见catalog.xml核心模块中的文件)
  3. 使用布局更新 XML 文件进行更改

这为您提供与 相同的功能local.xml,但将您的代码与本地用户的系统代码分开。如果您可以添加块并仅使用布局更新 xml 文件(、、、、等)的功能来实现您的功能block,这reference是一个不错的选择。actionifconfig

最后,使用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 更新文件的好处之一是这些类型的错误在生产商店中静默失败(尽管在开发功能时同样的静默失败令人抓狂)

希望对您有所帮助,祝您好运!如有疑问,请使用可让您完成工作的技术——您以后总是可以重新考虑因素。

于 2012-12-06T17:21:54.343 回答