Fecshop 重写功能

2018-05-24 14:21 更新

Fecshop 重写功能

主要讲述的为:在不修改原有文件(vendor/fancyecommerce下面的所有文件)
的前提下,修改任意功能,fecshop 的重写详细如下:

1. 组件(Yii2 component)重写

这个属于Yii2的范畴,一般通过配置的方式更改Yii2的组件(composer) ,譬如:

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

我可以先写一个php文件继承yii\db\Connection, 然后将class对应的文件指向我自己重写后的php文件,即可实现重写该 Yii2组件。相信这个大家基本都知道。

2. 重写模块(Yii2 module)

module是Yii2框架里面的一个概念, 譬如文件:@fecshop/app/appfront/config/modules/Customer.php文件,即可实现重写该

return [
    'customer' => [
        'class' => '\fecshop\app\appfront\modules\Customer\Module',
        'params'=> [
            'register' => [
                # 账号注册成功后,是否自动登录
                'successAutoLogin' => true, 
                # 注册登录成功后,跳转的url
                'loginSuccessRedirectUrlKey' => 'customer/account', 
                # 注册页面的验证码是否开启
                'registerPageCaptcha' => true, 

                
            ],
            ...
        ],
    ],
];

上面是模块的配置,如果你想要重构整个模块(module), 那么您可以通过上面进行配置class,指向您重写的文件。

3. 重写Services(fecshop 服务)

service的重写和组件的重写类似,譬如文件:

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

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

您新建一个class继承fecshop\services\Category ,然后在class指向您新建的文件,在您新建的class做函数 重写即可。

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

对于用户来说想要二开appfront的模板,需要修改才能满足自己的需求, 但是对fecshop就比较难办,因为fecshop升级,难免也要修改view css js也要改动 等文件,这些文件不同于php类文件的重写机制,无法通过继承重写函数 的方式进行二开模板文件, 因此就带来了矛盾冲突,fecshop参考了magento的多模板机制, 设置二开的高优先级模板路径,譬如,fecshop想要找view文件 /category/product/index.php,首先会在二开模板路径里面找,如果 找到,就不会使用fecshop的模板路径下面的/category/product/index.php 因此通过这种方式实现的模板重写。

fecshop的模板部分,以入口进行区分(appfront apphtml5等)的同时, 每一个store又是可以单独选择模板的。

模板的重写原理是通过模板路径优先级来,也就是有好几个 模板路径,分别为fecshop的模板路径【低优先级】,第三方的模板路径【中优先级】, 用户二开(二次开发)的模板路径【高优先级】,fecshop的模板路径的文件最为 全面(优先级最低),然后用户想要重写某个文件,只需要把这个文件路径复制到 二开模板路径下(包括相对文件夹路径),即可完成重写,因为 用户二开模板路径优先级最高。

下面以appfront(pc端)进行举例 说明:

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

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

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

也就是默认所有的store都是使用这里的模板,

用户二开的模板路径的定义在文件: appfront/config/fecshop_local_services/Store.php

在每一个store中,您可以看到如下的内容:

    'localThemeDir' => '@appfront/theme/terry/theme01', # 设置当前store对应的模板路径。关于多模板的方面的知识,您可以参看fecshop多模板的知识。
    'thirdThemeDir' => [],  # 第三方模板路径,数组,可以多个路径              

@appfront/theme/terry/theme01 : 为本地二开路径,优先级最高

thirdThemeDir : 第三方插件的模板路径,如果您安装了多个第三方 的插件,那么您需要按照顺序填写多个,这里是数组的方式填写。

重写模板详细举例: fecshop模板路径为:@fecshop/app/appfront/theme/base/default, 我想要重写这个view文件: @fecshop/app/appfront/theme/base/default/catalog/category/index.php

我本地store设置的模板路径为: appfront/theme/terry/theme01

因此,我创建文件

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

然后把@fecshop/app/appfront/theme/base/default/catalog/category/index.php 文件的内容复制到@appfront/theme/terry/theme01/catalog/category/index.php 中,然后修改这个文件,就完成了该文件的重写。

是不是很easy呢?

原理还是有一点小复杂,有兴趣可以参看资料:

yii2 多模板路径优先级加载view方式下- js和css 的解决

yii2 fecshop 多模板的介绍

5.翻译文件重写

Yii2本身是有多语言翻译功能,但是缺少重写机制,我进行了扩展,

对于fecshop的翻译,您可以重写fecshop原有的文件翻译: (目前后台是没有翻译的),下面以appfront进行举例:

打开文件:

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 组件进行了重写,您可以看到class改成 了fecshop的class ,另外设置了翻译文件的路径 basePaths

打开 @fecshop/app/appfront/languages ,您可以看到有很多语言的包,

打开 @fecshop/app/appfront/languages/zh_CN/appfront.php 你就会看到是一个大的配置数组,这里是fecshop的appfront 的原有的配置,下面我们来看重写的步骤:

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

你会看到如下:

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

该配置设置了本地翻译语言的路径为@appfront/languages, 并且设置了基础语言为:en_US

然后就可以打开 @appfront/languages/zh_CN/appfront.php进行重写 翻译内容了

注意: 模板的重写是文件的替换,翻译文件的重写是文件内容合并,相当于两个数组合并(merge)
如果相同的key,本地的翻译会覆盖fecshop的翻译。

6.万能重写(小万能)

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

该重写是通过Yii2的classMap机制实现的,关于classMap可以参看 类映射表Class Map

我整理的一篇关于classMap的原理文章: 通过配置的方式重写某个Yii2 文件 或第三方扩展文件

看完了上面的文章,您应该就会明白classMap是个啥玩意,下面 说一下fecshop中的使用。还是以appfront举例:

@appfront/config/YiiClassMap.php文件:

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

    
];

在代码中,我们会通过use加载其他的类, use fecshop\app\appfront\helper\test\My, 默认回去找文件 @fecshop/app/appfront/helper/test/My.php

但是如果我在classMap中进行了配置 'fecshop\app\appfront\helper\test\My' => '@appfront/helper/My.php', 那么当我在调用My类 use fecshop\app\appfront\helper\test\My, use的类就变成了 @appfront/helper/My.php,而不是@fecshop/app/appfront/helper/test/My.php, 到这里您应该明白了吧。

对于功能部分,单个文件的修改还是用classMap的方式, 在classMap做文件指向,在重写后的文件最好也要有一定的规律,便于 维护,您可以重写某个Controller,block,model,组件,services,

如果您进行整块功能替换,譬如重写某个services,某个modules ,那么就可以通过上面的方式进行。

至此,我们已经可以,在不修改fecshop代码的前提下,修改 fecshop的任意功能了。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号