0

我正在开发一个插件,并希望在一些文本常量中使用插件 ID。所以我想我会做以下事情:在 postflight-code 中,找到插件的 id 并在语言文件中替换它。为了轻松“查看”它的执行情况,我还决定最初使用扩展名“inix”命名语言文件,并将其替换为“ini”作为 postflight 的一部分。但这不会发生,不会执行 postflight !为什么?

此外,如果您愿意花更多时间进行调查,语言文件的处理存在问题,我不知道如何处理:在第一次安装后,您会看到显示文本 COM_FOO_PLG_DESC - 这个常量不会被它的值替换。如果你那时。去编辑 zip 并将 .ini 文件中的版本号更改为 2 并再次安装,您会注意到显示了此文本,但仍然指的是 V1!所以......在安装过程中不会重新读取更新的语言文件 - 我相信这应该发生!所以我还插入了代码以将其重新加载到 postflight 中,但是......(见上文)它没有被执行。


整个内容可以从http://mbaas.de/plg_foo.zip获取 ,这里有一些要点:

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>COM_FOO_PLG_DESC</description>
<files>
<filename plugin="foo">foo.php</filename>
<folder>language</folder>
</files>
<scriptfile>foo.scriptfile.php</scriptfile>
<languages folder="language">
<language tag="en-GB">en-GB/en-GB.plg_content_foo.ini</language>
<language tag="de-DE">de-DE/de-DE.plg_content_foo.ini</language>
<language tag="en-GB">en-GB/en-GB.plg_content_foo.sys.inix</language>
<language tag="de-DE">de-DE/de-DE.plg_content_foo.sys.inix</language>
</languages>
</extension>

和 foo.scriptfile.php:

    <?php
class plgContentcbmdebugInstallerScript
{
    public function __constructor(JAdapterInstance $adapter)
    {
    }
    static function loadLanguage() {
        $lang =& JFactory::getLanguage();
        $lang->load('plgContentfoo', JPATH_ADMINISTRATOR , null , true);
    }

    function preflight($type, $adapter)
    {
        echo "<b>prelight!</b>";
        $table        = JTable::getInstance('extension');
        if ($table->load(array('element' => 'foo', 'type' => 'plugin')))
        {
            $id=$table->extension_id;
            $arr = array(
            0=>"de-DE",
            1=>"en-GB"
            );
            foreach($arr as $iso) {
                $fl_lng = JPATH_ADMINISTRATOR  . "/language/$iso/$iso.plg_content_foo.sys.ini";
                unlink($fl_lng);
            }
        }
    }

    function postflight($type, $adapter)
    {
        echo "<b>postflight!</b>";
        $table        = JTable::getInstance('extension');
        if ($table->load(array('element' => 'foo', 'type' => 'plugin')))
        {
            $id=$table->extension_id;
            $arr = array(
            0=>"de-DE",
            1=>"en-GB"
            );
            foreach($arr as $iso) {
                $fl_lngx = JPATH_PLUGINS  . "/content/cbmdebug/language/$iso/$iso.plg_content_foo.sys.inix";
                $fl_lng = JPATH_ADMINISTRATOR  . "/language/$iso/$iso.plg_content_cbmdebug.sys.ini";
                $xx = file_get_contents($fl_lngx);
                $xx = str_replace("tHiS-Id",$id,$xx);
                file_put_contents($fl_lng,$xx);
                unlink($fl_lngx);
            }
            self::loadLanguage();
        }
    }
}
?>
4

1 回答 1

4

首先,脚本文件的类名需要与插件的名称相关。这意味着如果插件是名为 foo 的内容插件,则类名必须是plgContentFooInstallerScript. 但是,您的脚本文件的类名是plgContentcbmdebugInstallerScript. 我认为您将插件重命名为在此处显示,但错过了该插件。假设您的插件名为cbmdebug,则类名仍然应该是错误的plgContentCbmdebugInstallerScript(注意大写字符)。

至于加载的语言文件。在安装过程中,仅加载 sys.ini 文件。由于您的包中没有这样的文件,因此 Joomla 无法加载任何内容。

旁注:您为什么还要尝试操作语言字符串?您是否尝试使用JText::sprintf()http://api.joomla.org/Joomla-Platform/Language/JText.html#sprintf)。它允许您将插件 ID 传递给 PHP sprintf 函数插入的语言字符串。

于 2013-05-31T13:40:29.463 回答