Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Prestashop:覆盖核心模块类_Php_Prestashop_Prestashop 1.6 - Fatal编程技术网

Php Prestashop:覆盖核心模块类

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_

我想覆盖模块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
任何帮助都将不胜感激。
谢谢。

是的,问题在于
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
,但找不到覆盖ObjectModel
ps_HomeSlide.php
;我找到的唯一可行的解决方案是@drot列出的第一个解决方案:在原始
Ps_HomeSlide.php
文件中进行修改。如果有帮助,我很乐意提供更多信息。:)提前感谢您的回答。