国内流行的内容管理系统(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.

232 lines
10KB

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