linkage.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <?php
  2. defined('IN_PHPCMS') or exit('No permission resources.');
  3. pc_base::load_app_class('admin','admin',0);
  4. set_time_limit(0);
  5. class linkage extends admin {
  6. private $db;
  7. function __construct() {
  8. parent::__construct();
  9. $this->db = pc_base::load_model('linkage_model');
  10. $this->sites = pc_base::load_app_class('sites');
  11. pc_base::load_sys_class('form', '', 0);
  12. $this->childnode = array();
  13. }
  14. /**
  15. * 联动菜单列表
  16. */
  17. public function init() {
  18. $where = array('keyid'=>0);
  19. $infos = $this->db->select($where);
  20. $big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=admin&c=linkage&a=add\', title:\''.L('linkage_add').'\', width:\'500\', height:\'220\', lock:true}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('linkage_add'));
  21. include $this->admin_tpl('linkage_list');
  22. }
  23. /**
  24. * 添加联动菜单
  25. */
  26. function add() {
  27. if(isset($_POST['dosubmit'])) {
  28. $info = array();
  29. $info['name'] = isset($_POST['info']['name']) && trim($_POST['info']['name']) ? trim($_POST['info']['name']) : showmessage(L('linkage_not_empty'));
  30. $info['description'] = trim($_POST['info']['description']);
  31. $info['style'] = trim(intval($_POST['info']['style']));
  32. $info['siteid'] = trim(intval($_POST['info']['siteid']));
  33. $this->db->insert($info);
  34. $insert_id = $this->db->insert_id();
  35. if($insert_id){
  36. showmessage(L('operation_success'), '', '', 'add');
  37. }
  38. } else {
  39. $show_header = true;
  40. $show_validator = true;
  41. $sitelist = $this->sites->get_list();
  42. foreach($sitelist as $siteid=>$v) {
  43. $sitelist[$siteid] = $v['name'];
  44. }
  45. include $this->admin_tpl('linkage_add');
  46. }
  47. }
  48. /**
  49. * 编辑联动菜单
  50. */
  51. public function edit() {
  52. if(isset($_POST['dosubmit'])) {
  53. $info = array();
  54. $linkageid = intval($_POST['linkageid']);
  55. $info['name'] = isset($_POST['info']['name']) && trim($_POST['info']['name']) ? trim($_POST['info']['name']) : showmessage(L('linkage_not_empty'));
  56. $info['description'] = trim($_POST['info']['description']);
  57. $info['style'] = trim(intval($_POST['info']['style']));
  58. $info['siteid'] = trim(intval($_POST['info']['siteid']));
  59. $info['setting'] = array2string(array('level'=>intval($_POST['info']['level'])));
  60. if($_POST['info']['keyid']) $info['keyid'] = trim($_POST['info']['keyid']);
  61. if($_POST['info']['parentid']) $info['parentid'] = trim($_POST['info']['parentid']);
  62. $this->db->update($info,array('linkageid'=>$linkageid));
  63. $id = $info['keyid'] ? $info['keyid'] : $linkageid;
  64. showmessage(L('operation_success'), '', '', 'edit');
  65. } else {
  66. $linkageid = intval($_GET['linkageid']);
  67. $info = $this->db->get_one(array('linkageid'=>$linkageid));
  68. extract($info);
  69. $setting = string2array($setting);
  70. $sitelist = $this->sites->get_list();
  71. foreach($sitelist as $id=>$v) {
  72. $sitelist[$id] = $v['name'];
  73. }
  74. $show_header = true;
  75. $show_validator = true;
  76. include $this->admin_tpl('linkage_edit');
  77. }
  78. }
  79. /**
  80. * 删除菜单
  81. */
  82. public function delete() {
  83. $linkageid = intval($_GET['linkageid']);
  84. $keyid = intval($_GET['keyid']);
  85. $this->_get_childnode($linkageid);
  86. if(is_array($this->childnode)){
  87. foreach($this->childnode as $linkageid_tmp) {
  88. $this->db->delete(array('linkageid' => $linkageid_tmp));
  89. }
  90. }
  91. $this->db->delete(array('keyid' => $linkageid));
  92. $id = $keyid ? $keyid : $linkageid;
  93. if(!$keyid)$this->_dlecache($linkageid);
  94. showmessage(L('operation_success'));
  95. }
  96. public function public_cache() {
  97. $linkageid = intval($_GET['linkageid']);
  98. $this->_cache($linkageid);
  99. showmessage(L('operation_success'));
  100. }
  101. /**
  102. * 菜单排序
  103. */
  104. public function public_listorder() {
  105. if(!is_array($_POST['listorders'])) return FALSE;
  106. foreach($_POST['listorders'] as $linkageid=>$value)
  107. {
  108. $value = intval($value);
  109. $this->db->update(array('listorder'=>$value),array('linkageid'=>$linkageid));
  110. }
  111. $id = intval($_POST['keyid']);
  112. showmessage(L('operation_success'),'?m=admin&c=linkage&a=init');
  113. }
  114. /**
  115. * 管理联动菜单子菜单
  116. */
  117. public function public_manage_submenu() {
  118. $keyid = isset($_GET['keyid']) && trim($_GET['keyid']) ? trim($_GET['keyid']) : showmessage(L('linkage_parameter_error'));
  119. $tree = pc_base::load_sys_class('tree');
  120. $tree->icon = array('&nbsp;&nbsp;&nbsp;│ ','&nbsp;&nbsp;&nbsp;├─ ','&nbsp;&nbsp;&nbsp;└─ ');
  121. $tree->nbsp = '&nbsp;&nbsp;&nbsp;';
  122. $sum = $this->db->count(array('keyid'=>$keyid));
  123. $sql_parentid = $_GET['parentid'] ? trim($_GET['parentid']) : 0;
  124. $where = $sum > 40 ? array('keyid'=>$keyid,'parentid'=>$sql_parentid) : array('keyid'=>$keyid);
  125. $result = $this->db->select($where,'*','','listorder ,linkageid');
  126. foreach($result as $areaid => $area){
  127. $areas[$area['linkageid']] = array('id'=>$area['linkageid'],'parentid'=>$area['parentid'],'name'=>$area['name'],'listorder'=>$area['listorder'],'style'=>$area['style'],'mod'=>$mod,'file'=>$file,'keyid'=>$keyid,'description'=>$area['description']);
  128. $areas[$area['linkageid']]['str_manage'] = ($sum > 40 && $this->_is_last_node($area['keyid'],$area['linkageid'])) ? '<a href="?m=admin&c=linkage&a=public_manage_submenu&keyid='.$area['keyid'].'&parentid='.$area['linkageid'].'">'.L('linkage_manage_submenu').'</a> | ' : '';
  129. $areas[$area['linkageid']]['str_manage'] .= '<a href="javascript:void(0);" onclick="add(\''.$keyid.'\',\''.new_addslashes($area['name']).'\',\''.$area['linkageid'].'\')">'.L('linkage_add_submenu').'</a> | <a href="javascript:void(0);" onclick="edit(\''.$area['linkageid'].'\',\''.$area['name'].'\',\''.$area['parentid'].'\')">'.L('edit').'</a> | <a href="javascript:confirmurl(\'?m=admin&c=linkage&a=delete&linkageid='.$area['linkageid'].'&keyid='.$area['keyid'].'\', \''.L('linkage_is_del').'\')">'.L('delete').'</a> ';
  130. }
  131. $str = "<tr>
  132. <td align='center' width='80'><input name='listorders[\$id]' type='text' size='3' value='\$listorder' class='input-text-c'></td>
  133. <td align='center' width='100'>\$id</td>
  134. <td>\$spacer\$name</td>
  135. <td >\$description</td>
  136. <td align='center'>\$str_manage</td>
  137. </tr>";
  138. $tree->init($areas);
  139. $submenu = $tree->get_tree($sql_parentid, $str);
  140. $big_menu =array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=admin&c=linkage&a=public_sub_add&keyid='.$keyid.'\', title:\''.L('linkage_add').'\', width:\'500\', height:\'430\', lock:true}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('linkage_add'));
  141. include $this->admin_tpl('linkage_submenu');
  142. }
  143. /**
  144. * 子菜单添加
  145. */
  146. public function public_sub_add() {
  147. if(isset($_POST['dosubmit'])) {
  148. $info = array();
  149. $info['keyid'] = isset($_POST['keyid']) && trim($_POST['keyid']) ? trim(intval($_POST['keyid'])) : showmessage(L('linkage_parameter_error'));
  150. $name = isset($_POST['info']['name']) && trim($_POST['info']['name']) ? trim($_POST['info']['name']) : showmessage(L('linkage_parameter_error'));
  151. $info['description'] = trim($_POST['info']['description']);
  152. $info['style'] = trim($_POST['info']['style']);
  153. $info['parentid'] = trim($_POST['info']['parentid']);
  154. $names = explode("\n", trim($name));
  155. foreach($names as $name) {
  156. $name = trim($name);
  157. if(!$name) continue;
  158. $info['name'] = $name;
  159. $this->db->insert($info);
  160. }
  161. if($this->db->insert_id()){
  162. showmessage(L('operation_success'), '', '', 'add');
  163. }
  164. } else {
  165. $keyid = $_GET['keyid'];
  166. $linkageid = $_GET['linkageid'];
  167. $list = form::select_linkage($keyid,'0','info[parentid]', 'parentid', L('cat_empty'), $linkageid);
  168. $show_validator = true;
  169. include $this->admin_tpl('linkage_sub_add');
  170. }
  171. }
  172. public function ajax_getlist() {
  173. $keyid = intval($_GET['keyid']);
  174. $datas = getcache($keyid,'linkage');
  175. $infos = $datas['data'];
  176. $where_id = isset($_GET['parentid']) ? $_GET['parentid'] : intval($infos[$_GET['linkageid']]['parentid']);
  177. $parent_menu_name = ($where_id==0) ? $datas['title'] :$infos[$where_id]['name'];
  178. foreach($infos AS $k=>$v) {
  179. if($v['parentid'] == $where_id) {
  180. $s[]=iconv('gb2312','utf-8',$v['linkageid'].','.$v['name'].','.$v['parentid'].','.$parent_menu_name);
  181. }
  182. }
  183. if(count($s)>0) {
  184. $jsonstr = json_encode($s);
  185. echo $_GET['callback'].'(',$jsonstr,')';
  186. exit;
  187. } else {
  188. echo $_GET['callback'].'()';exit;
  189. }
  190. }
  191. /**
  192. * 生成联动菜单缓存
  193. * @param init $linkageid
  194. */
  195. private function _cache($linkageid) {
  196. $linkageid = intval($linkageid);
  197. $info = array();
  198. $r = $this->db->get_one(array('linkageid'=>$linkageid),'name,siteid,style,keyid,setting');
  199. $info['title'] = $r['name'];
  200. $info['style'] = $r['style'];
  201. $info['setting'] = string2array($r['setting']);
  202. $info['siteid'] = $r['siteid'];
  203. $info['data'] = $this->submenulist($linkageid);
  204. setcache($linkageid, $info,'linkage');
  205. return $info;
  206. }
  207. /**
  208. * 删除联动菜单缓存文件
  209. * @param init $linkageid
  210. */
  211. private function _dlecache($linkageid) {
  212. return delcache($linkageid,'linkage');
  213. }
  214. /**
  215. * 子菜单列表
  216. * @param unknown_type $keyid
  217. */
  218. private function submenulist($keyid=0) {
  219. $keyid = intval($keyid);
  220. $datas = array();
  221. $where = ($keyid > 0) ? array('keyid'=>$keyid) : '';
  222. $result = $this->db->select($where,'*','','listorder ,linkageid');
  223. if(is_array($result)) {
  224. foreach($result as $r) {
  225. $arrchildid = $r['arrchildid'] = $this->get_arrchildid($r['linkageid'],$result);
  226. $child = $r['child'] = is_numeric($arrchildid) ? 0 : 1;
  227. $this->db->update(array('child'=>$child,'arrchildid'=>$arrchildid),array('linkageid'=>$r['linkageid']));
  228. $datas[$r['linkageid']] = $r;
  229. }
  230. }
  231. return $datas;
  232. }
  233. /**
  234. * 获取所属站点
  235. * @param unknown_type $keyid
  236. */
  237. private function _get_belong_siteid($keyid) {
  238. $keyid = intval($keyid);
  239. $info = $this->db->get_one(array('linkageid'=>$keyid));
  240. return $info ? $info['siteid'] : false;
  241. }
  242. /**
  243. * 获取联动菜单子节点
  244. * @param int $linkageid
  245. */
  246. private function _get_childnode($linkageid) {
  247. $where = array('parentid'=>$linkageid);
  248. $this->childnode[] = intval($linkageid);
  249. $result = $this->db->select($where);
  250. if($result) {
  251. foreach($result as $r) {
  252. $this->_get_childnode($r['linkageid']);
  253. }
  254. }
  255. }
  256. private function _is_last_node($keyid,$linkageid) {
  257. $result = $this->db->count(array('keyid'=>$keyid,'parentid'=>$linkageid));
  258. return $result ? true : false;
  259. }
  260. /**
  261. * 返回菜单ID
  262. */
  263. public function public_get_list() {
  264. $where = array('keyid'=>0);
  265. $infos = $this->db->select($where);
  266. include $this->admin_tpl('linkage_get_list');
  267. }
  268. /**
  269. * 获取子菜单ID列表
  270. * @param $linkageid 联动菜单id
  271. * @param $linkageinfo
  272. */
  273. private function get_arrchildid($linkageid,$linkageinfo) {
  274. $arrchildid = $linkageid;
  275. if(is_array($linkageinfo)) {
  276. foreach($linkageinfo as $linkage) {
  277. if($linkage['parentid'] && $linkage['linkageid'] != $linkageid && $linkage['parentid']== $linkageid) {
  278. $arrchildid .= ','.$this->get_arrchildid($linkage['linkageid'],$linkageinfo);
  279. }
  280. }
  281. }
  282. return $arrchildid;
  283. }
  284. }
  285. ?>