Php Prestashop:覆盖核心模块类
我想覆盖模块homeslider的HomeSlide类,为此我创建了一个文件HomeSlide.php,并将其放在Php Prestashop:覆盖核心模块类,php,prestashop,prestashop-1.6,Php,Prestashop,Prestashop 1.6,我想覆盖模块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_
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
任何帮助都将不胜感激。
谢谢。是的,问题在于
HomeSlide
类不是一个Prestashop核心类,而是一个由模块使用的类,这意味着您不能像这样重写它
最简单的方法是只修改HomeSlide
类,并在任何模块更新后再次修改它(这不是一个好的做法,但替代方法也不是更好)
另一种方法是重写模块本身并包含扩展版本的HomeSlide
类
扩展的HomeSlide
类
require_once'path_to_original_homeslide_class';
类MyHomeSlide扩展了HomeSlide
{
//您对该类的重写
}
覆盖的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');
}
然而,这里的一个大问题是,在运行时没有实例的情况下,无法(简单)添加非静态属性。这可以通过使用来完成,但这不是一个好的做法
TL;DR
修改原始文件或将自定义数据与
homeslider_幻灯片
表格以1:1的比例放在单独的表格中,并使用对象模型挂钩检测插入/更新/删除事件 您不能以与类相同的方式重写模块,在类中,您必须使用:
class-SomeClass扩展了SomeClassCore
但在模块中,您必须使用以下方法:
class BlockUserInfoOverride扩展了BlockUserInfo
所以你需要使用单词覆盖而不是核心
检查这里我正在覆盖模块(HomeSlider)中的类,而不是包含安装的类(homeslide.php)。您的解决方案不是我请求的解决方案。嗨,我知道这个主题很老,但我正在尝试实现几乎相同的目标,我想知道4年后,是否还有其他更好的方法?我成功地覆盖了
ps_imagesslider.php
,但找不到覆盖ObjectModelps_HomeSlide.php
;我找到的唯一可行的解决方案是@drot列出的第一个解决方案:在原始Ps_HomeSlide.php
文件中进行修改。如果有帮助,我很乐意提供更多信息。:)提前感谢您的回答。