【问题标题】:Joomla system plugin to run only if specific componentJoomla 系统插件仅在特定组件时运行
【发布时间】:2014-01-01 07:17:12
【问题描述】:

我有一个 Joomla 系统插件。它在每个页面加载时都运行,但我希望它只与特定组件一起运行。我上面有这些功能:

function __construct( $s, $c ) {}
function onAfterRoute() {} 
function onAfterDispatch() {}

有什么解决办法吗? 谢谢。

【问题讨论】:

  • 如果你的插件只需要在一个组件上运行,也许它的代码应该在组件本身。否则,请选择@MatthewBaker 的答案,将代码放在最顶部,不会触发任何事件;或将其放在每个函数中。
  • 问题是如果他真的需要onAfterDispatch那就意味着在组件启动之前就需要了。这是我想的真正问题,为什么这是一个系统插件而不是组件插件?堆栈中稍后是否有更合适的事件?

标签: plugins joomla joomla2.5


【解决方案1】:

您可以通过使用 Joomla! 的 JRequest getVar() function 并获取 option 参数来做到这一点。

JRequest::getVar('option')

如果在主页上调用,例如,将返回值“com_content”。

因此,为了帮助控制插件是否应该运行,它的函数执行一个简单的 IF 语句,如下所示。

<?php
    if( JRequest::getVar('option') === 'com_mycomponent') {
       // Run script
    }
?>

替代方法

如果您出于安全考虑不想使用JRequest,您可以使用菜单组件功能获取活动组件的名称。

<?php
    $app = JFactory::getApplication();
    $menu = $app->getMenu();
    $sActiveComponent = $menu->getActive()->component;

    if( sActiveComponent === 'com_mycomponent') {
       // Run script
    }
?>

【讨论】:

  • 没有其他选项可以完全不调用插件中的任何代码吗?谢谢。
【解决方案2】:

检查插件开始时的上下文(通常是 com_something.viewname)以防止它运行。

【讨论】:

    【解决方案3】:

    看看这个拉取请求https://github.com/joomla/joomla-cms/pull/1514。它添加了一些额外的插件参数以从缓存中包含/排除菜单项或组件。这会让你开始。可能将其作为额外选项全局添加到每个插件中是有意义的,就像现在使用模块一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2019-11-24
      • 1970-01-01
      相关资源
      最近更新 更多