Fecmall-module模块部分

Fecmall module模块,本质就是yii2框架的module

Fecmall-module模块

您可以在应用扩展插件的config.php文件,各个入口的config部分,加入modules的配置

譬如Appfront入口:

'appfront' => [
    'enable' => true,
    'config' => [
        'modules' => [
            // 1. coupon module 配置
            'coupon' => [
                'class' => '\fecyo\app\appfront\modules\Coupon\Module',
            ],
            // 2.checkout modules,重写(或者新建)fecmall checkout模块的某个controller
            'checkout' => [
                'controllerMap' => [
                    'cartinfo' => 'fecyo\app\appfront\modules\Checkout\controllers\CartInfoController',          
                ],
            ],
        ],
    ],
],

新建module

1.在 modules config 里面加入相关配置,譬如:

'coupon' => [
    'class' => '\fecyo\app\appfront\modules\Coupon\Module',
],

2.新建模块class文件@fecyo\app\appfront\modules\Coupon\Module.php

<?php
/**
 * FecShop file.
 *
 * @link http://www.fecshop.com/
 * @copyright Copyright (c) 2016 FecShop Software LLC
 * @license http://www.fecshop.com/license/
 */

namespace fecyo\app\appfront\modules\Coupon;

use fecshop\app\appfront\modules\AppfrontModule;
use Yii;

/**
 * @author Terry Zhao <2358269014@qq.com>
 * @since 1.0
 * Catalog Module 模块
 */
class Module extends AppfrontModule
{
    public $blockNamespace;

    public function init()
    {
        parent::init();
        // 以下代码必须指定
        $nameSpace = __NAMESPACE__;
        // 如果 Yii::$app 对象是由类\yii\web\Application 实例化出来的。
        if (Yii::$app instanceof \yii\web\Application) {
            // 设置模块 controller namespace的文件路径
            $this->controllerNamespace = $nameSpace . '\\controllers';
            // 设置模块block namespace的文件路径
            $this->blockNamespace = $nameSpace . '\\block';
        
        }
        
        /// 设置该模块的view(theme)的默认layout文件。
        Yii::$service->page->theme->layoutFile = 'main.php';
        
    }
}


对于各个入口的module,有一些细微的差别,您可以去fecmall里面找一个配置文件,复制过来即可, 譬如,对于appfront里面的,可以在appfront里面复制一个模块的class文件,然后改改路径即可

对于此例子,init函数的内容,您不需要进行改动,如果想设置view layout文件,可以将main.php改成您自己的文件即可

3.新建controllers和block文件夹

fecyo\app\appfront\modules\Coupon\controllers\
fecyo\app\appfront\modules\Coupon\block\

然后在里面新建相应的controller和block即可,具体您可以参看一下fecmall里面的实现

4.在模板路径里面新建相应的theme view文件即可

在已有的module中添加新的controller,或者覆盖已有的controller

当fecmall已经有了Checkout,您想在该模块里面添加新的controller文件,或者重写已有的, 可以通过controllerMap机制来实现

'checkout' => [
    'controllerMap' => [
        'cartinfo' => 'fecyo\app\appfront\modules\Checkout\controllers\CartInfoController',          
    ],
],

1.如果fecmall源码中的Checkout模块,已经存在CartInfoController,则会进行重写操作

2.如果fecmall源码中的Checkout模块,不存在CartInfoController,则相当于添加新的controller文件

controller和block

1.关于controller和block的关系,您可以参看文档:Fecmall 架构

2.关于函数$this->getBlock()

controller一般通过代码 $data = $this->getBlock()->getLastData(); , 来获取block的数据 ,$this->getBlock()默认对应的文件,就是block文件夹里面的文件。

譬如:

// 用户购物车页面进入下单页面,如果用户没有货运地址,那么进入该页面进行货运地址的add
public function actionAddressadd()
{
    Yii::$service->page->theme->layoutFile = 'one_step_checkout.php';
    $data = $this->getBlock()->getLastData();
    return $this->render($this->action->id, $data);
}

./controllers/CartinfoController里面的 actionAddressadd 方法里面执行 $this->getBlock(),对应的block文件 就是 ./block/cartinfo/Addressadd.php ,可以看出命名和文件的对应关系,然后在 ./block/cartinfo/Addressadd.php里面实现getLastData()函数就可以了。

关于 $this->getBlock()函数的具体代码,可以参看: https://github.com/fecshop/yii2_fecshop/blob/master/app/appfront/modules/AppfrontController.php#L64

3.重写block文件

重写block文件有2种:

3.1通过重写controller文件的方式重写block文件,这种方式适合您需要吧controller里面的所有方法都重写

在controller类里面,加入类变量,如下:

public $blockNamespace = 'fecyo\app\appfront\modules\Checkout\block';

当controller里面的函数执行$this->getBlock(),对应的将是新的block文件路径,具体原理您可以参看$this->getBlock()的代码。

这样,您在应用扩展文件夹里面,新建新的block文件即可。

3.2通过fecRewriteMap

这种方式适合只对模块里面的某个block文件进行重写

// 1.appfront层
'appfront' => [
    // appfront入口的开关,如果false,则会失效
    'enable' => true,
    'config' => [
        // 重写model和block
        'fecRewriteMap' => [
            '\fecshop\app\appfront\modules\Cms\block\home\Index'  => '\fectfurnilife\app\appfront\modules\Cms\block\home\Index',
            '\fecshop\app\appfront\modules\Customer\block\address\Edit'  => '\fectfurnilife\app\appfront\modules\Customer\block\address\Edit',
        ],
    ],
],

左边的fecmall的block文件路径,右边是重写后的block文件路径,您按照这个格式对应好即可, 重写的block文件类继承于fecmall block 类, 然后重写里面相应的函数即可。

参考资料:通过rewriteMap进行重写Block Model 层

至此,fecmall的模块部分基本完成

参考学习资料:

Fecmall 在现有的modules上面开发新controller

Fecmall 本地新建modules,开发新功能

Fecmall appadmin 本地增加一个modules例子

Yii2框架模块知识点