Fecmall-administer插件安装,升级,卸载部分

扩展插件,在安装,升级,卸载等操作,进行sql安装,图片文件复制等初始化操作

Fecmall-administer文件部分

当您通过gii工具初始化生成扩展插件,进入到 ./addons/您的package包名/您的插件名/administer/ 就可以看到三个文件

  • Install.php (安装部分)

  • Uninstall.php (卸载部分)

  • Upgrade.php (升级部分)

相关资料: Fecmall-应用安装和加载原理

Install.php

扩展插件的安装部分,插件第一次安装的时候,会执行该文件里面的run()方法, 进行插件初始化

1.Install.php 例子

<?php
/**
 * Fecmall Addons
 */
namespace fectestst\administer;
use Yii;
/**
 * 应用安装类
 * 您可以在这里添加类变量,在配置中的值可以注入进来。
 */
class Install implements \fecshop\services\extension\InstallInterface
{
    // 安装初始版本号,不需要改动,不能为空
    public $version = '1.0.0';
    // 类变量,在config.php中可以通过配置注入值
    public $test;
    
    /**
     * @return mixed|void
     */
    public function run()
    {
        if (!$this->installDbSql()) {
            return false;
        }
        if (!$this->copyImageFile()) {
            return false;
        }
        
        return true;
    }
    
    /**
     * 进行数据库的初始化
     * sql语句执行,多个sql用分号  `;`隔开
     */
    public function installDbSql()
    {
        
        $db = Yii::$app->getDb();
        // 修改表sql
        $sql =  "ALTER TABLE  `customer` ADD  `bdmin_user_id` INT( 11 ) NOT NULL COMMENT  '该用户所属的供应商的id', ADD INDEX (  `bdmin_user_id` )";
        $db->createCommand($sql)->execute();
        
        // 新建表sql
        $sql =  "
            CREATE TABLE IF NOT EXISTS `statistical_bdmin_month` (
                `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
                `bdmin_user_id` INT( 11 ) NOT NULL COMMENT  '供应商ID',
                `complete_order_total` DECIMAL( 12, 2 ) NULL COMMENT  '完成的订单金额',
                `refund_return_total` DECIMAL( 12, 2 ) NULL COMMENT  '退货-退款总额',
                `month` INT( 5 ) NULL COMMENT  '月份',
                `updated_at` INT( 11 ) NULL COMMENT  '更新时间',
                `created_at` INT( 11 ) NULL COMMENT  '创建时间'
                ) ENGINE = INNODB;
        ";
        $db->createCommand($sql)->execute();
        
        // 后台添加url资源,以及添加admin用户的权限。
        $db->createCommand("INSERT INTO `admin_url_key` (`name`, `tag`, `tag_sort_order`, `url_key`, `created_at`, `updated_at`, `can_delete`) VALUES ('Home Page Config Save', 'config-homepage', 2, '/cms/homepage/managereditsave', 1554107065, 1554117214, 1)")->execute();
        $lastInsertId = $db->getLastInsertID() ;
        $db->createCommand("INSERT INTO `admin_role_url_key` (`role_id`, `url_key_id`, `created_at`, `updated_at`) VALUES (4, " . $lastInsertId . ", 1541129239, 1541129239)")->execute();
        
        
        return true;
    }
    
    /**
     * 复制图片文件到appimage/common/addons/{namespace},如果存在,则会被强制覆盖
     */
    public function copyImageFile()
    {
        /*
        $sourcePath = Yii::getAlias('@fectestst/app/appimage/common/addons/fectestst');
        
        Yii::$service->extension->administer->copyThemeFile($sourcePath);
        */
        return true;
    }
    
}

插件安装的时候,会执行run()方法,因此插件初始化需要执行的内容,您都写到run方法里面

public function run()
    {
        if (!$this->installDbSql()) {
            return false;
        }
        if (!$this->copyImageFile()) {
            return false;
        }
        
        return true;
    }

installDbSql()函数是安装数据库sql的函数,copyImageFile()函数是复制图片文件到图片文件appimage/common下的函数(图片域名对应的文件路径)

2.扩展安装sql部分installDbSql()函数

2.1执行安装sql语句

$db = Yii::$app->getDb();:是yii2框架的函数,获取db组件

$db->createCommand($sql)->execute();: 执行sql语句

2.2添加后台权限资源

// 后台添加url资源,以及添加admin用户的权限。
$db->createCommand("INSERT INTO `admin_url_key` (`name`, `tag`, `tag_sort_order`, `url_key`, `created_at`, `updated_at`, `can_delete`) VALUES ('Home Page Config Save', 'config-homepage', 2, '/cms/homepage/managereditsave', 1554107065, 1554117214, 1)")->execute();
$lastInsertId = $db->getLastInsertID() ;
$db->createCommand("INSERT INTO `admin_role_url_key` (`role_id`, `url_key_id`, `created_at`, `updated_at`) VALUES (4, " . $lastInsertId . ", 1541129239, 1541129239)")->execute();

第一个sql是在admin_url_key表中新建url资源

第二个sql是将admin_url_key 的id , 和 用户权限组id进行关联,数据写入到admin_role_url_key

2.2.1开发新功能,后台新建url资源

当您进行开发扩展插件,在fecmall后台开发了新的菜单功能,新建了新的controller,就意味着新的url 资源建立, fecmall后台部分是RBAC权限控制,因此您可以在fecmall后台新建url资源,并将其添加到相应的用户权限组

控制面板 --> 后台用户 --> 资源管理 进行操作,关于菜单资源权限管理,详细资料: Fecmall 后台菜单RBAC

2.2.1将后台新建的url资源,搞成sql,写入到installDbSql()函数,扩展插件安装过程中自动执行sql

fecmall的url资源以及权限对应关系,是存储到mysql里面的,因此在插件初始化的时候,需要用sql安装, 您打开数据表:admin_url_key,您可以看到新建的资源,你可以以上面的例子,将数据搞成sql,进行安装

通过phpmysql导出sql


INSERT INTO `admin_url_key` (`id`, `name`, `tag`, `tag_sort_order`, `url_key`, `created_at`, `updated_at`, `can_delete`) VALUES
(1, 'Account List', 'dashboard_user_account_manager', 2, '/fecadmin/account/manager', 1511948105, 1540730009, 1),

转换:

$db->createCommand("INSERT INTO `admin_url_key` (`name`, `tag`, `tag_sort_order`, `url_key`, `created_at`, `updated_at`, `can_delete`) VALUES ( 'Account List', 'dashboard_user_account_manager', 2, '/fecadmin/account/manager', 1511948105, 1540730009, 1)")->execute();
$lastInsertId = $db->getLastInsertID() ;
$db->createCommand("INSERT INTO `admin_role_url_key` (`role_id`, `url_key_id`, `created_at`, `updated_at`) VALUES (4, " . $lastInsertId . ", 1541129239, 1541129239)")->execute();

2.2.3转换工具

当您写了很多的url资源,手动转换非常费劲,您可以使用fecmall的工具生成,

譬如:您建立100多个url资源,可以通过phpmysql获得导出语句,然后通过该工具一次得到转换后的语句,复制上去就可

详细参看:Fecmall-后台菜单Admin Url Key Gii工具

Uninstall.php

卸载插件扩展执行的函数

按照逻辑,在install.php部分安装的sql,应该在卸载的时候执行sql删除, 但是这个是一个比较危险的操作,如果运营一段时间的站点误操作,将会导致出问题, 因此卸载部分,terry开发的扩展一般不会写sql删除的操作

但是,terry开发的扩展虽然没有实现sql删除,但是,如果您有sql删除的需求,可以在 uninstallDbSql函数里面写上删除的sql语句

Uninstall.php文件例子:

<?php
/**
 * Fecmall Addons
 */
namespace fectestst\administer;
use Yii;
/**
 * 应用安装类
 * 您可以在这里添加类变量,在配置中的值可以注入进来。
 */
class Uninstall implements \fecshop\services\extension\UninstallInterface
{
    
    /**
     * 应用执行卸载的步骤执行的函数。
     */
    public function run()
    {
        if (!$this->uninstallDbSql()) {
            return false;
        }
        if (!$this->removeImageFile()) {
            return false;
        }
        return true;
    }
    
    public function uninstallDbSql()
    {
        /*
        $sql = "
        //    DROP TABLE IF EXISTS `fecmall_addon_test1`;
        //    DROP TABLE IF EXISTS `fecmall_addon_test2`;
        ";
        // 执行sql, 创建表结构的时候,这个函数会返回0,因此不能以返回值作为return
        Yii::$app->getDb()->createCommand($sql)->execute();
        */
        
        return true;
    }
    
    public function removeImageFile()
    {
        /*
        return Yii::$service->extension->administer->removeThemeFile();
        */
        
        return true;
    }
}

Upgrade.php 升级文件

当扩展插件发布后,后续会继续迭代开发,进行升级,升级过程中,会有sql安装,图片复制等操作, 您可以把升级的部分,写到Upgrade.php中。

如果您当前的升级,不需要进行sql安装,那么就不需要在这里添加升级代码了

Upgrade.php文件例子:

<?php
/**
 * Fecmall Addons
 */
namespace fectestst\administer;
use Yii;
/**
 * 应用安装类
 * 您可以在这里添加类变量,在配置中的值可以注入进来。
 */
class Upgrade implements \fecshop\services\extension\UpgradeInterface
{
    /**
     * @var array
     * 必须按照版本号依次填写,否则升级会导致问题。
     * 如果安装的初始版本号为1.0.0,那么下面的升级版本号必须比初始版本号大才行
     */
    public $versions = [
        '1.0.1',
        '1.0.2',
        '1.0.3',
    ];
    
    /**
    * @param $version  最新版本号
    * @return boolean
    *  升级执行的函数,您可以在各个版本号需要执行的部分写入相应的操作。
    */
    public function run($version)
    {
        /**
         * 下面仅仅是一个sql例子,您可以将其换成您自己要升级的内容
         */
        switch ($version)
        {
            case '1.0.1' :
                $this->upgrade101();
                break;
            case '1.0.2' :
                $this->upgrade102();
                break;
            case '1.0.3' :
                $this->upgrade103();
                break;
        }
        
        return true;
    }
    // 1.1.0
    public function upgrade110()
    {
        // 增加测试 - 冗余的字段
        $db = Yii::$app->getDb();
        $sql = "ALTER TABLE fecmall_addon_test1 ADD COLUMN redundancy_field_5255 varchar(48);";
        $db->createCommand($sql)->execute();
    }
    
    // 1.2.0
    public function upgrade102()
    {
        // 删除测试 - 冗余的字段
        $db = Yii::$app->getDb();
        $sql = "ALTER TABLE fecmall_addon_test1 ADD COLUMN redundancy_field_566 varchar(48);";
        $db->->createCommand($sql)->execute();
    }
    
    
    
    /**
     * 复制图片文件到appimage/common/addons/{namespace},如果存在,则会被强制覆盖
     */
    public function copyImageFile()
    {
        /*
        $sourcePath = Yii::getAlias('@fectestst/app/appimage/common/addons/fectestst');
        
        Yii::$service->extension->administer->copyThemeFile($sourcePath);
        */
        return true;
    }
    
    
}

1.关于升级版本号

升级版本号命名:初次发版的扩展插件,命名版本号为:1.0.0, 而对于升级的版本,您可以自由命名,譬如:1.1.01.0.1, 只要保证升级的版本号大于当前的版本号即可

版本号一致性:您在Upgrade.php写的版本号,要和fecmall应用市场上传扩展zip压缩包的版本号一致

2.升级代码详细步骤

假设您现在的版本号是1.0.0,升级的版本号为1.1.0

2.1在类变量$versions数组中添加新的版本号。如下:(后续如果继续升级,在该类变量数组中继续添加子项即可)

public $versions = [
    '1.1.0',
    // '1.2.0',
];

2.2在run方法里面,通过 $version 参数,进行判断执行相应的函数

public function run($version)
{
    /**
     * 下面仅仅是一个sql例子,您可以将其换成您自己要升级的内容
     */
    switch ($version)
    {
        case '1.1.0' :
            $this->upgrade110();
            break;
        // case '1.2.0' :
        //     $this->upgrade120();
        //     break;
        // case '1.3.0' :
        //     $this->upgrade130();
        //     break;
    }
    
    return true;
}

2.3新建方法:upgrade110()

// 1.1.0
    public function upgrade110()
    {
        // 增加测试 - 冗余的字段
        $db = Yii::$app->getDb();
        $sql = "ALTER TABLE fecmall_addon_test1 ADD COLUMN redundancy_field_5255 varchar(48);";
        $db->createCommand($sql)->execute();
    }

执行相关操作即可,里面执行sql,复制图片等,和Install.php里面是一样的。

至此,插件安装,卸载,升级部分已介绍完毕。