opencart扩展管理之模块管理 module

#系统设置->设计->布局,route=design/layout
table:layout
columns: layout_id, name
table:layout_route
columns: layout_route_id, layout_id, store_id, route


#系统设置->设计->横幅,route=design/banner
table: banner
columns: banner_id, name, status
table: banner_image
columns: banner_image_id, banner_id, link, image
table:  banner_image_description
columns: banner_image_id, language_id, banner_id, title


#扩展功能->模块配置, route=extension/module
table: extension //已安装的扩展,扩展包括模块,支付,运输等类型
columns: extension_id, type, code
获取已安装指定类型扩展:
$this->db->query("SELECT * FROM " . DB_PREFIX . "extension WHERE `type` = '" . $this->db->escape($type) . "'");


#扩展功能->模块配置,route=extension/module/index代码解析
$this->load->model('setting/extension');

$extensions = $this->model_setting_extension->getInstalled('module');//获取类型是module的扩展

foreach ($extensions as $key => $value) {
	if (!file_exists(DIR_APPLICATION . 'controller/module/' . $value . '.php')) {//检测已安装的module对应的文件是否存在,不存在自动删除extension表中数据
		$this->model_setting_extension->uninstall('module', $value);//value对应extension表中的字段code,也对应文件名称
		
		unset($extensions[$key]);
	}
}

$this->data['extensions'] = array();
				
$files = glob(DIR_APPLICATION . 'controller/module/*.php');//获取module下php文件列表

if ($files) {
	foreach ($files as $file) {
		$extension = basename($file, '.php');
		
		$this->language->load('module/' . $extension);

		$action = array();
		
		if (!in_array($extension, $extensions)) {//extension表中并没有type='module' AND code='$extension'数据,则表明此扩展还没安装,
			$action[] = array(
				'text' => $this->language->get('text_install'),//安装
				'href' => $this->url->link('extension/module/install', 'token=' . $this->session->data['token'] . '&extension=' . $extension, 'SSL')
			);
		} else {// 否则已经安装
			$action[] = array(
				'text' => $this->language->get('text_edit'),//编辑
				'href' => $this->url->link('module/' . $extension . '', 'token=' . $this->session->data['token'], 'SSL')//可见编辑调用的是index方法
			);
						
			$action[] = array(//删除
				'text' => $this->language->get('text_uninstall'),
				'href' => $this->url->link('extension/module/uninstall', 'token=' . $this->session->data['token'] . '&extension=' . $extension, 'SSL')
			);
		}
										
		$this->data['extensions'][] = array(
			'name'   => $this->language->get('heading_title'),
			'action' => $action
		);
	}
}


#扩展功能->模块配置,route=extension/module/install代码解析
$this->load->model('setting/extension');

$this->model_setting_extension->install('module', $this->request->get['extension']);//INSERT INTO oc_extension SET `type` = '$type', `code` = '$code'

$this->load->model('user/user_group');//权限相关的,暂不考虑

$this->model_user_user_group->addPermission($this->user->getId(), 'access', 'module/' . $this->request->get['extension']);
$this->model_user_user_group->addPermission($this->user->getId(), 'modify', 'module/' . $this->request->get['extension']);

require_once(DIR_APPLICATION . 'controller/module/' . $this->request->get['extension'] . '.php');//加载此文件并且实例化

$class = 'ControllerModule' . str_replace('_', '', $this->request->get['extension']);
$class = new $class($this->registry);

if (method_exists($class, 'install')) {//有install方法则执行
	$class->install();
}


#扩展功能->模块配置,route=extension/module/uninstall代码解析
$this->load->model('setting/extension');
$this->load->model('setting/setting');
		
$this->model_setting_extension->uninstall('module', $this->request->get['extension']);//DELETE FROM oc_extension WHERE `type` = '$type' AND `code` = '$code'
$this->model_setting_setting->deleteSetting($this->request->get['extension']);//DELETE FROM oc_setting WHERE store_id = '$store_id' AND `group` = '$group',
require_once(DIR_APPLICATION . 'controller/module/' . $this->request->get['extension'] . '.php');//request->get['extension']即oc_extension字段code,当前也是controller/extension/module/下的文件名称

$class = 'ControllerModule' . str_replace('_', '', $this->request->get['extension']);

$class = new $class($this->registry);

if (method_exists($class, 'uninstall')) {//有uninstall()则执行
	$class->uninstall();
}


#指定模块的编辑操作,以横幅为例,route=module/banner,此时执行的是index方法,如下
$this->load->model('setting/setting');		
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
	$this->model_setting_setting->editSetting('banner', $this->request->post);//很明显,数据是保存在oc_setting表中
			
	$this->session->data['success'] = $this->language->get('text_success');
				
	$this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'));
}
//下面来看$this->model_setting_setting->editSetting()方法
public function editSetting($group, $data, $store_id = 0) {
	$this->db->query("DELETE FROM " . DB_PREFIX . "setting WHERE store_id = '" . (int)$store_id . "' AND `group` = '" . $this->db->escape($group) . "'");

	foreach ($data as $key => $value) {
		if (!is_array($value)) {
			$this->db->query("INSERT INTO " . DB_PREFIX . "setting SET store_id = '" . (int)$store_id . "', `group` = '" . $this->db->escape($group) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape($value) . "'");
		} else {
			$this->db->query("INSERT INTO " . DB_PREFIX . "setting SET store_id = '" . (int)$store_id . "', `group` = '" . $this->db->escape($group) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape(serialize($value)) . "', serialized = '1'");//多维数组序列化
		}
	}
}


总结
由此可见admin/controller/extension/module.php专职负责管理 admin/controller/module/*.php下的模块文件
一个module扩展应该包含index,install,unstall方法

安装或卸载一个module时,状态保存在表extension,字段type保存的是类型(对应目录名),当前肯定是'module',也有可能是'payment','shipping'等, 字段code保存的是对应文件名
编辑某个module时,数据是保存在表setting中,字段group保存的是模块名称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值