phpcms二次开发之模块的安装卸载

phpcms源码分析之模块的安装与卸载

直切出题,phpcms\modules\admin\classes\module_api.class.php

/**
     * 模块安装
     * @param string $module 模块名
     */
    public function install($module = '') {
        define('INSTALL', true);
        if ($module) $this->module = $module;        //所要安装的模块名 例如:$this->module = 'qiubai'
        $this->installdir = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$this->module.DIRECTORY_SEPARATOR.'install'.DIRECTORY_SEPARATOR;    //模块安装的路径
        
        $this->check();    //模块一系列的检查
        $models = @require($this->installdir.'model.php');        //$models = array('qiubai');
        if (!is_array($models) || empty($models)) {
            $models = array('module');
        }
        if (!in_array('module', $models)) {
            array_unshift($models, 'module');
        }
        if (is_array($models) && !empty($models)) {
            foreach ($models as $m) {
                $this->m_db = pc_base::load_model($m.'_model');            //加载phpcms/model/qiubai_model.class.php,获取mysql的实体对象
                $sql = file_get_contents($this->installdir.$m.'.sql');    //读取qiubai.sql文件
                $this->sql_execute($sql);                                //执行sql,创建表v9_qiubai
            }
        }
        if (file_exists($this->installdir.'extention.inc.php')) {        //查看安装目录下的extention.inc.php文件是否存在,
            $menu_db = pc_base::load_model('menu_model');                //获取menu_model的model对象  $menu_db 插入v9_menu表
            @include ($this->installdir.'extention.inc.php');            //加载extention.inc.php文件
            if(!defined('INSTALL_MODULE')) {                            //是否安装了此模块
                $file = PC_PATH.'languages'.DIRECTORY_SEPARATOR.pc_base::load_config('system', 'lang').DIRECTORY_SEPARATOR.'system_menu.lang.php';
                if(file_exists($file)) {                                //把$language数组对应的按钮添加到system_menu.lang.php中
                    $content = file_get_contents($file);
                    $content = substr($content,0,-2);
                    $data = '';
                    foreach ($language as $key => $l) {
                        if (L($key, '', 'system_menu')==$key) {
                            $data .= "\$LANG['".$key."'] = '".$l."';\r\n";
                        }
                    }
                    $data = $content.$data."?>";
                    file_put_contents($file,$data);
                } else {
                    foreach ($language as $key =>$l) {
                        if (L($key, '', 'system_menu')==$key) {
                            $data .= "\$LANG['".$key."'] = '".$l."';\r\n";
                        }
                    }
                    $data = "<?"."php\r\n\$data?>";
                    file_put_contents($file,$data);
                }
            }
        }

        if(!defined('INSTALL_MODULE')) {        //是否安装了模块
            if (file_exists($this->installdir.'languages'.DIRECTORY_SEPARATOR)) {        //查询安装目录下的language文件夹是否存在
                dir_copy($this->installdir.'languages'.DIRECTORY_SEPARATOR, PC_PATH.'languages'.DIRECTORY_SEPARATOR);    //复制文件到phpcms/languages目录下 我这里是空的所以直接跳过了
            }
            if(file_exists($this->installdir.'templates'.DIRECTORY_SEPARATOR)) {        //安装目录下的模板文件夹是否存在 把前端模板文件拷贝到当前访问的模板目录中
                dir_copy($this->installdir.'templates'.DIRECTORY_SEPARATOR, PC_PATH.'templates'.DIRECTORY_SEPARATOR.pc_base::load_config('system', 'tpl_name').DIRECTORY_SEPARATOR.$this->module.DIRECTORY_SEPARATOR);
                if (file_exists($this->installdir.'templates'.DIRECTORY_SEPARATOR.'name.inc.php')) {    //查看下install/templates/name.inc.php文件是否存在
                    $keyid = 'templates|'.pc_base::load_config('system', 'tpl_name').'|'.$this->module;
                    $file_explan[$keyid] = include $this->installdir.'templates'.DIRECTORY_SEPARATOR.'name.inc.php';
                    $templatepath = PC_PATH.'templates'.DIRECTORY_SEPARATOR.pc_base::load_config('system', 'tpl_name').DIRECTORY_SEPARATOR;
                    if (file_exists($templatepath.'config.php')) {
                        $style_info = include $templatepath.'config.php';        //加载模板配置文件,把name.inc.php配置文件信息放到文件里
                        $style_info['file_explan'] = array_merge($style_info['file_explan'], $file_explan);
                        @file_put_contents($templatepath.'config.php', '<?php return '.var_export($style_info, true).';?>');
                    }
                    unlink(PC_PATH.'templates'.DIRECTORY_SEPARATOR.pc_base::load_config('system', 'tpl_name').DIRECTORY_SEPARATOR.$this->module.DIRECTORY_SEPARATOR.'name.inc.php');    //删除name.inc.php配置文件
                }
            }
        }
        return true;
    }
    
    /**
     * 检查安装目录
     * @param string $module 模块名
     */
    public function check($module = '') {
    define('INSTALL', true);
        if ($module) $this->module = $module;        //$this->module = 'qiubai';
        if(!$this->module) {    //判断模块是否存在
            $this->error_msg = L('no_module');
            return false;
        }
        if(!defined('INSTALL_MODULE')) {    //判断模块安装了模块 如果没有检查目录是否可写
            if (dir_create(PC_PATH.'languages'.DIRECTORY_SEPARATOR.pc_base::load_config('system', 'lang').DIRECTORY_SEPARATOR.'test_create_dir')) {
                sleep(1);
                dir_delete(PC_PATH.'languages'.DIRECTORY_SEPARATOR.pc_base::load_config('system', 'lang').DIRECTORY_SEPARATOR.'test_create_dir');
                
            } else {
                $this->error_msg = L('lang_dir_no_write');
                return false;
            }
        }
        $r = $this->db->get_one(array('module'=>$this->module));        //直接去看 phpcms/libs/model.class.php,都是继承自这个类的
        if ($r) {                                                        //查看模块是否已经安装过     select * from phpcmsv9.v9_module where module='qiubai'
            $this->error_msg = L('this_module_installed');
            return false;
        }
        if (!$this->installdir) {                //查看模块安装目录是否存在
            $this->installdir = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$this->module.DIRECTORY_SEPARATOR.'install'.DIRECTORY_SEPARATOR;
        }
        if (!is_dir($this->installdir)) {      //查看模块安装目录是否是一个文件夹
            $this->error_msg = L('install_dir_no_exist');
            return false;
        }
        if (!file_exists($this->installdir.'module.sql')) {        //查看module.sql 文件是否存在
            $this->error_msg = L('module_sql_no_exist');
            return false;
        }
        $models = @require($this->installdir.'model.php');        //加载啊安装目录下的model.php文件,所以我们也需要一个model.php文件
        if (is_array($models) && !empty($models)) {                // $models = array('qiubai');
            foreach ($models as $m) {
                if (!file_exists(PC_PATH.'model'.DIRECTORY_SEPARATOR.$m.'_model.class.php')) {    //检查phpcms/model/qiubai_model.class.php文件是否存在
                    $this->error_msg = $m.L('model_clas_no_exist');
                    return false;
                }
                if (!file_exists($this->installdir.$m.'.sql')) {        //在检测 安装目录下的qiubai.sql文件是否存在
                    $this->error_msg = $m.L('sql_no_exist');
                    return false;
                }
            }
        }
        return true;
    }

 

 

 

 

参考文章:http://blog.csdn.net/yanhui_wei/article/details/7943355

posted @ 2015-08-25 21:59  angel_loong  阅读(227)  评论(0编辑  收藏  举报