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

121 lines
4.7KB

  1. <?php
  2. /**
  3. * 添加自定义模型字段
  4. *
  5. * @version $id:mychannel_field_add.php 15:07 2010年7月20日 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_New');
  13. require_once(DEDEADMIN."/inc/inc_admin_channel.php");
  14. require_once(DEDEINC."/dedetag.class.php");
  15. if (empty($action)) $action = '';
  16. $mysql_version = $dsql->GetVersion();
  17. if ($action == 'save') {
  18. //修改字段配置信息
  19. $dfvalue = trim($vdefault);
  20. $isnull = ($isnull == 1 ? "true" : "false");
  21. $mxlen = $maxlength;
  22. if (preg_match("#^(select|radio|checkbox)$#i", $dtype)) {
  23. if (!preg_match("#,#", $dfvalue)) {
  24. ShowMsg("您设定了字段为<span class='text-primary'>{$dtype}</span>类型,必须在默认值中指定元素列表,如:'a,b,c' ", "-1");
  25. exit();
  26. }
  27. }
  28. if ($dtype == 'stepselect') {
  29. $arr = $dsql->GetOne("SELECT * FROM `#@__stepselect` WHERE egroup='$fieldname' ");
  30. if (!is_array($arr)) {
  31. ShowMsg("您设定了字段为联动类型,但系统中没找到与您定义的字段名相同的联动组名", "-1");
  32. exit();
  33. }
  34. }
  35. //模型信息
  36. $row = $dsql->GetOne("SELECT fieldset,addtable,issystem FROM `#@__channeltype` WHERE id='$id'");
  37. $fieldset = stripslashes($row['fieldset']);
  38. $dtp = new DedeTagParse();
  39. $dtp->SetNameSpace("field", "<", ">");
  40. $dtp->LoadSource($fieldset);
  41. $trueTable = $row['addtable'];
  42. //检测被修改的字段类型
  43. $fieldinfos = GetFieldMake($dtype, $fieldname, $dfvalue, $mxlen);
  44. $ntabsql = $fieldinfos[0];
  45. $buideType = $fieldinfos[1];
  46. $rs = $dsql->ExecuteNoneQuery("ALTER TABLE `$trueTable` ADD $ntabsql ");
  47. if (!$rs) {
  48. $gerr = $dsql->GetError();
  49. ShowMsg("增加字段失败,错误提示为:".$gerr, "javascript:;");
  50. exit();
  51. }
  52. //检测旧配置信息,并替换为新配置
  53. $ok = FALSE;
  54. $fieldname = strtolower($fieldname);
  55. if (is_array($dtp->CTags)) {
  56. foreach ($dtp->CTags as $tagid => $ctag) {
  57. if ($fieldname == strtolower($ctag->GetName())) {
  58. $dtp->Assign($tagid, stripslashes($fieldstring), FALSE);
  59. $ok = true;
  60. break;
  61. }
  62. }
  63. $oksetting = $ok ? $dtp->GetResultNP() : $fieldset."\n".stripslashes($fieldstring);
  64. } else {
  65. $oksetting = $fieldset."\r\n".stripslashes($fieldstring);
  66. }
  67. $addlist = GetAddFieldList($dtp, $oksetting);
  68. $oksetting = addslashes($oksetting);
  69. $rs = $dsql->ExecuteNoneQuery("UPDATE `#@__channeltype` SET fieldset='$oksetting',listfields='$addlist' WHERE id='$id' ");
  70. if (!$rs) {
  71. $grr = $dsql->GetError();
  72. ShowMsg("保存节点配置出错".$grr, "javascript:;");
  73. exit();
  74. }
  75. ShowMsg("成功增加一个字段", "mychannel_edit.php?id={$id}&dopost=edit&openfield=1");
  76. exit();
  77. }
  78. //检测模型相关信息,并初始化相关数据
  79. $row = $dsql->GetOne("SELECT '#@__archives' AS maintable,addtable FROM `#@__channeltype` WHERE id='$id'");
  80. $trueTable = $row['addtable'];
  81. $tabsql = "CREATE TABLE IF NOT EXISTS `$trueTable`( `aid` int(11) NOT NULL default '0',\r\n `typeid` int(11) NOT NULL default '0',\r\n ";
  82. if ($mysql_version < 4.1) {
  83. $tabsql .= " PRIMARY KEY (`aid`), KEY `".$trueTable."_index` (`typeid`)\r\n) TYPE=MyISAM; ";
  84. } else {
  85. $tabsql .= " PRIMARY KEY (`aid`), KEY `".$trueTable."_index` (`typeid`)\r\n) ENGINE=MyISAM DEFAULT CHARSET=".$cfg_db_language."; ";
  86. }
  87. $dsql->ExecuteNoneQuery($tabsql);
  88. //检测附加表里含有的字段
  89. $fields = array();
  90. if (empty($row['maintable'])) $row['maintable'] = '#@__archives';
  91. $rs = $dsql->SetQuery("SHOW fields FROM `{$row['maintable']}`");
  92. $dsql->Execute('a');
  93. while ($nrow = $dsql->GetArray('a', MYSQL_ASSOC)) {
  94. if ($cfg_dbtype == 'sqlite') {
  95. $nrow['Field'] = $nrow['name'];
  96. }
  97. $fields[strtolower($nrow['Field'])] = 1;
  98. }
  99. $dsql->Execute("a", "SHOW fields FROM `{$row['addtable']}`");
  100. while ($nrow = $dsql->GetArray('a', MYSQL_ASSOC)) {
  101. if ($cfg_dbtype == 'sqlite') {
  102. $nrow['Field'] = $nrow['name'];
  103. }
  104. if (!isset($fields[strtolower($nrow['Field'])])) {
  105. $fields[strtolower($nrow['Field'])] = 1;
  106. }
  107. }
  108. $f = '';
  109. foreach ($fields as $k => $v) {
  110. $f .= ($f == '' ? $k : ' '.$k);
  111. }
  112. //获取栏目模型
  113. $dsql->SetQuery("SELECT id,typename,nid FROM `#@__channeltype` WHERE id<>-1 AND isshow=1 ORDER BY id");
  114. $dsql->Execute();
  115. while ($row = $dsql->GetObject()) {
  116. $channelArray[$row->id]['typename'] = $row->typename;
  117. $channelArray[$row->id]['nid'] = $row->nid;
  118. }
  119. require_once(DEDEADMIN."/templets/mychannel_field_add.htm");
  120. ?>