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

409 lines
20KB

  1. <?php
  2. if (!defined('DEDEINC')) exit ('dedebiz');
  3. /**
  4. * 系统核心函数
  5. * @version $id:customfields.func.php 2 20:50 2010年7月7日 tianya $
  6. * @package DedeBIZ.Libraries
  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. /**
  12. * 获得一个附加表单发布时用
  13. *
  14. * @access public
  15. * @param object $ctag 标签
  16. * @param string $admintype 管理员类型
  17. * @return string
  18. */
  19. function GetFormItem($ctag, $admintype = 'admin')
  20. {
  21. $fieldname = $ctag->GetName();
  22. $fieldType = $ctag->GetAtt('type');
  23. $formitem = $formitem = GetSysTemplets("custom_fields_{$admintype}.htm");
  24. $innertext = trim($ctag->GetInnerText());
  25. if ($innertext != '') {
  26. $formitem = $innertext;
  27. }
  28. if ($fieldType == 'select') {
  29. $myformItem = '';
  30. $items = explode(',', $ctag->GetAtt("default"));
  31. $myformItem = "<select name='$fieldname' class='form-control admin-input-sm'>";
  32. foreach ($items as $v) {
  33. $v = trim($v);
  34. if ($v != '') {
  35. $myformItem .= "<option value='$v'>$v</option>";
  36. }
  37. }
  38. $myformItem .= "</select>";
  39. $innertext = $myformItem;
  40. } else if ($fieldType == 'stepselect') {
  41. global $hasSetEnumJs;
  42. $myformItem = '';
  43. $myformItem .= "<input type='hidden' id='hidden_{$fieldname}' name='{$fieldname}' value='0'>";
  44. $myformItem .= "<span id='span_{$fieldname}'></span>";
  45. $myformItem .= "<span id='span_{$fieldname}_son'></span>";
  46. $myformItem .= "<span id='span_{$fieldname}_sec'></span>";
  47. if ($hasSetEnumJs != 'hasset') {
  48. $myformItem .= '<script src="/static/web/js/enums.js"></script>'."";
  49. $GLOBALS['hasSetEnumJs'] = 'hasset';
  50. }
  51. $myformItem .= "<script>
  52. var em_{$fieldname}s = [];
  53. fetch('/static/enums/{$fieldname}.json').then((resp)=>resp.json()).then((d) => {
  54. Object.entries(d).forEach(v=>{
  55. em_{$fieldname}s[parseFloat(v[0])]= v[1];
  56. });
  57. MakeTopSelect('$fieldname', 0);
  58. })
  59. </script>";
  60. $formitem = str_replace('~name~', $ctag->GetAtt('itemname'), $formitem);
  61. $formitem = str_replace('~form~', $myformItem, $formitem);
  62. return $formitem;
  63. } else if ($fieldType == 'radio') {
  64. $myformItem = '';
  65. $items = explode(',', $ctag->GetAtt("default"));
  66. $i = 0;
  67. foreach ($items as $v) {
  68. $v = trim($v);
  69. if ($v != '') {
  70. $myformItem .= ($i == 0 ? "<div class='form-check form-check-inline'><label class='form-check-label'><input type='radio' name='$fieldname' class='form-check-input' value='$v' checked> $v</label></div>" : "<div class='form-check form-check-inline'><label class='form-check-label'><input type='radio' name='$fieldname' class='form-check-input' value='$v'> $v</label></div>");
  71. $i++;
  72. }
  73. }
  74. $innertext = $myformItem;
  75. } else if ($fieldType == 'checkbox') {
  76. $myformItem = '';
  77. $items = explode(',', $ctag->GetAtt("default"));
  78. foreach ($items as $v) {
  79. $v = trim($v);
  80. if ($v != '') {
  81. if ($admintype == 'membermodel') {
  82. $myformItem .= "<div class='form-check form-check-inline'><label class='form-check-label'><input type='checkbox' name='{$fieldname}[]' class='form-check-input' value='$v'> $v</label></div>";
  83. } else {
  84. $myformItem .= "<div class='form-check form-check-inline'><label class='form-check-label'><input type='checkbox' name='{$fieldname}[]' class='form-check-input' value='$v'> $v</label></div>";
  85. }
  86. }
  87. }
  88. $innertext = $myformItem;
  89. } else if ($fieldType == 'htmltext' || $fieldType == 'textdata') {
  90. $dfvalue = ($ctag->GetAtt('default') != '' ? $ctag->GetAtt('default') : '');
  91. $dfvalue = str_replace('{{', '<', $dfvalue);
  92. $dfvalue = str_replace('}}', '>', $dfvalue);
  93. if ($admintype == 'admin') {
  94. $innertext = GetEditor($fieldname, $dfvalue, 360, 'Basic', 'string');
  95. } else if ($admintype == 'diy') {
  96. $innertext = GetEditor($fieldname, $dfvalue, 360, 'Diy', 'string');
  97. } else {
  98. $innertext = GetEditor($fieldname, $dfvalue, 360, 'Member', 'string');
  99. }
  100. } else if ($fieldType == "multitext") {
  101. $innertext = "<textarea name='$fieldname' id='$fieldname' class='form-control admin-textarea-sm'></textarea>";
  102. } else if ($fieldType == "datetime") {
  103. $nowtime = GetDateTimeMk(time());
  104. $innertext = "<input type='text' name='$fieldname' value='$nowtime' id='$fieldname' class='form-control admin-input-lg datepicker'>";
  105. } else if ($fieldType == 'img') {
  106. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  107. $innertext = "<input type='text' name='$fieldname' id='$fieldname' class='form-control admin-input-lg' placeholder='请选择图片上传或填写图片地址'> <input type='button' name='".$fieldname."_bt' class='btn btn-success btn-sm' value='选择' onclick=\"SelectImage('$fname.$fieldname','big')\">";
  108. } else if ($fieldType == 'media') {
  109. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  110. $innertext = "<input type='text' name='$fieldname' id='$fieldname' class='form-control admin-input-lg' placeholder='请选择多媒体上传或填写多媒体地址'> <input type='button' name='".$fieldname."_bt' class='btn btn-success btn-sm' value='选择' onclick=\"SelectMedia('$fname.$fieldname')\">";
  111. } else if ($fieldType == 'addon') {
  112. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  113. $innertext = "<input type='text' name='$fieldname' id='$fieldname' class='form-control admin-input-lg' placeholder='请选择附件上传或填写附件地址'> <input type='button' name='".$fieldname."_bt' class='btn btn-success btn-sm' value='选择' onclick=\"SelectSoft('$fname.$fieldname')\">";
  114. } else if ($fieldType == 'int' || $fieldType == 'float') {
  115. $dfvalue = ($ctag->GetAtt('default') != '' ? $ctag->GetAtt('default') : '0');
  116. $innertext = "<input type='text' name='$fieldname' id='$fieldname' class='form-control admin-input-xs' value='$dfvalue'>";
  117. } else if ($fieldType == 'relation') {
  118. $dfvalue = ($ctag->GetAtt('default') != '' ? $ctag->GetAtt('default') : '');
  119. $channel = ($ctag->GetAtt('channel') == "") ? "1" : $ctag->GetAtt('channel');
  120. $innertext = "<textarea name='$fieldname' id='$fieldname' class='form-control admin-textarea-sm'>$dfvalue</textarea><br><button type='button' class='btn btn-success btn-sm' onclick='SelectArcList(\"form1.$fieldname\", $channel);'>选择关联文档</button>";
  121. if ($ctag->GetAtt('automake') == 1) {
  122. $innertext .= "<input type='hidden' name='automake[$fieldname]' value='1'>";
  123. }
  124. $innertext .= <<<EOT
  125. <script>
  126. if (typeof SelectArcList === "undefined") {
  127. function SelectArcList(fname,cid) {
  128. var posLeft = 10;
  129. var posTop = 10;
  130. window.open("content_select_list.php?f=" + fname+"&channelid="+cid, "selArcList", "scrollbars=yes,resizable=yes,statebar=no,width=800,height=500,left=" + posLeft + ", top=" + posTop);
  131. }
  132. }
  133. </script>
  134. EOT;
  135. } else {
  136. $dfvalue = ($ctag->GetAtt('default') != '' ? $ctag->GetAtt('default') : '');
  137. $innertext = "<input type='text' name='$fieldname' id='$fieldname' class='form-control admin-input-lg' value='$dfvalue'>
  138. ";
  139. }
  140. $formitem = str_replace("~name~", $ctag->GetAtt('itemname'), $formitem);
  141. $formitem = str_replace("~form~", $innertext, $formitem);
  142. return $formitem;
  143. }
  144. /**
  145. * 处理不同类型的数据
  146. *
  147. * @access public
  148. * @param string $dvalue 默认值
  149. * @param string $dtype 默认类型
  150. * @param int $aid 文档id
  151. * @param string $job 操作类型
  152. * @param string $addvar 值
  153. * @param string $admintype 管理类型
  154. * @param string $fieldname 变量类型
  155. * @return string
  156. */
  157. function GetFieldValue($dvalue, $dtype, $aid = 0, $job = 'add', $addvar = '', $admintype = 'admin', $fieldname = '')
  158. {
  159. global $cfg_basedir, $adminid, $cfg_ml, $cfg_cookie_encode;
  160. if (!empty($adminid)) {
  161. $adminid = $adminid;
  162. } else {
  163. $adminid = isset($cfg_ml) ? $cfg_ml->M_ID : 1;
  164. }
  165. if ($dtype == 'int') {
  166. if ($dvalue == '') {
  167. return 0;
  168. }
  169. return GetAlabNum($dvalue);
  170. } else if ($dtype == 'relation') {
  171. $dvalue = trim(preg_replace("#[^0-9,]#", "", $dvalue));
  172. return $dvalue;
  173. } else if ($dtype == 'stepselect') {
  174. $dvalue = trim(preg_replace("#[^0-9\.]#", "", $dvalue));
  175. return $dvalue;
  176. } else if ($dtype == 'float') {
  177. if ($dvalue == '') {
  178. return 0;
  179. }
  180. return GetAlabNum($dvalue);
  181. } else if ($dtype == 'datetime') {
  182. if ($dvalue == '') {
  183. return 0;
  184. }
  185. return GetMkTime($dvalue);
  186. } else if ($dtype == 'checkbox') {
  187. $okvalue = '';
  188. if (is_array($dvalue)) {
  189. $okvalue = join(',', $dvalue);
  190. }
  191. return $okvalue;
  192. } else if ($dtype == "htmltext") {
  193. if ($admintype == 'member' || $admintype == 'diy') {
  194. $dvalue = HtmlReplace($dvalue, -1);
  195. }
  196. return $dvalue;
  197. } else if ($dtype == "multitext") {
  198. if ($admintype == 'member' || $admintype == 'diy') {
  199. $dvalue = HtmlReplace($dvalue, 0);
  200. }
  201. return $dvalue;
  202. } else if ($dtype == "textdata") {
  203. $ipath = '/data/textdata';
  204. $tpath = ceil($aid / 5000);
  205. if (!is_dir($cfg_basedir.$ipath)) {
  206. MkdirAll($cfg_basedir.$ipath, $GLOBALS['cfg_dir_purview']);
  207. }
  208. if (!is_dir($cfg_basedir.$ipath.'/'.$tpath)) {
  209. MkdirAll($cfg_basedir.$ipath.'/'.$tpath, $GLOBALS['cfg_dir_purview']);
  210. }
  211. $ipath = $ipath.'/'.$tpath;
  212. $filename = "{$ipath}/{$aid}-".cn_substr(md5($cfg_cookie_encode), 0, 16).".txt";
  213. //会员投稿文档安全处理
  214. if ($admintype == 'member' || $admintype == 'diy') {
  215. $dvalue = HtmlReplace($dvalue, -1);
  216. }
  217. $fp = fopen($cfg_basedir.$filename, "w");
  218. fwrite($fp, stripslashes($dvalue));
  219. fclose($fp);
  220. return $filename;
  221. } else if ($dtype == 'img' || $dtype == 'imgfile') {
  222. return addslashes($dvalue);
  223. } else if ($dtype == 'addon' && $admintype == 'diy') {
  224. if ($admintype == 'diy') {
  225. return addslashes($dvalue);
  226. }
  227. $dvalue = MemberUploads($fieldname, '', 0, 'addon', '', -1, -1, false);
  228. return $dvalue;
  229. } else {
  230. if ($admintype == 'member' || $admintype == 'diy') {
  231. $dvalue = HtmlReplace($dvalue, 1);
  232. }
  233. return $dvalue;
  234. }
  235. }
  236. /**
  237. * 获得带值的表单修改时用
  238. *
  239. * @access public
  240. * @param object $ctag 标签
  241. * @param mixed $fvalue 变量值
  242. * @param string $admintype 会员类型
  243. * @param string $fieldname 变量名称
  244. * @return string
  245. */
  246. function GetFormItemValue($ctag, $fvalue, $admintype = 'admin', $fieldname = '')
  247. {
  248. global $cfg_basedir;
  249. $fieldname = $ctag->GetName();
  250. $formitem = $formitem = GetSysTemplets("custom_fields_{$admintype}.htm");
  251. $innertext = trim($ctag->GetInnerText());
  252. if ($innertext != '') {
  253. $formitem = $innertext;
  254. }
  255. $ftype = $ctag->GetAtt('type');
  256. $myformItem = '';
  257. if (preg_match("/select|radio|checkbox/i", $ftype)) {
  258. $items = explode(',', $ctag->GetAtt('default'));
  259. }
  260. if ($ftype == 'select') {
  261. $myformItem = "<select name='$fieldname' class='form-control admin-input-sm'>";
  262. if (is_array($items)) {
  263. foreach ($items as $v) {
  264. $v = trim($v);
  265. if ($v == '') {
  266. continue;
  267. }
  268. $myformItem .= ($fvalue == $v ? "<option value='$v' selected>$v</option>" : "<option value='$v'>$v</option>");
  269. }
  270. }
  271. $myformItem .= "</select>";
  272. $innertext = $myformItem;
  273. } else if ($ctag->GetAtt("type") == 'stepselect') {
  274. global $hasSetEnumJs;
  275. $myformItem = '';
  276. $myformItem .= "<input type='hidden' id='hidden_{$fieldname}' name='{$fieldname}' value='{$fvalue}'>";
  277. $myformItem .= "<span id='span_{$fieldname}'></span>";
  278. $myformItem .= "<span id='span_{$fieldname}_son'></span>";
  279. $myformItem .= "<span id='span_{$fieldname}_sec'></span>";
  280. if ($hasSetEnumJs != 'hasset') {
  281. $myformItem .= '<script src="/static/web/js/enums.js"></script>'."";
  282. $GLOBALS['hasSetEnumJs'] = 'hasset';
  283. }
  284. $myformItem .= "<script>
  285. var em_{$fieldname}s = [];
  286. fetch('/static/enums/{$fieldname}.json').then((resp)=>resp.json()).then((d) => {
  287. Object.entries(d).forEach(v=>{
  288. em_{$fieldname}s[parseFloat(v[0])]= v[1];
  289. });
  290. MakeTopSelect('$fieldname', $fvalue);
  291. })
  292. </script>";
  293. $formitem = str_replace('~name~', $ctag->GetAtt('itemname'), $formitem);
  294. $formitem = str_replace('~form~', $myformItem, $formitem);
  295. return $formitem;
  296. } else if ($ftype == 'radio') {
  297. if (is_array($items)) {
  298. foreach ($items as $v) {
  299. $v = trim($v);
  300. if ($v == '') continue;
  301. $myformItem .= ($fvalue == $v ? "<div class='form-check form-check-inline'><label class='form-check-label'><input type='radio' name='$fieldname' class='form-check-input' value='$v' checked> $v</label></div>" : "<div class='form-check form-check-inline'><label class='form-check-label'><input type='radio' name='$fieldname' class='form-check-input' value='$v'> $v</label></div>");
  302. }
  303. }
  304. $innertext = $myformItem;
  305. }
  306. //checkbox
  307. else if ($ftype == 'checkbox') {
  308. $myformItem = '';
  309. $fvalues = explode(',', $fvalue);
  310. if (is_array($items)) {
  311. foreach ($items as $v) {
  312. $v = trim($v);
  313. if ($v == '') {
  314. continue;
  315. }
  316. if (in_array($v, $fvalues)) {
  317. $myformItem .= "<div class='form-check form-check-inline'><label class='form-check-label'><input type='checkbox' name='{$fieldname}[]' class='form-check-input' value='$v' checked> $v</label></div>";
  318. } else {
  319. $myformItem .= "<div class='form-check form-check-inline'><label class='form-check-label'><input type='checkbox' name='{$fieldname}[]' class='form-check-input' value='$v'> $v</label></div>";
  320. }
  321. }
  322. }
  323. $innertext = $myformItem;
  324. }
  325. //文本数据的特殊处理
  326. else if ($ftype == "textdata") {
  327. if (is_file($cfg_basedir.$fvalue)) {
  328. $fp = fopen($cfg_basedir.$fvalue, 'r');
  329. $okfvalue = '';
  330. while (!feof($fp)) {
  331. $okfvalue .= fgets($fp, 1024);
  332. }
  333. fclose($fp);
  334. } else {
  335. $okfvalue = '';
  336. }
  337. if ($admintype == 'admin') {
  338. $myformItem = GetEditor($fieldname, $okfvalue, 360, 'Basic', 'string')." <input type='hidden' name='{$fieldname}_file' value='{$fvalue}'> ";
  339. } else {
  340. $myformItem = GetEditor($fieldname, $okfvalue, 360, 'Member', 'string')." <input type='hidden' name='{$fieldname}_file' value='{$fvalue}'> ";
  341. }
  342. $innertext = $myformItem;
  343. } else if ($ftype == "htmltext") {
  344. if ($admintype == 'admin') {
  345. $myformItem = GetEditor($fieldname, $fvalue, 360, 'Basic', 'string')." ";
  346. } else {
  347. $myformItem = GetEditor($fieldname, $fvalue, 360, 'Member', 'string')." ";
  348. }
  349. $innertext = $myformItem;
  350. } else if ($ftype == "multitext") {
  351. $innertext = "<textarea name='$fieldname' id='$fieldname' class='form-control admin-textarea-sm'>$fvalue</textarea>";
  352. } else if ($ftype == "datetime") {
  353. $nowtime = GetDateTimeMk($fvalue);
  354. $innertext = "<input type='text' name='$fieldname' value='$nowtime' id='$fieldname' class='form-control admin-input-lg'>";
  355. } else if ($ftype == "img") {
  356. $tmpValue = $fvalue;
  357. $ndtp = new DedeTagParse();
  358. $ndtp->LoadSource($fvalue);
  359. if (!is_array($ndtp->CTags)) {
  360. $ndtp->Clear();
  361. $fvalue = "";
  362. } else {
  363. $ntag = $ndtp->GetTag("img");
  364. if (!empty($ntag)) {
  365. $fvalue = trim($ntag->GetInnerText());
  366. }
  367. }
  368. $fvalue = empty($fvalue)? $tmpValue : $fvalue;
  369. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  370. $innertext = "<input type='text' name='$fieldname' value='$fvalue' id='$fieldname' class='form-control admin-input-lg'> <input type='button' name='".$fieldname."_bt' class='btn btn-success btn-sm' value='选择' onclick=\"SelectImage('$fname.$fieldname','big')\">";
  371. } else if ($ftype == "imgfile") {
  372. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  373. $innertext = "<input type='text' name='$fieldname' value='$fvalue' id='$fieldname' class='form-control admin-input-lg'>";
  374. } else if ($ftype == "media") {
  375. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  376. $selectStr = "<input type='button' name='".$fieldname."_bt' class='btn btn-success btn-sm' value='选择' onclick=\"SelectMedia('$fname.$fieldname')\">";
  377. $innertext = "<input type='text' name='$fieldname' value='$fvalue' id='$fieldname' class='form-control admin-input-lg'> $selectStr";
  378. } else if ($ftype == "addon") {
  379. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  380. $selectStr = "<input type='button' name='".$fieldname."_bt' class='btn btn-success btn-sm' value='选择' onclick=\"SelectSoft('$fname.$fieldname')\">";
  381. $innertext = "<input type='text' name='$fieldname' id='$fieldname' value='$fvalue' class='form-control admin-input-lg'> $selectStr";
  382. } else if ($ftype == "int" || $ftype == "float") {
  383. $innertext = "<input type='text' name='$fieldname' id='$fieldname' class='form-control admin-input-xs' value='$fvalue'>";
  384. } else if ($ftype == "relation") {
  385. $fname = defined('DEDEADMIN')? 'form1' : 'addcontent';
  386. $channel = ($ctag->GetAtt('channel') == "") ? "1" : $ctag->GetAtt('channel');
  387. $innertext = "<textarea name='$fieldname' id='$fieldname' class='form-control admin-textarea-sm'>$fvalue</textarea><br><button type='button' class='btn btn-success btn-sm' onclick='SelectArcList(\"$fname.$fieldname\", $channel);'>选择关联文档</button>";
  388. if ($ctag->GetAtt('automake') == 1) {
  389. $innertext .= "<input type='hidden' name='automake[$fieldname]' value='1'>";
  390. }
  391. $innertext .= <<<EOT
  392. <script>
  393. if (typeof SelectArcList === "undefined") {
  394. function SelectArcList(fname,cid) {
  395. var posLeft = 10;
  396. var posTop = 10;
  397. window.open("content_select_list.php?f=" + fname+"&channelid="+cid, "selArcList", "scrollbars=yes,resizable=yes,statebar=no,width=800,height=500,left=" + posLeft + ", top=" + posTop);
  398. }
  399. }
  400. </script>
  401. EOT;
  402. } else {
  403. $innertext = "<input type='text' name='$fieldname' id='$fieldname' class='form-control admin-input-lg' value='$fvalue'>";
  404. }
  405. $formitem = str_replace('~name~', $ctag->GetAtt('itemname'), $formitem);
  406. $formitem = str_replace('~form~', $innertext, $formitem);
  407. return $formitem;
  408. }
  409. ?>