Prestashop覆盖Blocktopmenu功能


Prestashop override Blocktopmenu function

我正试图从blocktopmenu.php 覆盖generateCategoriesMenu函数

class BlocktopmenuOverride extends Blocktopmenu
{
  public function generateCategoriesMenu($categories, $is_children = 0)
    {
            die( var_dump ('hello I am an override') );
    }
}

我已经在文件夹中设置了覆盖/模块清除缓存文件class_index.php

当我加载索引页时,我希望有一个带有字符串'hello I am an override' 的空白页

我的是1.6.0.12

编辑

我知道我可以用旧的方式"克隆"模块,但如果你在module.php中查看,prestashop中有一种新的未记录的隐藏方式,这个函数清楚地表明我们可以覆盖模块。

    public static function getInstanceByName($module_name)
{
    if (!Validate::isModuleName($module_name))
    {
        if (_PS_MODE_DEV_)
            die(Tools::displayError(Tools::safeOutput($module_name).' is not a valid module name.'));
        return false;
    }
    if (!isset(self::$_INSTANCE[$module_name]))
    {
        if (Tools::file_exists_no_cache(_PS_MODULE_DIR_.$module_name.'/'.$module_name.'.php'))
        {
            include_once(_PS_MODULE_DIR_.$module_name.'/'.$module_name.'.php');
            if (Tools::file_exists_no_cache(_PS_OVERRIDE_DIR_.'modules/'.$module_name.'/'.$module_name.'.php'))
            {
                include_once(_PS_OVERRIDE_DIR_.'modules/'.$module_name.'/'.$module_name.'.php');
                $override = $module_name.'Override';
                if (class_exists($override, false))
                    return self::$_INSTANCE[$module_name] = new $override;
            }
            if (class_exists($module_name, false))
                return self::$_INSTANCE[$module_name] = new $module_name;
        }
        return false;
    }
    return self::$_INSTANCE[$module_name];
}

我已经成功地覆盖了其他模块,没有问题,

如果我对父函数进行注释,这种覆盖会起作用,但这会使覆盖变得毫无意义。

为什么使用blocktopmenu我无法覆盖所需的功能?

我希望我现在说清楚了。

我又看了一眼,

这可能是因为父函数是private:

private function generateCategoriesMenu($categories, $is_children = 0)

正如您所知,private函数仅在声明它的类中可见。在这种情况下,整个情况有点像声明它为final

你唯一的希望是向GitHub提交一个补丁,使这些方法成为protected-一旦模块覆盖开始,这应该成为常见的做法。