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

446 lines
21KB

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