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

130 lines
5.4KB

  1. <?php
  2. /**
  3. * 修改文档模型字段
  4. *
  5. * @version $id:mychannel_field_edit.php 15:22 2010年7月20日 tianya $
  6. * @package DedeBIZ.Administrator
  7. * @copyright Copyright (c) 2022 DedeBIZ.COM
  8. * @license GNU GPL v2 (https://www.dedebiz.com/license)
  9. * @link https://www.dedebiz.com
  10. */
  11. require_once(dirname(__FILE__)."/config.php");
  12. if (DEDEBIZ_SAFE_MODE) {
  13. die(DedeAlert("系统已启用安全模式,无法使用当前功能",ALERT_DANGER));
  14. }
  15. CheckPurview('c_New');
  16. require_once(DEDEINC."/dedetag.class.php");
  17. require_once(dirname(__FILE__)."/inc/inc_admin_channel.php");
  18. if (empty($action)) $action = '';
  19. $id = isset($id) && is_numeric($id) ? $id : 0;
  20. $mysql_version = $dsql->GetVersion();
  21. //获取模型信息
  22. $row = $dsql->GetOne("SELECT fieldset,'' as maintable,addtable,issystem FROM `#@__channeltype` WHERE id='$id'");
  23. $fieldset = stripslashes($row['fieldset']);
  24. $trueTable = $row['addtable'];
  25. $dtp = new DedeTagParse();
  26. $dtp->SetNameSpace("field", "<", ">");
  27. $dtp->LoadSource($fieldset);
  28. foreach ($dtp->CTags as $ctag) {
  29. if (strtolower($ctag->GetName()) == strtolower($fname)) break;
  30. }
  31. //字段类型信息
  32. $ds = file(dirname(__FILE__)."/inc/fieldtype.txt");
  33. foreach ($ds as $d) {
  34. $dds = explode(',', trim($d));
  35. $fieldtypes[$dds[0]] = $dds[1];
  36. }
  37. //获取栏目模型
  38. $dsql->SetQuery("SELECT id,typename,nid FROM `#@__channeltype` WHERE id<>-1 AND isshow=1 ORDER BY id");
  39. $dsql->Execute();
  40. while ($crow = $dsql->GetObject()) {
  41. $channelArray[$crow->id]['typename'] = $crow->typename;
  42. $channelArray[$crow->id]['nid'] = $crow->nid;
  43. }
  44. //保存修改
  45. if ($action == 'save') {
  46. if (!isset($fieldtypes[$dtype])) {
  47. ShowMsg("您修改的是系统专用类型的数据,禁止操作", "-1");
  48. exit();
  49. }
  50. $dfvalue = $vdefault;
  51. if (preg_match("#^(select|radio|checkbox)#", $dtype)) {
  52. if (!preg_match("#,#", $dfvalue)) {
  53. ShowMsg("您设定了字段为<span class='text-primary'>{$dtype}</span>类型,必须在默认值中指定元素列表,如:'a,b,c' ", "-1");
  54. exit();
  55. }
  56. }
  57. if ($dtype == 'stepselect') {
  58. $arr = $dsql->GetOne("SELECT * FROM `#@__stepselect` WHERE egroup='$fname' ");
  59. if (!is_array($arr)) {
  60. ShowMsg("您设定了字段为联动类型,但系统中没找到与您定义的字段名相同的联动组名", "-1");
  61. exit();
  62. }
  63. }
  64. //检测数据库是否存在附加表,不存在则新建一个
  65. $tabsql = "CREATE TABLE IF NOT EXISTS `{$row['addtable']}`( `aid` int(11) NOT NULL default '0',\r\n `typeid` int(11) NOT NULL default '0',\r\n ";
  66. if ($mysql_version < 4.1) {
  67. $tabsql .= " PRIMARY KEY (`aid`), KEY `".$trueTable."_index` (`typeid`)\r\n) TYPE=MyISAM; ";
  68. } else {
  69. $tabsql .= " PRIMARY KEY (`aid`), KEY `".$trueTable."_index` (`typeid`)\r\n) ENGINE=MyISAM DEFAULT CHARSET=".$cfg_db_language."; ";
  70. }
  71. $dsql->ExecuteNoneQuery($tabsql);
  72. //检测附加表里含有的字段
  73. $fields = array();
  74. $rs = $dsql->SetQuery("SHOW fields FROM `{$row['addtable']}`");
  75. $dsql->Execute('a');
  76. while ($nrow = $dsql->GetArray('a', MYSQL_ASSOC)) {
  77. $fields[strtolower($nrow['Field'])] = $nrow['Type'];
  78. }
  79. //修改字段配置信息
  80. $isnull = ($isnull == 1 ? "true" : "false");
  81. $mxlen = $maxlength;
  82. $fieldname = strtolower($fname);
  83. //检测被修改的字段类型,并更新数据表
  84. $fieldinfos = GetFieldMake($dtype, $fieldname, $dfvalue, $mxlen);
  85. $ntabsql = $fieldinfos[0];
  86. $buideType = $fieldinfos[1];
  87. $tabsql = '';
  88. //检测旧数据类型,并替换为新配置
  89. foreach ($dtp->CTags as $tagid => $ctag) {
  90. if ($fieldname == strtolower($ctag->GetName())) {
  91. if (isset($fields[$fieldname]) && $fields[$fieldname] != $buideType) {
  92. $tabsql = "ALTER TABLE `$trueTable` CHANGE `$fieldname` ".$ntabsql;
  93. $dsql->ExecuteNoneQuery($tabsql);
  94. } else if (!isset($fields[$fieldname])) {
  95. $tabsql = "ALTER TABLE `$trueTable` ADD ".$ntabsql;
  96. $dsql->ExecuteNoneQuery($tabsql);
  97. } else {
  98. $tabsql = '';
  99. }
  100. $dtp->Assign($tagid, stripslashes($fieldstring), false);
  101. break;
  102. }
  103. }
  104. $oksetting = $dtp->GetResultNP();
  105. $addlist = GetAddFieldList($dtp, $oksetting);
  106. $oksetting = addslashes($oksetting);
  107. $dsql->ExecuteNoneQuery("UPDATE `#@__channeltype` SET fieldset='$oksetting',listfields='$addlist' WHERE id='$id' ");
  108. ShowMsg("成功修改一个字段的配置", "mychannel_edit.php?id={$id}&dopost=edit&openfield=1");
  109. exit();
  110. }
  111. //删除字段
  112. else if ($action == "delete") {
  113. if ($row['issystem'] == 1) {
  114. ShowMsg("系统模型的字段不允许删除", "-1");
  115. exit();
  116. }
  117. //检测旧数据类型,并替换为新配置
  118. foreach ($dtp->CTags as $tagid => $ctag) {
  119. if (strtolower($ctag->GetName()) == strtolower($fname)) {
  120. $dtp->Assign($tagid, "#@Delete@#");
  121. }
  122. }
  123. $oksetting = addslashes($dtp->GetResultNP());
  124. $dsql->ExecuteNoneQuery("UPDATE `#@__channeltype` SET fieldset='$oksetting' WHERE id='$id' ");
  125. $dsql->ExecuteNoneQuery("ALTER TABLE `$trueTable` DROP `$fname`");
  126. ShowMsg("成功删除一个字段", "mychannel_edit.php?id={$id}&dopost=edit&openfield=1");
  127. exit();
  128. }
  129. require_once(DEDEADMIN."/templets/mychannel_field_edit.htm");
  130. ?>