| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- <?php
- namespace Admin\Controller;
- use Think\Page;
- use Util\Sql;
- /**
- * 扩展后台管理页面
- * 该类参考了OneThink的部分实现
- *
- */
- class AddonController extends AdminController
- {
- /**
- * 插件列表
- *
- */
- public function index()
- {
- // 获取所有插件信息
- $p = !empty($_GET["p"]) ? $_GET['p'] : 1;
- $addon_object = D('Addon');
- $addons = $addon_object
- ->getAllAddon();
- // 使用Builder快速建立列表页面。
- $builder = new \Common\Builder\ListBuilder();
- $builder->setMetaTitle('插件列表') // 设置页面标题
- ->addTopButton('resume') // 添加启用按钮
- ->addTopButton('forbid') // 添加禁用按钮
- ->addTableColumn('name', '标识')
- ->addTableColumn('title', '名称')
- ->addTableColumn('description', '描述')
- ->addTableColumn('status', '状态')
- ->addTableColumn('author', '作者')
- ->addTableColumn('version', '版本')
- ->addTableColumn('right_button', '操作', 'btn')
- ->setTableDataList($addons) // 数据列表
- ->display();
- }
- /**
- * 设置插件页面
- *
- */
- public function config()
- {
- if (IS_POST) {
- $id = (int) I('id');
- $config = I('config');
- $flag = D('Addon')
- ->where("id={$id}")
- ->setField('config', json_encode($config));
- if ($flag !== false) {
- $this->success('保存成功', U('index'));
- } else {
- $this->error('保存失败');
- }
- } else {
- $id = (int) I('id');
- $addon = D('Addon')->find($id);
- if (!$addon) {
- $this->error('插件未安装');
- }
- $addon_class = get_addon_class($addon['name']);
- if (!class_exists($addon_class)) {
- trace("插件{$addon['name']}无法实例化,", 'ADDONS', 'ERR');
- }
- $data = new $addon_class;
- $addon['addon_path'] = $data->addon_path;
- $addon['custom_config'] = $data->custom_config;
- $this->meta_title = '设置插件-' . $data->info['title'];
- $db_config = $addon['config'];
- $addon['config'] = include $data->config_file;
- if ($db_config) {
- $db_config = json_decode($db_config, true);
- foreach ($addon['config'] as $key => $value) {
- if ($value['type'] != 'group') {
- $addon['config'][$key]['value'] = $db_config[$key];
- } else {
- foreach ($value['options'] as $gourp => $options) {
- foreach ($options['options'] as $gkey => $value) {
- $addon['config'][$key]['options'][$gourp]['options'][$gkey]['value'] = $db_config[$gkey];
- }
- }
- }
- }
- }
- // 构造表单名
- foreach ($addon['config'] as $key => $val) {
- if ($val['type'] == 'group') {
- foreach ($val['options'] as $key2 => $val2) {
- foreach ($val2['options'] as $key3 => $val3) {
- $addon['config'][$key]['options'][$key2]['options'][$key3]['name'] = 'config[' . $key3 . ']';
- }
- }
- } else {
- $addon['config'][$key]['name'] = 'config[' . $key . ']';
- }
- }
- $this->assign('data', $addon);
- $this->assign('form_items', $addon['config']);
- if ($addon['custom_config']) {
- $this->assign('custom_config', $this->fetch($addon['addon_path'] . $addon['custom_config']));
- $this->display($addon['addon_path'] . $addon['custom_config']);
- } else {
- //使用FormBuilder快速建立表单页面。
- $builder = new \Common\Builder\FormBuilder();
- $builder->setMetaTitle('插件设置') //设置页面标题
- ->setPostUrl(U('config')) //设置表单提交地址
- ->addFormItem('id', 'hidden', 'ID', 'ID')
- ->setExtraItems($addon['config']) //直接设置表单数据
- ->setFormData($addon)
- ->display();
- }
- }
- }
- /**
- * 安装插件
- *
- */
- public function install()
- {
- $addon_name = trim(I('addon_name'));
- $class = get_addon_class($addon_name);
- if (!class_exists($class)) {
- $this->error('插件不存在');
- }
- $addons = new $class;
- $info = $addons->info;
- $hooks = $addons->hooks;
- // 检测信息的正确性
- if (!$info || !$addons->checkInfo()) {
- $this->error('插件信息缺失');
- }
- session('addons_install_error', null);
- $install_flag = $addons->install();
- if (!$install_flag) {
- $this->error('执行插件预安装操作失败' . session('addons_install_error'));
- }
- // 检查该插件所需的钩子
- if ($hooks) {
- $hook_object = D('Hook');
- foreach ($hooks as $val) {
- $hook_object->existHook($val, array('description' => $info['description']));
- }
- }
- // 安装数据库
- $sql_file = realpath(C('ADDON_PATH') . $addon_name) . '/Sql/install.sql';
- if (file_exists($sql_file)) {
- $sql_object = new Sql();
- $sql_status = $sql_object->execute_sql_from_file($sql_file);
- if (!$sql_status) {
- $this->error('执行插件SQL安装语句失败' . session('addons_install_error'));
- }
- }
- $addon_object = D('Addon');
- $data = $addon_object->create($info);
- if (is_array($addons->admin_list) && $addons->admin_list !== array()) {
- $data['adminlist'] = 1;
- } else {
- $data['adminlist'] = 0;
- }
- if (!$data) {
- $this->error($addon_object->getError());
- }
- if ($addon_object->add($data)) {
- $config = array('config' => json_encode($addons->getConfig()));
- $addon_object->where("name='{$addon_name}'")->save($config);
- $hooks_update = D('Hook')->updateHooks($addon_name);
- if ($hooks_update) {
- S('hooks', null);
- $this->success('安装成功');
- } else {
- $addon_object->where("name='{$addon_name}'")->delete();
- $this->error('更新钩子处插件失败,请卸载后尝试重新安装');
- }
- } else {
- $this->error('写入插件数据失败');
- }
- }
- /**
- * 卸载插件
- *
- */
- public function uninstall()
- {
- $addon_object = D('Addon');
- $id = trim(I('id'));
- $db_addons = $addon_object->find($id);
- $class = get_addon_class($db_addons['name']);
- $this->assign('jumpUrl', U('index'));
- if (!$db_addons || !class_exists($class)) {
- $this->error('插件不存在');
- }
- session('addons_uninstall_error', null);
- $addons = new $class;
- $uninstall_flag = $addons->uninstall();
- if (!$uninstall_flag) {
- $this->error('执行插件预卸载操作失败' . session('addons_uninstall_error'));
- }
- $hooks_update = D('Hook')->removeHooks($db_addons['name']);
- if ($hooks_update === false) {
- $this->error('卸载插件所挂载的钩子数据失败');
- }
- S('hooks', null);
- $delete = $addon_object->where("name='{$db_addons['name']}'")->delete();
- // 卸载数据库
- $sql_file = realpath(C('ADDON_PATH') . $db_addons['name']) . '/Sql/uninstall.sql';
- if (file_exists($sql_file)) {
- $sql_object = new Sql();
- $sql_status = $sql_object->execute_sql_from_file($sql_file);
- if (!$sql_status) {
- $this->error('执行插件SQL卸载语句失败' . session('addons_uninstall_error'));
- }
- }
- if ($delete === false) {
- $this->error('卸载插件失败');
- } else {
- $this->success('卸载成功');
- }
- }
- /**
- * 外部执行插件方法
- *
- */
- public function execute($_addons = null, $_controller = null, $_action = null)
- {
- if (C('URL_CASE_INSENSITIVE')) {
- $_addons = ucfirst(parse_name($_addons, 1));
- $_controller = parse_name($_controller, 1);
- }
- $TMPL_PARSE_STRING = C('TMPL_PARSE_STRING');
- $TMPL_PARSE_STRING['__ADDONROOT__'] = __ROOT__ . "/Addons/{$_addons}";
- C('TMPL_PARSE_STRING', $TMPL_PARSE_STRING);
- if (!empty($_addons) && !empty($_controller) && !empty($_action)) {
- $Addons = A("Addons://{$_addons}/{$_controller}")->$_action();
- } else {
- $this->error('没有指定插件名称,控制器或操作!');
- }
- }
- /**
- * 插件后台显示页面
- * @param string $name 插件名
- *
- */
- public function adminList($name, $tab = 1)
- {
- // 获取插件实例
- $addon_class = get_addon_class($name);
- if (!class_exists($addon_class)) {
- $this->error('插件不存在');
- } else {
- $addon = new $addon_class();
- }
- // 自定义插件后台页面
- if ($addon->custom_adminlist) {
- $this->assign('custom_adminlist', $this->fetch($addon->custom_adminlist));
- $this->display($addon->custom_adminlist);
- } else {
- // 获取插件的$admin_list配置
- $admin_list = $addon->admin_list;
- $tab_list = array();
- foreach ($admin_list as $key => $val) {
- $tab_list[$key]['title'] = $val['title'];
- $tab_list[$key]['href'] = U('Admin/Addon/adminList', array(
- 'name' => $name,
- 'tab' => $key,
- ));
- }
- $admin = $admin_list[$tab];
- $param = D('Addons://' . $name . '/' . $admin['model'] . '')->adminList;
- if ($param) {
- // 搜索
- $keyword = (string) I('keyword');
- $condition = array('like', '%' . $keyword . '%');
- $map['id|' . $param['search_key']] = array(
- $condition,
- $condition,
- '_multi' => true,
- );
- // 获取数据列表
- $p = !empty($_GET["p"]) ? $_GET['p'] : 1;
- $data_list = M($param['model'])
- ->page($p, C('ADMIN_PAGE_ROWS'))
- ->where($map)
- ->field(true)
- ->order($param['order'])
- ->select();
- $page = new Page(M($param['model'])
- ->where($map)
- ->count(), C('ADMIN_PAGE_ROWS'));
- // 使用Builder快速建立列表页面。
- $builder = new \Common\Builder\ListBuilder();
- $builder->setMetaTitle($addon->info['title']) // 设置页面标题
- ->AddTopButton('addnew', array('href' => U('Admin/Addon/adminAdd', array('name' => $name, 'tab' => $tab)))) // 添加新增按钮
- ->AddTopButton('resume', array('model' => $param['model'])) // 添加启用按钮
- ->AddTopButton('forbid', array('model' => $param['model'])) // 添加禁用按钮
- ->setSearch('请输入关键字', U('Admin/Addon/adminList', array('name' => $name, 'tab' => $tab)))
- ->SetTabNav($tab_list, $tab) // 设置Tab按钮列表
- ->setTableDataList($data_list) // 数据列表
- ->setTableDataPage($page->show()); // 数据列表分页
- // 根据插件的list_grid设置后台列表字段信息
- foreach ($param['list_grid'] as $key => $val) {
- $builder->addTableColumn($key, $val['title'], $val['type']);
- }
- // 根据插件的right_button设置后台列表右侧按钮
- foreach ($param['right_button'] as $key => $val) {
- $builder->addRightButton('self', $val);
- }
- // 定义编辑按钮
- $attr = array();
- $attr['name'] = 'edit';
- $attr['title'] = '编辑';
- $attr['class'] = 'label label-info-outline label-pill';
- $attr['href'] = U('Admin/Addon/adminEdit', array(
- 'name' => $name,
- 'tab' => $tab,
- 'id' => '__data_id__',
- ));
- // 显示列表
- $builder->addTableColumn('right_button', '操作', 'btn')
- ->addRightButton('self', $attr) //添加编辑按钮
- ->addRightButton('forbid', array('model' => $param['model'])) // 添加禁用/启用按钮
- ->addRightButton('delete', array('model' => $param['model'])) // 添加删除按钮
- ->display();
- } else {
- $this->error('插件列表信息不正确');
- }
- }
- }
- /**
- * 插件后台数据增加
- * @param string $name 插件名
- *
- */
- public function adminAdd($name, $tab)
- {
- // 获取插件实例
- $addon_class = get_addon_class($name);
- if (!class_exists($addon_class)) {
- $this->error('插件不存在');
- } else {
- $addon = new $addon_class();
- }
- // 获取插件的$admin_list配置
- $admin_list = $addon->admin_list;
- $admin = $admin_list[$tab];
- $addon_model_object = D('Addons://' . $name . '/' . $admin['model']);
- $param = $addon_model_object->adminList;
- if ($param) {
- if (IS_POST) {
- $data = $addon_model_object->create();
- if ($data) {
- $result = $addon_model_object->add($data);
- } else {
- $this->error($addon_model_object->getError());
- }
- if ($result) {
- $this->success('新增成功', U('Admin/Addon/adminlist', array('name' => $name, 'tab' => $tab)));
- } else {
- $this->error('更新错误');
- }
- } else {
- // 使用FormBuilder快速建立表单页面。
- $builder = new \Common\Builder\FormBuilder();
- $builder->setMetaTitle('新增数据') //设置页面标题
- ->setPostUrl(U('Admin/Addon/adminAdd', array('name' => $name, 'tab' => $tab))) // 设置表单提交地址
- ->setExtraItems($param['field'])
- ->display();
- }
- } else {
- $this->error('插件列表信息不正确');
- }
- }
- /**
- * 插件后台数据编辑
- * @param string $name 插件名
- *
- */
- public function adminEdit($name, $tab, $id)
- {
- // 获取插件实例
- $addon_class = get_addon_class($name);
- if (!class_exists($addon_class)) {
- $this->error('插件不存在');
- } else {
- $addon = new $addon_class();
- }
- // 获取插件的$admin_list配置
- $admin_list = $addon->admin_list;
- $admin = $admin_list[$tab];
- $addon_model_object = D('Addons://' . $name . '/' . $admin['model']);
- $param = $addon_model_object->adminList;
- if ($param) {
- if (IS_POST) {
- $data = $addon_model_object->create();
- if ($data) {
- $result = $addon_model_object->save($data);
- } else {
- $this->error($addon_model_object->getError());
- }
- if ($result) {
- $this->success('更新成功', U('Admin/Addon/adminlist', array('name' => $name, 'tab' => $tab)));
- } else {
- $this->error('更新错误');
- }
- } else {
- // 使用FormBuilder快速建立表单页面。
- $builder = new \Common\Builder\FormBuilder();
- $builder->setMetaTitle('编辑数据') // 设置页面标题
- ->setPostUrl(U('admin/addon/adminedit', array('name' => $name, 'tab' => $tab))) // 设置表单提交地址
- ->addFormItem('id', 'hidden', 'ID', 'ID')
- ->setExtraItems($param['field'])
- ->setFormData(M($param['model'])->find($id))
- ->display();
- }
- } else {
- $this->error('插件列表信息不正确');
- }
- }
- }
|