2016-11-10 139 views
-1

我想重寫模塊homeslider的HomeSlide類,爲此我創建了一個文件HomeSlide.php,並將其放置在override/modules/homeslider下。我想這HomeSlide.phpPrestashop:覆蓋核心模塊類

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

是的問題是,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完成,但這不被認爲是一種好的做法。與homeslider_slides表1的關係,並使用對象模型掛鉤,以檢測插入/更新/刪除事件:;

TL DR

修改原始文件或有自定義的數據在一個單獨的表1。

0

你不能重寫模塊以同樣的方式爲類,在課堂上,你必須做到這一點使用:

class SomeClass extends SomeClassCore

但在模塊中,你必須用這樣的方式:

class BlockUserInfoOverride extends BlockUserInfo

所以你需要使用單詞覆蓋而不是核心。

入住這裏http://build.prestashop.com/howtos/module/how-to-override-modules/

+0

我重寫一個類模塊(HomeSlider)不包含安裝(homeslide.php)解決方案是不是對我的請求的解決方案之一 –