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') );
}
}
我在文件夹里设置了这个 override/modules 清除了缓存文件 class_index.php
当我加载我的索引页时,我希望有一个包含字符串 'hello I am an override'
的空白页
我在 1.6.0.12
编辑
我知道我可以用旧方法 'cloning' 模块,但是如果您查看 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
函数仅在声明它的 class 中可见。在这种情况下,整个情况有点像声明它 final
.
您唯一的希望是向 GitHub 提交补丁,使这些方法 protected
- 一旦模块覆盖起飞,这应该成为常见的做法。
我正在尝试覆盖 blocktopmenu.php
generateCategoriesMenu
函数
class BlocktopmenuOverride extends Blocktopmenu
{
public function generateCategoriesMenu($categories, $is_children = 0)
{
die( var_dump ('hello I am an override') );
}
}
我在文件夹里设置了这个 override/modules 清除了缓存文件 class_index.php
当我加载我的索引页时,我希望有一个包含字符串 'hello I am an override'
我在 1.6.0.12
编辑
我知道我可以用旧方法 'cloning' 模块,但是如果您查看 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
函数仅在声明它的 class 中可见。在这种情况下,整个情况有点像声明它 final
.
您唯一的希望是向 GitHub 提交补丁,使这些方法 protected
- 一旦模块覆盖起飞,这应该成为常见的做法。