Php 插件安装:postflight未执行,语言文件未重新读取
我正在开发一个插件,希望在一些文本常量中使用插件id。所以我想我会做以下工作:在postflight代码中,找到插件的id并将其替换到语言文件中。为了方便地“查看”它的执行情况,我还决定最初将语言文件的扩展名命名为“inix”,并将其替换为“ini”,作为postflight的一部分。但这并没有发生,飞行后不会执行!为什么? 另外,如果您想花更多的时间进行调查,那么在处理语言文件时会出现问题,我不知道如何处理:在第一次安装之后,您会看到显示了文本COM_FOO_PLG_DESC-这个常量没有用它的值替换。如果你愿意的话。去编辑zip文件,并将.ini文件中的版本号更改为2,然后再次安装,您会注意到显示了此文本,但仍然指向V1!所以…更新后的语言文件在安装过程中不会被重新读取-我相信这应该会发生!所以我也插入了代码,将其重新加载到postflight中,但是…(见上文)它不会被执行Php 插件安装:postflight未执行,语言文件未重新读取,php,joomla,joomla3.0,Php,Joomla,Joomla3.0,我正在开发一个插件,希望在一些文本常量中使用插件id。所以我想我会做以下工作:在postflight代码中,找到插件的id并将其替换到语言文件中。为了方便地“查看”它的执行情况,我还决定最初将语言文件的扩展名命名为“inix”,并将其替换为“ini”,作为postflight的一部分。但这并没有发生,飞行后不会执行!为什么? 另外,如果您想花更多的时间进行调查,那么在处理语言文件时会出现问题,我不知道如何处理:在第一次安装之后,您会看到显示了文本COM_FOO_PLG_DESC-这个常量没有用它
整个东西都可以从 以下是一些要点: 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>
内容-富
2013-05-30
2.0.0.16
2013-05-30 12:00:58
第一次公开发布!
迈克尔·巴斯
mb@mbaas.de
mbaas.de
(c) 2013年迈克尔·巴斯
COM_FOO_PLG_DESC
foo.php
语言
foo.scriptfile.php
en GB/en-GB.plg\u content\u foo.ini
de de/de-de.plg_content_foo.ini
en GB/en-GB.plg\u content\u foo.sys.inix
de de/de-de.plg\u content\u foo.sys.inix
和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();
}
}
}
?>
首先,脚本文件的类名需要与插件的名称相关联。这意味着,如果插件是名为foo的内容插件,则类名必须是
plgcontentfoooinstallerscript
。
但是,脚本文件的类名是plgcontentcbmdughtinstallerscript
。我想你重新命名了插件,在这里显示,但错过了那一个。假设您的插件名为cbmdebug
,则类名仍然是错误的,因为它应该是plgContentCbmdebugInstallerScript
(注意大写字符)
至于加载的语言文件。在安装过程中,仅加载sys.ini文件。由于包中没有这样的文件,Joomla无法加载任何内容
旁注:你为什么还要操纵语言字符串?您是否尝试使用
JText::sprintf()
()。它允许您将插件id传递给PHP sprintf函数插入的语言字符串。首先,脚本文件的类名需要与插件的名称相关。这意味着,如果插件是名为foo的内容插件,则类名必须是plgcontentfoooinstallerscript
。
但是,脚本文件的类名是plgcontentcbmdughtinstallerscript
。我想你重新命名了插件,在这里显示,但错过了那一个。假设您的插件名为cbmdebug
,则类名仍然是错误的,因为它应该是plgContentCbmdebugInstallerScript
(注意大写字符)
至于加载的语言文件。在安装过程中,仅加载sys.ini文件。由于包中没有这样的文件,Joomla无法加载任何内容
旁注:你为什么还要操纵语言字符串?您是否尝试使用JText::sprintf()
()。它允许您将插件id传递给PHP sprintf函数插入的语言字符串。谢谢-在我构建示例时,“cbmdebug”应该被替换为“foo”,这样做之后,代码肯定会被执行!:-)sys.ini应该是在飞行后插入id后创建的。这样做的原因是我想在描述中使用该id,这样我就可以在那里sprintf。。。现在将修改我的原始脚本,看看接下来会发生什么,非常感谢您的帮助!:)谢谢-当我构建示例时,“cbmdebug”应该被替换为“foo”,这样做之后,代码肯定会被执行!:-)sys.ini应该是在飞行后插入id后创建的。这样做的原因是我想在描述中使用该id,这样我就可以在那里sprintf。。。现在将修改我的原始脚本,看看接下来会发生什么,非常感谢您的帮助!:)