prestshop:覆盖核心模块类


Prestashop: override core module class

我想为模块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';
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');
}

然而,这里的一个大问题是,没有(简单的)方法可以在运行时没有实例的情况下添加非静态属性。这可以通过猴子补丁来完成,但这不是一个好的做法。

TL;博士

修改原始文件或将自定义数据与homeslider_slides表以1:1的关系放在单独的表中,并使用对象模型钩子来检测插入/更新/删除事件。

你不能像类一样重写模块,在类中你必须使用:

class SomeClass extends SomeClassCore

但是在模块中你可以这样使用:

class BlockUserInfoOverride extends BlockUserInfo

所以你需要使用单词Override而不是Core

点击这里http://build.prestashop.com/howtos/module/how-to-override-modules/