国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
11KB

  1. <?php
  2. /**
  3. * 联动选择管理
  4. *
  5. * @version $Id: stepselect_main.php 2 13:23 2011-3-24 tianya $
  6. * @package DedeCMS.Administrator
  7. * @copyright Copyright (c) 2007 - 2020, DesDev, Inc.
  8. * @copyright Copyright (c) 2020, DedeBIZ.COM
  9. * @license http://help.dedecms.com/usersguide/license.html
  10. * @link http://www.dedecms.com
  11. */
  12. require_once(dirname(__FILE__)."/config.php");
  13. CheckPurview('c_Stepselect');
  14. require_once(DEDEINC."/datalistcp.class.php");
  15. require_once(DEDEINC.'/enums.func.php');
  16. /*-----------------
  17. 前台视图
  18. function __show() { }
  19. ------------------*/
  20. $ENV_GOBACK_URL = (isset($ENV_GOBACK_URL) ? $ENV_GOBACK_URL : 'stepselect_main.php');
  21. if(empty($action))
  22. {
  23. setcookie("ENV_GOBACK_URL",$dedeNowurl,time()+3600,"/");
  24. if(!isset($egroup)) $egroup = '';
  25. if(!isset($topvalue)) $topvalue = 0;
  26. $etypes = array();
  27. $egroups = array();
  28. $dsql->Execute('me','SELECT * FROM `#@__stepselect` ORDER BY id DESC');
  29. while($arr = $dsql->GetArray())
  30. {
  31. $etypes[] = $arr;
  32. $egroups[$arr['egroup']] = $arr['itemname'];
  33. }
  34. if($egroup!='')
  35. {
  36. $orderby = 'ORDER BY disorder ASC, evalue ASC';
  37. if(!empty($topvalue))
  38. {
  39. // 判断是否为1级联动
  40. if ($topvalue % 500 == 0)
  41. {
  42. $egroupsql = " WHERE egroup LIKE '$egroup' AND evalue>=$topvalue AND evalue < ".($topvalue + 500);
  43. } else {
  44. $egroupsql = " WHERE (evalue LIKE '$topvalue.%%%' OR evalue=$topvalue) AND egroup LIKE '$egroup'";
  45. }
  46. }
  47. else
  48. {
  49. $egroupsql = " WHERE egroup LIKE '$egroup' ";
  50. }
  51. $sql = "SELECT * FROM `#@__sys_enum` $egroupsql $orderby";
  52. } else {
  53. $egroupsql = '';
  54. $sql = "SELECT * FROM `#@__stepselect` ORDER BY id DESC";
  55. }
  56. //echo $sql;exit;
  57. $dlist = new DataListCP();
  58. $dlist->SetParameter('egroup',$egroup);
  59. $dlist->SetParameter('topvalue',$topvalue);
  60. $dlist->SetTemplet(DEDEADMIN."/templets/stepselect_main.htm");
  61. $dlist->SetSource($sql);
  62. $dlist->display();
  63. exit();
  64. }
  65. else if($action=='edit' || $action=='addnew' || $action=='addenum' || $action=='view')
  66. {
  67. AjaxHead();
  68. include('./templets/stepselect_showajax.htm');
  69. exit();
  70. }
  71. /*-----------------
  72. 删除类型或枚举值
  73. function __del() { }
  74. ------------------*/
  75. else if($action=='del')
  76. {
  77. $arr = $dsql->GetOne("SELECT * FROM `#@__stepselect` WHERE id='$id' ");
  78. if(!is_array($arr))
  79. {
  80. ShowMsg("无法获取分类信息,不允许后续操作!", "stepselect_main.php?".ExecTime());
  81. exit();
  82. }
  83. if($arr['issystem']==1)
  84. {
  85. ShowMsg("系统内置的枚举分类不能删除!", "stepselect_main.php?".ExecTime());
  86. exit();
  87. }
  88. $dsql->ExecuteNoneQuery("DELETE FROM `#@__stepselect` WHERE id='$id'; ");
  89. $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_enum` WHERE egroup='{$arr['egroup']}'; ");
  90. ShowMsg("成功删除一个分类!", "stepselect_main.php?".ExecTime());
  91. exit();
  92. }
  93. else if($action=='delenumAllSel')
  94. {
  95. if(isset($ids) && is_array($ids))
  96. {
  97. $id = join(',', $ids);
  98. $groups = array();
  99. $dsql->Execute('me', "SELECT egroup FROM `#@__sys_enum` WHERE id IN($id) GROUP BY egroup");
  100. while($row = $dsql->GetArray('me'))
  101. {
  102. $groups[] = $row['egroup'];
  103. }
  104. $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_enum` WHERE id IN($id); ");
  105. //更新缓存
  106. foreach($groups as $egropu)
  107. {
  108. WriteEnumsCache($egroup);
  109. }
  110. ShowMsg("成功删除选中的枚举分类!", $ENV_GOBACK_URL);
  111. }
  112. else
  113. {
  114. ShowMsg("你没选择任何分类!", "-1");
  115. }
  116. exit();
  117. }
  118. else if($action=='delenum')
  119. {
  120. $row = $dsql->GetOne("SELECT egroup FROM `#@__sys_enum` WHERE id = '$id' ");
  121. $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_enum` WHERE id='{$id}'; ");
  122. WriteEnumsCache($row['egroup']);
  123. ShowMsg("成功删除一个枚举!", $ENV_GOBACK_URL);
  124. exit();
  125. }
  126. /*-----------------
  127. 保存类型修改
  128. function __edit_save() { }
  129. ------------------*/
  130. else if($action=='edit_save')
  131. {
  132. if(preg_match("#[^0-9a-z_-]#i", $egroup))
  133. {
  134. ShowMsg("组名称不能有全角字符或特殊符号!","-1");
  135. exit();
  136. }
  137. $dsql->ExecuteNoneQuery("UPDATE `#@__stepselect` SET `itemname`='$itemname',`egroup`='$egroup' WHERE id='$id'; ");
  138. ShowMsg("成功修改一个分类!", "stepselect_main.php?".ExecTime());
  139. exit();
  140. }
  141. /*-----------------
  142. 保存新类型
  143. function __addnew_save() { }
  144. ------------------*/
  145. else if($action=='addnew_save')
  146. {
  147. if(preg_match("#[^0-9a-z_-]#i", $egroup))
  148. {
  149. ShowMsg("组名称不能有全角字符或特殊符号!", "-1");
  150. exit();
  151. }
  152. $arr = $dsql->GetOne("SELECT * FROM `#@__stepselect` WHERE itemname LIKE '$itemname' OR egroup LIKE '$egroup' ");
  153. if(is_array($arr))
  154. {
  155. ShowMsg("你指定的类别名称或组名称已经存在,不能使用!","stepselect_main.php");
  156. exit();
  157. }
  158. $dsql->ExecuteNoneQuery("INSERT INTO `#@__stepselect`(`itemname`,`egroup`,`issign`,`issystem`) VALUES('$itemname','$egroup','0','0'); ");
  159. WriteEnumsCache($egroup);
  160. ShowMsg("成功添加一个分类!","stepselect_main.php?egroup=$egroup");
  161. exit();
  162. }
  163. /*---------
  164. 把旧版全国省市表替换当前地区数据
  165. function __exarea() { }
  166. ----------*/
  167. else if($action=='exarea')
  168. {
  169. $bigtypes = array();
  170. $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_enum` WHERE egroup='nativeplace'; ");
  171. $query = "SELECT * FROM `#@__area` WHERE reid =0 order by id asc";
  172. $dsql->Execute('me', $query);
  173. $n = 1;
  174. while($row = $dsql->GetArray())
  175. {
  176. $bigtypes[$row['id']] = $evalue = $disorder = $n * 500;
  177. $dsql->ExecuteNoneQuery("INSERT INTO `#@__sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`)
  178. VALUES('{$row['name']}','$evalue','nativeplace','$disorder','0'); ");
  179. $n++;
  180. }
  181. $stypes = array();
  182. foreach($bigtypes as $k=>$v)
  183. {
  184. $query = "SELECT * FROM `#@__area` WHERE reid=$k order by id asc";
  185. $dsql->Execute('me', $query);
  186. $n = 1;
  187. while($row = $dsql->GetArray())
  188. {
  189. $stypes[$row['id']] = $evalue = $disorder = $v + $n;
  190. $dsql->ExecuteNoneQuery("INSERT INTO `#@__sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`)
  191. VALUES('{$row['name']}','$evalue','nativeplace','$disorder','0'); ");
  192. $n++;
  193. }
  194. }
  195. WriteEnumsCache('nativeplace');
  196. ShowMsg("成功导入所有旧的地区数据!", "stepselect_main.php?egroup=nativeplace");
  197. exit();
  198. }
  199. /*--------------------
  200. function __addenum_save() { }
  201. 关于二级枚举的说明,为了节省查询速度,二级枚举是通过特殊算法生成的,原理为
  202. 凡是能被 500 整除的都是一级枚举,(500 * n) + 1 < em < 500 * (n+1) 为下级枚举
  203. 如:1000 的下级枚举对应的值为 1001,1002,1003...1499
  204. 对于 issign=1 的,表示这个类别只有一级枚举,则不受上面的算法限制
  205. ------------------------------------------------------------------------
  206. 更新算法:
  207. 新增二级枚举下添加"-N"自己类别选择,例如:
  208. 1001二级枚举下面的3级类目,则为1001-1,1001-2...
  209. 这时候需要issign=2
  210. ---------------------*/
  211. else if($action=='addenum_save')
  212. {
  213. if(empty($ename) || empty($egroup))
  214. {
  215. Showmsg("类别名称或组名称不能为空!","-1");
  216. exit();
  217. }
  218. if($issign == 1 || $topvalue == 0)
  219. {
  220. $enames = explode(',', $ename);
  221. foreach($enames as $ename)
  222. {
  223. $arr = $dsql->GetOne("SELECT * FROM `#@__sys_enum` WHERE egroup='$egroup' AND (evalue MOD 500)=0 ORDER BY disorder DESC ");
  224. if(!is_array($arr)) $disorder = $evalue = ($issign==1 ? 1 : 500);
  225. else $disorder = $evalue = $arr['disorder'] + ($issign==1 ? 1 : 500);
  226. $dsql->ExecuteNoneQuery("INSERT INTO `#@__sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`)
  227. VALUES('$ename','$evalue','$egroup','$disorder','$issign'); ");
  228. }
  229. WriteEnumsCache($egroup);
  230. ShowMsg("成功添加枚举分类!".$dsql->GetError(), $ENV_GOBACK_URL);
  231. exit();
  232. } else if ($issign == 2 && $topvalue != 0)
  233. {
  234. $minid = $topvalue;
  235. $maxnum = 500; // 三级子类最多500个
  236. $enames = explode(',', $ename);
  237. foreach ($enames as $ename)
  238. {
  239. $arr = $dsql->GetOne("SELECT * FROM `#@__sys_enum` WHERE egroup='$egroup' AND evalue LIKE '$topvalue.%%%' ORDER BY evalue DESC ");
  240. if(!is_array($arr))
  241. {
  242. $disorder = $minid;
  243. $evalue = $minid.'.001';
  244. }
  245. else
  246. {
  247. $disorder = $minid;
  248. preg_match("#([0-9]{1,})\.([0-9]{1,})#", $arr['evalue'], $matchs);
  249. $addvalue = $matchs[2] + 1;
  250. $addvalue = sprintf("%03d", $addvalue);
  251. $evalue = $matchs[1].'.'.$addvalue;
  252. }
  253. $sql = "INSERT INTO `#@__sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`)
  254. VALUES('$ename','$evalue','$egroup','$disorder','$issign'); ";
  255. // echo $sql;exit;
  256. $dsql->ExecuteNoneQuery($sql);
  257. }
  258. // echo $minid;
  259. WriteEnumsCache($egroup);
  260. ShowMsg("成功添加枚举分类!", $ENV_GOBACK_URL);
  261. exit();
  262. } else {
  263. $minid = $topvalue;
  264. $maxid = $topvalue + 500;
  265. $enames = explode(',', $ename);
  266. foreach($enames as $ename)
  267. {
  268. $arr = $dsql->GetOne("SELECT * FROM `#@__sys_enum` WHERE egroup='$egroup' AND evalue>$minid AND evalue<$maxid ORDER BY evalue DESC ");
  269. if(!is_array($arr))
  270. {
  271. $disorder = $evalue = $minid+1;
  272. }
  273. else
  274. {
  275. $disorder = $arr['disorder']+1;
  276. $evalue = $arr['evalue']+1;
  277. }
  278. $dsql->ExecuteNoneQuery("INSERT INTO `#@__sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`)
  279. VALUES('$ename','$evalue','$egroup','$disorder','$issign'); ");
  280. }
  281. WriteEnumsCache($egroup);
  282. ShowMsg("成功添加枚举分类!", $ENV_GOBACK_URL);
  283. exit();
  284. }
  285. }
  286. /*-----------------
  287. 修改枚举名称和排序
  288. function __upenum() { }
  289. ------------------*/
  290. else if($action=='upenum')
  291. {
  292. $ename = trim(preg_replace("# └─(─){1,}#", '', $ename));
  293. $row = $dsql->GetOne("SELECT egroup FROM `#@__sys_enum` WHERE id = '$aid' ");
  294. WriteEnumsCache($row['egroup']);
  295. $dsql->ExecuteNoneQuery("UPDATE `#@__sys_enum` SET `ename`='$ename',`disorder`='$disorder' WHERE id='$aid'; ");
  296. ShowMsg("成功修改一个枚举!", $ENV_GOBACK_URL);
  297. exit();
  298. }
  299. /*-----------------
  300. 更新枚举缓存
  301. function __upallcache() { }
  302. ------------------*/
  303. else if($action=='upallcache')
  304. {
  305. if(!isset($egroup)) $egroup = '';
  306. WriteEnumsCache($egroup);
  307. ShowMsg("成更新枚举缓存!", $ENV_GOBACK_URL);
  308. exit();
  309. }