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