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

173 lines
5.7KB

  1. <?php
  2. /**
  3. * 自定义模型,字段编辑
  4. *
  5. * @version $Id: mychannel_field_edit.php 1 15:22 2010年7月20日Z 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_New');
  14. require_once(DEDEINC."/dedetag.class.php");
  15. require_once(dirname(__FILE__)."/inc/inc_admin_channel.php");
  16. if(empty($action)) $action = '';
  17. $id = isset($id) && is_numeric($id) ? $id : 0;
  18. $mysql_version = $dsql->GetVersion();
  19. //获取模型信息
  20. $row = $dsql->GetOne("SELECT fieldset,'' as maintable,addtable,issystem FROM `#@__channeltype` WHERE id='$id'");
  21. $fieldset = $row['fieldset'];
  22. $trueTable = $row['addtable'];
  23. $dtp = new DedeTagParse();
  24. $dtp->SetNameSpace("field", "<", ">");
  25. $dtp->LoadSource($fieldset);
  26. foreach($dtp->CTags as $ctag)
  27. {
  28. if(strtolower($ctag->GetName())==strtolower($fname)) break;
  29. }
  30. //字段类型信息
  31. $ds = file(dirname(__FILE__)."/inc/fieldtype.txt");
  32. foreach($ds as $d)
  33. {
  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. {
  42. $channelArray[$crow->id]['typename'] = $crow->typename;
  43. $channelArray[$crow->id]['nid'] = $crow->nid;
  44. }
  45. //保存更改
  46. /*--------------------
  47. function _SAVE()
  48. ----------------------*/
  49. if($action=='save')
  50. {
  51. if(!isset($fieldtypes[$dtype]))
  52. {
  53. ShowMsg("你修改的是系统专用类型的数据,禁止操作!","-1");
  54. exit();
  55. }
  56. $dfvalue = $vdefault;
  57. if(preg_match("#^(select|radio|checkbox)#", $dtype))
  58. {
  59. if(!preg_match("#,#", $dfvalue))
  60. {
  61. ShowMsg("你设定了字段为 {$dtype} 类型,必须在默认值中指定元素列表,如:'a,b,c' ","-1");
  62. exit();
  63. }
  64. }
  65. if($dtype=='stepselect')
  66. {
  67. $arr = $dsql->GetOne("SELECT * FROM `#@__stepselect` WHERE egroup='$fname' ");
  68. if(!is_array($arr))
  69. {
  70. ShowMsg("你设定了字段为联动类型,但系统中没找到与你定义的字段名相同的联动组名!","-1");
  71. exit();
  72. }
  73. }
  74. //检测数据库是否存在附加表,不存在则新建一个
  75. $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 ";
  76. if($mysql_version < 4.1)
  77. {
  78. $tabsql .= " PRIMARY KEY (`aid`), KEY `".$trueTable."_index` (`typeid`)\r\n) TYPE=MyISAM; ";
  79. }
  80. else
  81. {
  82. $tabsql .= " PRIMARY KEY (`aid`), KEY `".$trueTable."_index` (`typeid`)\r\n) ENGINE=MyISAM DEFAULT CHARSET=".$cfg_db_language."; ";
  83. }
  84. $dsql->ExecuteNoneQuery($tabsql);
  85. //检测附加表里含有的字段
  86. $fields = array();
  87. $rs = $dsql->SetQuery("SHOW fields FROM `{$row['addtable']}`");
  88. $dsql->Execute('a');
  89. while($nrow = $dsql->GetArray('a',MYSQL_ASSOC))
  90. {
  91. $fields[ strtolower($nrow['Field']) ] = $nrow['Type'];
  92. }
  93. //修改字段配置信息
  94. $isnull = ($isnull==1 ? "true" : "false");
  95. $mxlen = $maxlength;
  96. $fieldname = strtolower($fname);
  97. //检测被修改的字段类型,并更新数据表
  98. $fieldinfos = GetFieldMake($dtype,$fieldname,$dfvalue,$mxlen);
  99. $ntabsql = $fieldinfos[0];
  100. $buideType = $fieldinfos[1];
  101. $tabsql = '';
  102. //检测旧数据类型,并替换为新配置
  103. foreach($dtp->CTags as $tagid=>$ctag)
  104. {
  105. if($fieldname==strtolower($ctag->GetName()))
  106. {
  107. if(isset($fields[$fieldname]) && $fields[$fieldname] != $buideType)
  108. {
  109. $tabsql = "ALTER TABLE `$trueTable` CHANGE `$fieldname` ".$ntabsql;
  110. $dsql->ExecuteNoneQuery($tabsql);
  111. }else if(!isset($fields[$fieldname]))
  112. {
  113. $tabsql = "ALTER TABLE `$trueTable` ADD ".$ntabsql;
  114. $dsql->ExecuteNoneQuery($tabsql);
  115. }else
  116. {
  117. $tabsql = '';
  118. }
  119. $dtp->Assign($tagid,stripslashes($fieldstring),false);
  120. break;
  121. }
  122. }
  123. $oksetting = $dtp->GetResultNP();
  124. $addlist = GetAddFieldList($dtp,$oksetting);
  125. $oksetting = addslashes($oksetting);
  126. $dsql->ExecuteNoneQuery("UPDATE `#@__channeltype` SET fieldset='$oksetting',listfields='$addlist' WHERE id='$id' ");
  127. ShowMsg("成功更改一个字段的配置!","mychannel_edit.php?id={$id}&dopost=edit&openfield=1");
  128. exit();
  129. }
  130. /*------------------
  131. 删除字段
  132. function _DELETE()
  133. -------------------*/
  134. else if($action=="delete")
  135. {
  136. if($row['issystem']==1)
  137. {
  138. ShowMsg("对不起,系统模型的字段不允许删除!","-1");
  139. exit();
  140. }
  141. //检测旧数据类型,并替换为新配置
  142. foreach($dtp->CTags as $tagid=>$ctag)
  143. {
  144. if(strtolower($ctag->GetName()) == strtolower($fname))
  145. {
  146. $dtp->Assign($tagid, "#@Delete@#");
  147. }
  148. }
  149. $oksetting = addslashes($dtp->GetResultNP());
  150. $dsql->ExecuteNoneQuery("UPDATE `#@__channeltype` SET fieldset='$oksetting' WHERE id='$id' ");
  151. $dsql->ExecuteNoneQuery("ALTER TABLE `$trueTable` DROP `$fname` ");
  152. ShowMsg("成功删除一个字段!","mychannel_edit.php?id={$id}&dopost=edit&openfield=1");
  153. exit();
  154. }
  155. require_once(DEDEADMIN."/templets/mychannel_field_edit.htm");