簡體   English   中英

Prestashop:覆蓋核心模塊類

[英]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 如果原始模塊更新了這些方法,並且您不得不再次重復復制粘貼過程,可能會很麻煩。 這與更改原始類幾乎相同,因此在這里沒有太多收獲。

第三個選項是重寫此模塊或創建一個新模塊,並使用hook 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_slides表以1:1關系homeslider_slides在單獨的表中,並使用對象模型掛鈎檢測插入/更新/刪除事件。

您不能以與類相同的方式覆蓋模塊,在類中您必須使用以下方法:

class SomeClass extends SomeClassCore

但是在模塊中,您可以使用這種方式:

class BlockUserInfoOverride extends BlockUserInfo

因此您需要使用Override而不是Core一詞。

在這里檢查http://build.prestashop.com/howtos/module/how-to-override-modules/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM