Prestashop:覆盖核心模块类

时间:2016-11-10 18:03:12

标签: 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_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

任何帮助将不胜感激。 感谢。

2 个答案:

答案 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/