我想为模块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/