我想覆盖模块homeslider的HomeSlide类,因为我创建了一个文件HomeSlide.php并将其放在override/modules/homeslider
下。我试过这个HomeSlide.php
:
class HomeSlide extends HomeSlideCore
{
public $start_date;
public $end_date;
public function __construct($id_slide = null, $id_lang = null, $id_shop = null, Context $context = null)
{
self::$definition['fields']['start_date'] = array('type' => self::TYPE_DATE, 'validate' => 'isDate');
self::$definition['fields']['end_date'] = array('type' => self::TYPE_DATE, 'validate' => 'isDate');
parent::__construct($id_slide, $id_lang, $id_shop);
}
}
但是我收到了这个错误
Class 'HomeSlideCore' not found
任何帮助将不胜感激。 感谢。
答案 0 :(得分:3)
是的问题是HomeSlide
类不是Prestashop核心类,而是模块使用的类,这意味着你不能像这样覆盖它。
最简单的方法是改变HomeSlide
类并在任何模块更新后再次更改它(这不是一个好习惯,但替代方案并不是更好)。
另一种方法是覆盖模块本身并包含HomeSlide
类的扩展版本。
扩展HomeSlide
类
require_once 'path_to_original_homeslide_class';
class MyHomeSlide extends HomeSlide
{
// Your overrides for the class
}
覆盖HomeSlider
模块
require_once 'path_to_my_homeslide_class';
class HomeSliderOverride extends HomeSlider
{
// Module method overrides
}
这种方法的问题在于,您必须将使用HomeSlide
类的模块中的每个方法复制粘贴到重写模块中,并将其替换为MyHomeSlide
。如果原始模块更新这些方法并且您必须再次重复复制粘贴过程,则可能会令人讨厌。这与改变原始类几乎完全相同,所以在这里获得的不多。
第三个选项是覆盖此模块或创建新模块并使用钩子actionDispatcher
来更改HomeClass
。
public function hookActionDispatcher()
{
// Add class definitions on every page load - add some checks if module is loaded only on certain pages
require_once 'path_to_homeslide_class';
HomeSlide::$definition['fields']['start_date'] = array('type' => ObjectModel::TYPE_DATE, 'validate' => 'isDate');
HomeSlide::$definition['fields']['end_date'] = array('type' => ObjectModel::TYPE_DATE, 'validate' => 'isDate');
}
然而,这里的一个大问题是,在运行时没有实例的情况下,没有(简单)方法可以添加非静态属性。可以使用monkey patching来完成,但这不是一种好习惯。
<强> TL; DR 强>
修改原始文件或将自定义数据放在与homeslider_slides
表的1:1关系的单独表中,并使用对象模型挂钩检测插入/更新/删除事件。
答案 1 :(得分:0)
你不能像课一样覆盖模块,在课堂上你必须使用:
class SomeClass extends SomeClassCore
但是在模块中你可以这样使用:
class BlockUserInfoOverride extends BlockUserInfo
所以你需要使用Override not core。
点击此处http://build.prestashop.com/howtos/module/how-to-override-modules/