Prestashop переопределить функцию Blocktopmenu

Я пытаюсь переопределить generateCategoriesMenu функция от blocktopmenu.php

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

редактировать

Я знаю, что могу сделать это старым способом, «клонируя» модуль, но есть новый недокументированный скрытый способ в prestashop, если вы посмотрите в module.php, эта функция ясно говорит о том, что мы можем переопределить модуль.

    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 я не могу переопределить нужную функцию?

Надеюсь, я дал понять сейчас.

2

Решение

Я посмотрел на это снова,

это может быть потому, что родительские функции private :

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

Как Вам известно, private функции видны только в том классе, в котором он был объявлен. В этом случае вся ситуация работает как объявление final,

Ваша единственная надежда — отправить патч на GitHub с этими методами. protected — это должно стать обычной практикой после того, как модуль переопределен.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]