3

我正在为一个插件开发一个插件,但不知何故我没有得到我引入的要在嵌套插件中执行的新事件。错误在哪里?

在我的简化(且无用)示例中,foo 是“主插件”,bar 是 foo 的插件。为了证明插件已执行,我只是将其名称附加到 introtext - 但这表明仅调用了 foos 事件处理程序,而未调用 bar 处理程序(但该类被构造)...

foo.php:

<?php

class plgContentFoo extends JPlugin
{

     function onContentPrepare($context,$article,$params,$limitstart)
    {
        jimport('joomla.plugin.plugin');    
        JPluginHelper::importPlugin('content');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('executingOCP', array($article));
        $article->introtext .= "<br>Executed foo.OCP";
        return true;
    }


     function executingOCP($arg)
    {
        $arg->introtext .= "<br>*a*Added foo.xOCP";
        $arg->text .= "<br>*b*Added foo.OCP";
        $arg->fulltext .= "<br>*c*Added foo.OCP";

    }
}


?>

bar.php:

<?php

class plgContentBar extends JPlugin
{

    function __construct( &$subject , $config ) {
        echo "executing bar-constructor!";
    }

    function executingOCP($arg)
    {
        $arg->introtext .= "<br>*1*Added bar.OCP";
        $arg->text .= "<br>*2*Added bar.OCP";
        $arg->fulltext .= "<br>*3*Added bar.OCP";
        return true;
    }
}
?>

bar.xml:

<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" version="1.6" method="upgrade" group="content">
<name>Content - bar - a foo-plugin!</name>
<creationDate>2013-05-30</creationDate>
<version>2.0.0.16</version>
<releaseDate>2013-05-30 12:00:58</releaseDate>
<releaseType>First public release!</releaseType>
<author>Michael Baas</author>
<authorEmail>mb@mbaas.de</authorEmail>
<authorUrl>mbaas.de</authorUrl>
<copyright>(c) 2013 Michael Baas</copyright>
<description>A plugin to handle foos events!</description>
<files>
<filename plugin="bar">bar.php</filename>
</files>
</extension>

最后是 foo.xml:

<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" version="1.6" method="upgrade" group="content">
<name>Content - foo</name>
<creationDate>2013-05-30</creationDate>
<version>2.0.0.16</version>
<releaseDate>2013-05-30 12:00:58</releaseDate>
<releaseType>First public release!</releaseType>
<author>Michael Baas</author>
<authorEmail>mb@mbaas.de</authorEmail>
<authorUrl>mbaas.de</authorUrl>
<copyright>(c) 2013 Michael Baas</copyright>
<description>foo is the "main " plugin...</description>
<files>
<filename plugin="foo">foo.php</filename>
</files>
</extension>

为了您的方便,还可以下载这些文件: http: //mbaas.de/foo.ziphttp://mbaas.de/bar.zip

更新(2013 年 6 月 6 日):为了简化调试,我制作了 bar 一个简单的内容插件,但没有效果: foo.onContentPrepare 触发 foo.executingOCP,但从未调用 bar.executingOCP。还更新了拉链!我真的希望有人可以帮助解决这个问题,并且很乐意为我正在开发的野兽提供免费许可证,以换取解决这个问题:)

4

2 回答 2

1

我认为您的代码通常很好。我认为你做错的是你打破了 Joomla 中的一些命名约定并且你的插件没有被调用。

在 bar manifest 中,您group="fooplugins"实际上创建了另一组插件(如内容、身份验证等)。所以你不能只命名你的插件plgContentBar

所以如果bar也是一个内容插件,只需将清单更改为 group="content"。如果它不是内容插件,请将类名更改为plgFoopluginsBar. 所以两个插件都应该安装在/plugins/content/

希望这可以帮助。

于 2013-06-05T17:06:55.110 回答
1

好吧,原来问题与构造函数有关!

见:https ://groups.google.com/forum/?hl=de&fromgroups=#!topic/joomla-dev-general/chUTpXCZ25g

当扩展 JPlugin 并为类使用自定义构造函数时,不要忘记调用被覆盖类的构造函数!所以我调整了 plgContentBar 的构造函数,现在一切正常:

function __construct( &$subject , $config ) {
    parent::__construct($subject, $config);
    echo "executing bar-constructor!";
}
于 2013-06-11T17:57:28.763 回答