【问题标题】:Fatal error: Call to a member function update() on null致命错误:在 null 上调用成员函数 update()
【发布时间】:2015-04-07 15:02:52
【问题描述】:

我正在一个名为 Ilias 的学习管理系统上安装一个插件。它已正确安装,但是当我尝试对其进行更新以使其处于活动状态时,会出现以下致命错误:

“致命错误:在 C:\xampp\htdocs\ilias\Services\Component\classes\class.ilObjComponentSettingsGUI.php 的第 520 行调用 null 上的成员函数 update()”

指的是这段代码:

function updatePlugin()
{
    include_once("./Services/Component/classes/class.ilPlugin.php");
    $pl = ilPlugin::getPluginObject($_GET["ctype"], $_GET["cname"],
        $_GET["slot_id"], $_GET["pname"]);

    $result = $pl->update();

    if ($result !== true)
    {
        ilUtil::sendFailure($pl->message, true);
    }
    else
    {
        ilUtil::sendSuccess($pl->message, true);
    }

提到的行是这一行:

$result = $pl->update();

这是“包含”的文件代码:

    <?php

    abstract class ilPluginConfigGUI

{
    protected $plugin_object = null;

    /**
     * Set plugin object
     *
     * @param   object  plugin object
     */
    final function setPluginObject($a_val)
    {
        $this->plugin_object = $a_val;
    }

    /**
     * Get plugin object
     *
     * @return ilPlugin  object
     */
    public final function getPluginObject()
    {
        return $this->plugin_object;
    }

    /**
     * Execute command
     *
     * @param
     * @return
     */
    function executeCommand()
    {
        global $ilCtrl, $ilTabs, $lng, $tpl;

        $ilCtrl->setParameterByClass("ilobjcomponentsettingsgui", "ctype", $_GET["ctype"]);
        $ilCtrl->setParameterByClass("ilobjcomponentsettingsgui", "cname", $_GET["cname"]);
        $ilCtrl->setParameterByClass("ilobjcomponentsettingsgui", "slot_id", $_GET["slot_id"]);
        $ilCtrl->setParameterByClass("ilobjcomponentsettingsgui", "plugin_id", $_GET["plugin_id"]);
        $ilCtrl->setParameterByClass("ilobjcomponentsettingsgui", "pname", $_GET["pname"]);

        $tpl->setTitle($lng->txt("cmps_plugin").": ".$_GET["pname"]);
        $tpl->setDescription("");

        $ilTabs->clearTargets();

        if($_GET["plugin_id"])
        {
            $ilTabs->setBackTarget(
                $lng->txt("cmps_plugin"),
                $ilCtrl->getLinkTargetByClass("ilobjcomponentsettingsgui", "showPlugin")
            );
        }
        else
        {
            $ilTabs->setBackTarget(
                $lng->txt("cmps_plugins"),
                $ilCtrl->getLinkTargetByClass("ilobjcomponentsettingsgui", "listPlugins")
            );
        }

        $this->performCommand($ilCtrl->getCmd("configure"));

    }

    abstract function performCommand($cmd);
}
?>

我不明白这个错误,因为我没有更改任何代码并且所有这些文件都包含在插件中。希望有人能指出我的错误,谢谢!

更新

protected function beforeUpdate()
{
    return true;    // false would indicate that anything went wrong
    // update would not proceed
    // throw an exception in this case
    //throw new ilPluginException($lng->txt(""));
}

/**
 * After update processing
 */
protected function afterUpdate()
{
}

/**
 * Get plugin object.
 *
 * @param   string  $a_ctype    IL_COMP_MODULE | IL_COMP_SERVICE
 * @param   string  $a_cname    component name
 * @param   string  $a_sname    plugin slot name
 * @param   string  $a_pname    plugin name
 */
final static function getPluginObject($a_ctype, $a_cname, $a_slot_id, $a_pname)
{
    global $ilDB;

    include_once("./Services/Component/classes/class.ilPluginSlot.php");
    $slot_name = ilPluginSlot::lookupSlotName($a_ctype, $a_cname, $a_slot_id);

    $cached_component = ilCachedComponentData::getInstance();
    $rec = $cached_component->lookCompId($a_ctype, $a_cname);
    if (! $rec) {
        return NULL;
    } 

【问题讨论】:

  • 表示这个ilPlugin::getPluginObject正在返回null
  • $pl = ilPlugin::getPluginObject($_GET["ctype"], $_GET["cname"], $_GET["slot_id"], $_GET["pname"]); 行上,ilPlugin::getPluginObject(...) 返回的值为 null,这可能是请求中传递的查询字符串的结果。您能否提供有关请求中传递的内容的更多信息?
  • @Bonner 我在ilPlugin.php 文件。这可能是问题所在?
  • $_GET["ctype"] 等来自请求,即如果我访问http://www.google.co.uk/?q=test,则$_GET['q'] 的值将是test,因此您需要检查这些值是否已传入请求。
  • @Bonner 我想我找到了问题所在。我用 ilPlugin 类的一部分更新了这个问题。会不会是注释掉的部分有问题?

标签: php plugins ilias


【解决方案1】:

您的问题由输出中的以下项目指示(请参阅 cmets):

$_GET["pname"] --> string(26) "SystemNotifications-master"

可能通过从 GIT-Repo 签出,您创建了一个名为“SystemNotifications-master”的文件夹。这与插件文件夹在 ILIAS 中必须具有的命名约定不匹配,在这种情况下可能是:“SystemNotifications”。它必须匹配部分 php 插件类(可能类似于 ilSystemNotificationsPlugin)。

无论如何,不​​要改变ILIAS的核心代码。问题肯定不存在,而是在您的文件系统/数据库中。

【讨论】:

  • 非常感谢!确实删除“-master”部分就足够了。我现在可以更新和激活它了。
  • 由于这个问题不属于上一个问题,我认为最好尝试在stackoverflow中制定全新的问题。
  • 这样做了!标题是“开发 ILIAS 插件”。
猜你喜欢
  • 2018-06-22
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多