#系统设置->设计->布局,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保存的是模块名称