Fecshop 重寫功能

2018-05-24 14:21 更新

Fecshop 重寫功能

主要講述的為:在不修改原有文件(vendor/fancyecommerce下面的所有文件)
的前提下,修改任意功能,fecshop 的重寫詳細(xì)如下:

1. 組件(Yii2 component)重寫

這個(gè)屬于Yii2的范疇,一般通過(guò)配置的方式更改Yii2的組件(composer) ,譬如:

'components' => [
        'db' => [ 
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=fecshop',
            'username' => 'root',
            'password' => 'fd#Ed49lpafdfgeaFs2$d',
            'charset' => 'utf8',
        ],

我可以先寫一個(gè)php文件繼承yii\db\Connection, 然后將class對(duì)應(yīng)的文件指向我自己重寫后的php文件,即可實(shí)現(xiàn)重寫該 Yii2組件。相信這個(gè)大家基本都知道。

2. 重寫模塊(Yii2 module)

module是Yii2框架里面的一個(gè)概念, 譬如文件:@fecshop/app/appfront/config/modules/Customer.php文件,即可實(shí)現(xiàn)重寫該

return [
    'customer' => [
        'class' => '\fecshop\app\appfront\modules\Customer\Module',
        'params'=> [
            'register' => [
                # 賬號(hào)注冊(cè)成功后,是否自動(dòng)登錄
                'successAutoLogin' => true, 
                # 注冊(cè)登錄成功后,跳轉(zhuǎn)的url
                'loginSuccessRedirectUrlKey' => 'customer/account', 
                # 注冊(cè)頁(yè)面的驗(yàn)證碼是否開啟
                'registerPageCaptcha' => true, 

                
            ],
            ...
        ],
    ],
];

上面是模塊的配置,如果你想要重構(gòu)整個(gè)模塊(module), 那么您可以通過(guò)上面進(jìn)行配置class,指向您重寫的文件。

3. 重寫Services(fecshop 服務(wù))

service的重寫和組件的重寫類似,譬如文件:

@fecshop/config/services/Category.php文件

return [
    'category' => [
        'class' => 'fecshop\services\Category',
        # 子服務(wù)
        'childService' => [
            'product' => [
                'class' => 'fecshop\services\category\Product',
            ],
            'menu' => [
                'class' => 'fecshop\services\category\Menu',
                //'rootCategoryId' => 0,
            ],
    ...

您新建一個(gè)class繼承fecshop\services\Category ,然后在class指向您新建的文件,在您新建的class做函數(shù) 重寫即可。

4. 重寫fecshop的模板(view js css等)

對(duì)于用戶來(lái)說(shuō)想要二開appfront的模板,需要修改才能滿足自己的需求, 但是對(duì)fecshop就比較難辦,因?yàn)閒ecshop升級(jí),難免也要修改view css js也要改動(dòng) 等文件,這些文件不同于php類文件的重寫機(jī)制,無(wú)法通過(guò)繼承重寫函數(shù) 的方式進(jìn)行二開模板文件, 因此就帶來(lái)了矛盾沖突,fecshop參考了magento的多模板機(jī)制, 設(shè)置二開的高優(yōu)先級(jí)模板路徑,譬如,fecshop想要找view文件 /category/product/index.php,首先會(huì)在二開模板路徑里面找,如果 找到,就不會(huì)使用fecshop的模板路徑下面的/category/product/index.php 因此通過(guò)這種方式實(shí)現(xiàn)的模板重寫。

fecshop的模板部分,以入口進(jìn)行區(qū)分(appfront apphtml5等)的同時(shí), 每一個(gè)store又是可以單獨(dú)選擇模板的。

模板的重寫原理是通過(guò)模板路徑優(yōu)先級(jí)來(lái),也就是有好幾個(gè) 模板路徑,分別為fecshop的模板路徑【低優(yōu)先級(jí)】,第三方的模板路徑【中優(yōu)先級(jí)】, 用戶二開(二次開發(fā))的模板路徑【高優(yōu)先級(jí)】,fecshop的模板路徑的文件最為 全面(優(yōu)先級(jí)最低),然后用戶想要重寫某個(gè)文件,只需要把這個(gè)文件路徑復(fù)制到 二開模板路徑下(包括相對(duì)文件夾路徑),即可完成重寫,因?yàn)?用戶二開模板路徑優(yōu)先級(jí)最高。

下面以appfront(pc端)進(jìn)行舉例 說(shuō)明:

appfront入口的模板路徑的配置是在:

@fecshop/app/appfront/config/params.php

'appfrontBaseTheme'     => '@fecshop/app/appfront/theme/base/front',

也就是默認(rèn)所有的store都是使用這里的模板,

用戶二開的模板路徑的定義在文件: appfront/config/fecshop_local_services/Store.php

在每一個(gè)store中,您可以看到如下的內(nèi)容:

    'localThemeDir' => '@appfront/theme/terry/theme01', # 設(shè)置當(dāng)前store對(duì)應(yīng)的模板路徑。關(guān)于多模板的方面的知識(shí),您可以參看fecshop多模板的知識(shí)。
    'thirdThemeDir' => [],  # 第三方模板路徑,數(shù)組,可以多個(gè)路徑              

@appfront/theme/terry/theme01 : 為本地二開路徑,優(yōu)先級(jí)最高

thirdThemeDir : 第三方插件的模板路徑,如果您安裝了多個(gè)第三方 的插件,那么您需要按照順序填寫多個(gè),這里是數(shù)組的方式填寫。

重寫模板詳細(xì)舉例: fecshop模板路徑為:@fecshop/app/appfront/theme/base/default, 我想要重寫這個(gè)view文件: @fecshop/app/appfront/theme/base/default/catalog/category/index.php

我本地store設(shè)置的模板路徑為: appfront/theme/terry/theme01

因此,我創(chuàng)建文件

appfront/theme/terry/theme01/catalog/category/index.php

然后把@fecshop/app/appfront/theme/base/default/catalog/category/index.php 文件的內(nèi)容復(fù)制到@appfront/theme/terry/theme01/catalog/category/index.php 中,然后修改這個(gè)文件,就完成了該文件的重寫。

是不是很easy呢?

原理還是有一點(diǎn)小復(fù)雜,有興趣可以參看資料:

yii2 多模板路徑優(yōu)先級(jí)加載view方式下- js和css 的解決

yii2 fecshop 多模板的介紹

5.翻譯文件重寫

Yii2本身是有多語(yǔ)言翻譯功能,但是缺少重寫機(jī)制,我進(jìn)行了擴(kuò)展,

對(duì)于fecshop的翻譯,您可以重寫fecshop原有的文件翻譯: (目前后臺(tái)是沒(méi)有翻譯的),下面以appfront進(jìn)行舉例:

打開文件:

fecshop/app/appfront/config/appfront.php

您可以看到如下配置:

'components' => [
        # language config.
        'i18n' => [
            'translations' => [
                'appfront' => [
                    //'class' => 'yii\i18n\PhpMessageSource',
                    'class' => 'fecshop\yii\i18n\PhpMessageSource',
                    'basePaths' => [
                        '@fecshop/app/appfront/languages',
                    ],
                ],
            ],
        ],

首先將Yii2 i18n 組件進(jìn)行了重寫,您可以看到class改成 了fecshop的class ,另外設(shè)置了翻譯文件的路徑 basePaths。

打開 @fecshop/app/appfront/languages ,您可以看到有很多語(yǔ)言的包,

打開 @fecshop/app/appfront/languages/zh_CN/appfront.php 你就會(huì)看到是一個(gè)大的配置數(shù)組,這里是fecshop的appfront 的原有的配置,下面我們來(lái)看重寫的步驟:

打開文件:@appfront/config/main.php

你會(huì)看到如下:

'i18n' => [
            'translations' => [
                'appfront' => [
                    'basePaths' => [
                        '@appfront/languages',
                    ],
                    'sourceLanguage' => 'en_US', # 如果 en_US 也想翻譯,那么可以改成en_XX。
                ],
            ],
        ],

該配置設(shè)置了本地翻譯語(yǔ)言的路徑為@appfront/languages, 并且設(shè)置了基礎(chǔ)語(yǔ)言為:en_US

然后就可以打開 @appfront/languages/zh_CN/appfront.php進(jìn)行重寫 翻譯內(nèi)容了

注意: 模板的重寫是文件的替換,翻譯文件的重寫是文件內(nèi)容合并,相當(dāng)于兩個(gè)數(shù)組合并(merge)
如果相同的key,本地的翻譯會(huì)覆蓋fecshop的翻譯。

6.萬(wàn)能重寫(小萬(wàn)能)

不支持:模板部分和翻譯部分

該重寫是通過(guò)Yii2的classMap機(jī)制實(shí)現(xiàn)的,關(guān)于classMap可以參看 類映射表Class Map

我整理的一篇關(guān)于classMap的原理文章: 通過(guò)配置的方式重寫某個(gè)Yii2 文件 或第三方擴(kuò)展文件

看完了上面的文章,您應(yīng)該就會(huì)明白classMap是個(gè)啥玩意,下面 說(shuō)一下fecshop中的使用。還是以appfront舉例:

@appfront/config/YiiClassMap.php文件:

<?php
return [
    //'fecshop\app\appfront\helper\test\My' => '@appfront/helper/My.php',   

    
];

在代碼中,我們會(huì)通過(guò)use加載其他的類, use fecshop\app\appfront\helper\test\My, 默認(rèn)回去找文件 @fecshop/app/appfront/helper/test/My.php

但是如果我在classMap中進(jìn)行了配置 'fecshop\app\appfront\helper\test\My' => '@appfront/helper/My.php', 那么當(dāng)我在調(diào)用My類 use fecshop\app\appfront\helper\test\My, use的類就變成了 @appfront/helper/My.php,而不是@fecshop/app/appfront/helper/test/My.php, 到這里您應(yīng)該明白了吧。

對(duì)于功能部分,單個(gè)文件的修改還是用classMap的方式, 在classMap做文件指向,在重寫后的文件最好也要有一定的規(guī)律,便于 維護(hù),您可以重寫某個(gè)Controller,block,model,組件,services,

如果您進(jìn)行整塊功能替換,譬如重寫某個(gè)services,某個(gè)modules ,那么就可以通過(guò)上面的方式進(jìn)行。

至此,我們已經(jīng)可以,在不修改fecshop代碼的前提下,修改 fecshop的任意功能了。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)