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

439 lines
21KB

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