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

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