TagLibHtml.class.php 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. /**
  12. +------------------------------------------------------------------------------
  13. * HTML标签库解析类
  14. +------------------------------------------------------------------------------
  15. * @category Think
  16. * @package Think
  17. * @subpackage Template
  18. * @author liu21st <liu21st@gmail.com>
  19. * @version $Id$
  20. +------------------------------------------------------------------------------
  21. */
  22. import('TagLib');
  23. class TagLibHtml extends TagLib
  24. {//类定义开始
  25. public function _initialize() {
  26. $this->xml = dirname(__FILE__).'/Tags/html.xml';
  27. }
  28. /**
  29. +----------------------------------------------------------
  30. * editor标签解析 插入可视化编辑器
  31. * 格式: <html:editor id="editor" name="remark" type="FCKeditor" content="{$vo.remark}" />
  32. +----------------------------------------------------------
  33. * @access public
  34. +----------------------------------------------------------
  35. * @param string $attr 标签属性
  36. +----------------------------------------------------------
  37. * @return string|void
  38. +----------------------------------------------------------
  39. */
  40. public function _editor($attr)
  41. {
  42. $tag = $this->parseXmlAttr($attr,'editor');
  43. $id = !empty($tag['id'])?$tag['id']: '_editor';
  44. $name = $tag['name'];
  45. $style = !empty($tag['style'])?$tag['style']:'width:750px; height:350px;';
  46. $width = !empty($tag['width'])?$tag['width']: '100%';
  47. $height = !empty($tag['height'])?$tag['height'] :'320px';
  48. $content = $tag['content'];
  49. $type = $tag['type'] ;
  50. switch(strtoupper($type)) {
  51. case 'FCKEDITOR':
  52. $parseStr = '<!-- 编辑器调用开始 --><script type="text/javascript" src="__ROOT__/Public/Js/FCKeditor/fckeditor.js"></script><textarea id="'.$id.'" name="'.$name.'">'.$content.'</textarea><script type="text/javascript"> var oFCKeditor = new FCKeditor( "'.$id.'","'.$width.'","'.$height.'" ) ; oFCKeditor.BasePath = "__ROOT__/Public/Js/FCKeditor/" ; oFCKeditor.ReplaceTextarea() ;function resetEditor(){setContents("'.$id.'",document.getElementById("'.$id.'").value)}; function saveEditor(){document.getElementById("'.$id.'").value = getContents("'.$id.'");} function InsertHTML(html){ var oEditor = FCKeditorAPI.GetInstance("'.$id.'") ;if (oEditor.EditMode == FCK_EDITMODE_WYSIWYG ){oEditor.InsertHtml(html) ;}else alert( "FCK必须处于WYSIWYG模式!" ) ;}</script> <!-- 编辑器调用结束 -->';
  53. break;
  54. case 'EWEBEDITOR':
  55. $parseStr = "<!-- 编辑器调用开始 --><script type='text/javascript' src='__ROOT__/Public/Js/eWebEditor/js/edit.js'></script><input type='hidden' id='{$id}' name='{$name}' value='{$conent}'><iframe src='__ROOT__/Public/Js/eWebEditor/ewebeditor.htm?id={$name}' frameborder=0 scrolling=no width='{$width}' height='{$height}'></iframe><script type='text/javascript'>function saveEditor(){document.getElementById('{$id}').value = getHTML();} </script><!-- 编辑器调用结束 -->";
  56. break;
  57. case 'NETEASE':
  58. $parseStr = '<!-- 编辑器调用开始 --><textarea id="'.$id.'" name="'.$name.'" style="display:none">'.$content.'</textarea><iframe ID="Editor" name="Editor" src="__ROOT__/Public/Js/HtmlEditor/index.html?ID='.$name.'" frameBorder="0" marginHeight="0" marginWidth="0" scrolling="No" style="height:'.$height.';width:'.$width.'"></iframe><!-- 编辑器调用结束 -->';
  59. break;
  60. case 'UBB':
  61. $parseStr = '<script type="text/javascript" src="__ROOT__/Public/Js/UbbEditor.js"></script><div style="padding:1px;width:'.$width.';border:1px solid silver;float:left;"><script LANGUAGE="JavaScript"> showTool(); </script></div><div><TEXTAREA id="UBBEditor" name="'.$name.'" style="clear:both;float:none;width:'.$width.';height:'.$height.'" >'.$content.'</TEXTAREA></div><div style="padding:1px;width:'.$width.';border:1px solid silver;float:left;"><script LANGUAGE="JavaScript">showEmot(); </script></div>';
  62. break;
  63. case 'KINDEDITOR':
  64. /*$parseStr="<script type='text/javascript'> var editer_$id;".
  65. "KindEditor.ready(function(K) {".
  66. "editer_$id = K.create('textarea#$id', {" .
  67. "allowFileManager : true" .
  68. "});".
  69. "});".
  70. "</script>";*/
  71. $parseStr.="<div style='margin-bottom:5px; '><textarea id='".$id."' name='".$name."' class='ketext' style='".$style."' >".$content."</textarea> </div>";
  72. break;
  73. case 'MAILEDITOR':
  74. /*$parseStr="<script type='text/javascript'> var editer_$id;" .
  75. "KindEditor.ready(function(K) {".
  76. "editer_$id = K.create('textarea#$id', {" .
  77. "allowFileManager : true" .
  78. "skinType: 'tinymce',".
  79. "urlType : 'domain',".
  80. "resizeMode : 0".
  81. "});" .
  82. "});".
  83. "</script>";*/
  84. $parseStr.="<div style='margin-bottom:5px; '><textarea id='".$id."' name='".$name."' style='".$style."' >".$content."</textarea> </div>";
  85. break;
  86. default :
  87. $parseStr = '<textarea id="'.$id.'" style="'.$style.'" name="'.$name.'" >'.$content.'</textarea>';
  88. }
  89. return $parseStr;
  90. }
  91. /**
  92. +----------------------------------------------------------
  93. * link标签解析
  94. * 格式: <html:link file="" type="" />
  95. +----------------------------------------------------------
  96. * @access public
  97. +----------------------------------------------------------
  98. * @param string $attr 标签属性
  99. +----------------------------------------------------------
  100. * @return string|void
  101. +----------------------------------------------------------
  102. */
  103. public function _link($attr)
  104. {
  105. $tag = $this->parseXmlAttr($attr,'link');
  106. $file = $tag['href'];
  107. $type = isset($tag['type'])?
  108. strtolower($tag['type']):
  109. strtolower(substr(strrchr($file, '.'),1));
  110. if($type=='js') {
  111. $parseStr = "<script type='text/javascript' src='".$file."'></script> ";
  112. }elseif($type=='css') {
  113. $parseStr = "<link rel='stylesheet' type='text/css' href='".$file."' />";
  114. }
  115. return $parseStr;
  116. }
  117. /**
  118. +----------------------------------------------------------
  119. * link标签解析
  120. * 格式: <html:link file="" type="" />
  121. +----------------------------------------------------------
  122. * @access public
  123. +----------------------------------------------------------
  124. * @param string $attr 标签属性
  125. +----------------------------------------------------------
  126. * @return string|void
  127. +----------------------------------------------------------
  128. */
  129. public function _import($attr)
  130. {
  131. $tag = $this->parseXmlAttr($attr,'import');
  132. $file = $tag['file'];
  133. $basepath = !empty($tag['basepath'])?$tag['basepath']:WEB_PUBLIC_PATH;
  134. $type = !empty($tag['type'])? strtolower($tag['type']):'js';
  135. if($type=='js') {
  136. $parseStr = "<script type='text/javascript' src='".$basepath.'/'.str_replace(array('.','#'), array('/','.'),$file).'.js'."'></script> ";
  137. }elseif($type=='css') {
  138. $parseStr = "<link rel='stylesheet' type='text/css' href='".$basepath.'/'.str_replace(array('.','#'), array('/','.'),$file).'.css'."' />";
  139. }
  140. return $parseStr;
  141. }
  142. /**
  143. +----------------------------------------------------------
  144. * imageBtn标签解析
  145. * 格式: <html:imageBtn type="" value="" />
  146. +----------------------------------------------------------
  147. * @access public
  148. +----------------------------------------------------------
  149. * @param string $attr 标签属性
  150. +----------------------------------------------------------
  151. * @return string|void
  152. +----------------------------------------------------------
  153. */
  154. public function _imageBtn($attr)
  155. {
  156. $tag = $this->parseXmlAttr($attr,'imageBtn');
  157. $name = $tag['name']; //名称
  158. $value = $tag['value']; //文字
  159. $id = $tag['id']; //ID
  160. $style = $tag['style']; //样式名
  161. $click = $tag['click']; //点击
  162. $type = empty($tag['type'])?'button':$tag['type']; //按钮类型
  163. if(!empty($name)) {
  164. $parseStr = '<div class="'.$style.'" ><input type="'.$type.'" id="'.$id.'" name="'.$name.'" value="'.$value.'" onclick="'.$click.'" class="'.$name.' imgButton"></div>';
  165. }else {
  166. $parseStr = '<div class="'.$style.'" ><input type="'.$type.'" id="'.$id.'" name="'.$name.'" value="'.$value.'" onclick="'.$click.'" class="button"></div>';
  167. }
  168. return $parseStr;
  169. }
  170. /**
  171. +----------------------------------------------------------
  172. * imageLink标签解析
  173. * 格式: <html:imageLink type="" value="" />
  174. +----------------------------------------------------------
  175. * @access public
  176. +----------------------------------------------------------
  177. * @param string $attr 标签属性
  178. +----------------------------------------------------------
  179. * @return string|void
  180. +----------------------------------------------------------
  181. */
  182. public function _imgLink($attr)
  183. {
  184. $tag = $this->parseXmlAttr($attr,'imgLink');
  185. $name = $tag['name']; //名称
  186. $alt = $tag['alt']; //文字
  187. $id = $tag['id']; //ID
  188. $style = $tag['style']; //样式名
  189. $click = $tag['click']; //点击
  190. $type = $tag['type']; //点击
  191. if(empty($type)) {
  192. $type = 'button';
  193. }
  194. $parseStr = '<span class="'.$style.'" ><input title="'.$alt.'" type="'.$type.'" id="'.$id.'" name="'.$name.'" onmouseover="this.style.filter=\'alpha(opacity=100)\'" onmouseout="this.style.filter=\'alpha(opacity=80)\'" onclick="'.$click.'" align="absmiddle" class="'.$name.' imgLink"></span>';
  195. return $parseStr;
  196. }
  197. /**
  198. +----------------------------------------------------------
  199. * select标签解析
  200. * 格式: <html:select options="name" selected="value" />
  201. +----------------------------------------------------------
  202. * @access public
  203. +----------------------------------------------------------
  204. * @param string $attr 标签属性
  205. +----------------------------------------------------------
  206. * @return string|void
  207. +----------------------------------------------------------
  208. */
  209. public function _select($attr)
  210. {
  211. $tag = $this->parseXmlAttr($attr,'select');
  212. $name = $tag['name'];
  213. $options = $tag['options'];
  214. $values = $tag['values'];
  215. $output = $tag['output'];
  216. $multiple = $tag['multiple'];
  217. $id = $tag['id'];
  218. $size = $tag['size'];
  219. $first = $tag['first'];
  220. $selected = $tag['selected'];
  221. $style = $tag['style'];
  222. $ondblclick = $tag['dblclick'];
  223. $onchange = $tag['change'];
  224. if(!empty($multiple)) {
  225. $parseStr = '<select id="'.$id.'" name="'.$name.'" ondblclick="'.$ondblclick.'" onchange="'.$onchange.'" multiple="multiple" class="'.$style.'" size="'.$size.'" >';
  226. }else {
  227. $parseStr = '<select id="'.$id.'" name="'.$name.'" onchange="'.$onchange.'" ondblclick="'.$ondblclick.'" class="'.$style.'" >';
  228. }
  229. if(!empty($first)) {
  230. $parseStr .= '<option value="" >'.$first.'</option>';
  231. }
  232. if(!empty($options)) {
  233. $parseStr .= '<?php foreach($'.$options.' as $key=>$val) { ?>';
  234. if(!empty($selected)) {
  235. $parseStr .= '<?php if(!empty($'.$selected.') && ($'.$selected.' == $key || in_array($key,$'.$selected.'))) { ?>';
  236. $parseStr .= '<option selected="selected" value="<?php echo $key ?>"><?php echo $val ?></option>';
  237. $parseStr .= '<?php }else { ?><option value="<?php echo $key ?>"><?php echo $val ?></option>';
  238. $parseStr .= '<?php } ?>';
  239. }else {
  240. $parseStr .= '<option value="<?php echo $key ?>"><?php echo $val ?></option>';
  241. }
  242. $parseStr .= '<?php } ?>';
  243. }else if(!empty($values)) {
  244. $parseStr .= '<?php for($i=0;$i<count($'.$values.');$i++) { ?>';
  245. if(!empty($selected)) {
  246. $parseStr .= '<?php if(isset($'.$selected.') && ((is_string($'.$selected.') && $'.$selected.' == $'.$values.'[$i]) || (is_array($'.$selected.') && in_array($'.$values.'[$i],$'.$selected.')))) { ?>';
  247. $parseStr .= '<option selected="selected" value="<?php echo $'.$values.'[$i] ?>"><?php echo $'.$output.'[$i] ?></option>';
  248. $parseStr .= '<?php }else { ?><option value="<?php echo $'.$values.'[$i] ?>"><?php echo $'.$output.'[$i] ?></option>';
  249. $parseStr .= '<?php } ?>';
  250. }else {
  251. $parseStr .= '<option value="<?php echo $'.$values.'[$i] ?>"><?php echo $'.$output.'[$i] ?></option>';
  252. }
  253. $parseStr .= '<?php } ?>';
  254. }
  255. $parseStr .= '</select>';
  256. return $parseStr;
  257. }
  258. /**
  259. +----------------------------------------------------------
  260. * checkbox标签解析
  261. * 格式: <html:checkbox checkboxs="" checked="" />
  262. +----------------------------------------------------------
  263. * @access public
  264. +----------------------------------------------------------
  265. * @param string $attr 标签属性
  266. +----------------------------------------------------------
  267. * @return string|void
  268. +----------------------------------------------------------
  269. */
  270. public function _checkbox($attr)
  271. {
  272. $tag = $this->parseXmlAttr($attr,'checkbox');
  273. $name = $tag['name'];
  274. $checkboxes = $tag['checkboxes'];
  275. $checked = $tag['checked'];
  276. $separator = $tag['separator'];
  277. $checkboxes = $this->tpl->get($checkboxes);
  278. $checked = $this->tpl->get($checked)?$this->tpl->get($checked):$checked;
  279. $parseStr = '';
  280. foreach($checkboxes as $key=>$val) {
  281. if($checked == $key || in_array($key,$checked) ) {
  282. $parseStr .= '<input type="checkbox" checked="checked" name="'.$name.'[]" value="'.$key.'">'.$val.$separator;
  283. }else {
  284. $parseStr .= '<input type="checkbox" name="'.$name.'[]" value="'.$key.'">'.$val.$separator;
  285. }
  286. }
  287. return $parseStr;
  288. }
  289. /**
  290. +----------------------------------------------------------
  291. * radio标签解析
  292. * 格式: <html:radio radios="name" checked="value" />
  293. +----------------------------------------------------------
  294. * @access public
  295. +----------------------------------------------------------
  296. * @param string $attr 标签属性
  297. +----------------------------------------------------------
  298. * @return string|void
  299. +----------------------------------------------------------
  300. */
  301. public function _radio($attr)
  302. {
  303. $tag = $this->parseXmlAttr($attr,'radio');
  304. $name = $tag['name'];
  305. $radios = $tag['radios'];
  306. $checked = $tag['checked'];
  307. $separator = $tag['separator'];
  308. $radios = $this->tpl->get($radios);
  309. $checked = $this->tpl->get($checked)?$this->tpl->get($checked):$checked;
  310. $parseStr = '';
  311. foreach($radios as $key=>$val) {
  312. if($checked == $key ) {
  313. $parseStr .= '<input type="radio" checked="checked" name="'.$name.'[]" value="'.$key.'">'.$val.$separator;
  314. }else {
  315. $parseStr .= '<input type="radio" name="'.$name.'[]" value="'.$key.'">'.$val.$separator;
  316. }
  317. }
  318. return $parseStr;
  319. }
  320. /**
  321. +----------------------------------------------------------
  322. * list标签解析
  323. * 格式: <html:list datasource="" show="" />
  324. *
  325. +----------------------------------------------------------
  326. * @access public
  327. +----------------------------------------------------------
  328. * @param string $attr 标签属性
  329. +----------------------------------------------------------
  330. * @return string
  331. +----------------------------------------------------------
  332. */
  333. public function _list($attr)
  334. {
  335. $tag = $this->parseXmlAttr($attr,'list');
  336. $id = $tag['id']; //表格ID
  337. $datasource = $tag['datasource']; //列表显示的数据源VoList名称
  338. $pk = empty($tag['pk'])?'id':$tag['pk'];//主键名,默认为id
  339. $style = $tag['style']; //样式名
  340. $name = !empty($tag['name'])?$tag['name']:'vo'; //Vo对象名
  341. $action = $tag['action']; //是否显示功能操作
  342. $checkbox = $tag['checkbox']; //是否显示Checkbox
  343. if(isset($tag['actionlist'])) {
  344. $actionlist = explode(',',trim($tag['actionlist'])); //指定功能列表
  345. }
  346. if(substr($tag['show'],0,1)=='$') {
  347. $show = $this->tpl->get(substr($tag['show'],1));
  348. }else {
  349. $show = $tag['show'];
  350. }
  351. $show = explode(',',$show); //列表显示字段列表
  352. //计算表格的列数
  353. $colNum = count($show);
  354. if(!empty($checkbox)) $colNum++;
  355. if(!empty($action)) $colNum++;
  356. //显示开始
  357. $parseStr = "<!-- Think 系统列表组件开始 -->\n";
  358. $parseStr .= '<table id="'.$id.'" class="'.$style.'" cellpadding=0 cellspacing=0 >';
  359. $parseStr .= '<tr><td colspan="'.$colNum.'" class="topTd" ></td></tr>';
  360. $parseStr .= '<tr class="row" >';
  361. //列表需要显示的字段
  362. $fields = array();
  363. foreach($show as $key=>$val) {
  364. $fields[] = explode(':',$val);
  365. }
  366. if(!empty($checkbox) && 'true'==strtolower($checkbox)) {//如果指定需要显示checkbox列
  367. $parseStr .='<th width="8"><input type="checkbox" id="check" onclick="CheckAll(\''.$id.'\')"></th>';
  368. }
  369. foreach($fields as $field) {//显示指定的字段
  370. $property = explode('|',$field[0]);
  371. $showname = explode('|',$field[1]);
  372. if(isset($showname[1])) {
  373. $parseStr .= '<th width="'.$showname[1].'">';
  374. }else {
  375. $parseStr .= '<th>';
  376. }
  377. $showname[2] = isset($showname[2])?$showname[2]:$showname[0];
  378. $parseStr .= '<a href="javascript:sortBy(\''.$property[0].'\',\'{$sort}\',\''.MODULE_NAME.'\',\''.ACTION_NAME.'\')" title="'.L("TAG_LANG_ORDER").$showname[2].'{$sortType} ">'.$showname[0].'<eq name="order" value="'.$property[0].'" ><img src="__TMPL__Common/images/{$sortImg}.gif" width="12" height="17" border="0" align="absmiddle"></eq></a></th>';
  379. }
  380. if(!empty($action)) {//如果指定显示操作功能列
  381. $parseStr .= '<th width="60px">'.l("TAG_LANG_OPERATE").'</th>';
  382. }
  383. $parseStr .= '</tr>';
  384. $parseStr .= '<volist name="'.$datasource.'" id="'.$name.'" ><tr class="row" >'; //支持鼠标移动单元行颜色变化 具体方法在js中定义
  385. if(!empty($checkbox)) {//如果需要显示checkbox 则在每行开头显示checkbox
  386. $parseStr .= '<td><input type="checkbox" name="key" class="key" value="{$'.$name.'.'.$pk.'}"></td>';
  387. }
  388. foreach($fields as $field) {
  389. //显示定义的列表字段
  390. $parseStr .= '<td>';
  391. if(!empty($field[2])) {
  392. // 支持列表字段链接功能 具体方法由JS函数实现
  393. $href = explode('|',$field[2]);
  394. if(count($href)>1) {
  395. //指定链接传的字段值
  396. // 支持多个字段传递
  397. $array = explode('^',$href[1]);
  398. if(count($array)>1) {
  399. foreach ($array as $a){
  400. $temp[] = '\'{$'.$name.'.'.$a.'|addslashes}\'';
  401. }
  402. $parseStr .= '<a href="javascript:'.$href[0].'('.implode(',',$temp).')">';
  403. }else{
  404. $parseStr .= '<a href="javascript:'.$href[0].'(\'{$'.$name.'.'.$href[1].'|addslashes}\')">';
  405. }
  406. }else {
  407. //如果没有指定默认传编号值
  408. $parseStr .= '<a href="javascript:'.$field[2].'(\'{$'.$name.'.'.$pk.'|addslashes}\')">';
  409. }
  410. }
  411. if(strpos($field[0],'^')) {
  412. $property = explode('^',$field[0]);
  413. foreach ($property as $p){
  414. $unit = explode('|',$p);
  415. if(count($unit)>1) {
  416. $parseStr .= '{$'.$name.'.'.$unit[0].'|'.$unit[1].'} ';
  417. }else {
  418. $parseStr .= '{$'.$name.'.'.$p.'} ';
  419. }
  420. }
  421. }else{
  422. $property = explode('|',$field[0]);
  423. if(count($property)>1) {
  424. $property[1] = str_replace("#",",",$property[1]);
  425. $parseStr .= '{$'.$name.'.'.$property[0].'|'.$property[1].'}';
  426. }else {
  427. $parseStr .= '{$'.$name.'.'.$field[0].'}';
  428. }
  429. }
  430. if(!empty($field[2])) {
  431. $parseStr .= '</a>';
  432. }
  433. $parseStr .= '</td>';
  434. }
  435. if(!empty($action)) {//显示功能操作
  436. if(!empty($actionlist[0])) {//显示指定的功能项
  437. $act_idx = 0;
  438. $t_parseStr = "";
  439. foreach($actionlist as $val) {
  440. if(strpos($val,':')) {
  441. $a = explode(':',$val);
  442. $b = explode('|',$a[1]);
  443. if(count($b)>1) {
  444. $c = explode('|',$a[0]);
  445. if(count($c)>1) {
  446. $act_idx ++;
  447. $t_parseStr .= '<a href="javascript:'.$c[1].'(\'{$'.$name.'.'.$pk.'}\')"><?php if(0== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[1].'<?php } ?></a><a href="javascript:'.$c[0].'({$'.$name.'.'.$pk.'})"><?php if(1== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[0].'<?php } ?></a>&nbsp;';
  448. }else {
  449. $act_idx ++;
  450. $t_parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$pk.'}\')"><?php if(0== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[1].'<?php } ?><?php if(1== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[0].'<?php } ?></a>&nbsp;';
  451. }
  452. }else {
  453. $act_idx ++;
  454. $t_parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$pk.'}\')">'.$a[1].'</a>&nbsp;';
  455. }
  456. }else{
  457. $array = explode('|',$val);
  458. if(count($array)>2) {
  459. $act_idx ++;
  460. $t_parseStr .= ' <a href="javascript:'.$array[1].'(\'{$'.$name.'.'.$array[0].'}\')">'.$array[2].'</a>&nbsp;';
  461. }else{
  462. $act_idx ++;
  463. $t_parseStr .= ' {$'.$name.'.'.$val.'}&nbsp;';
  464. }
  465. }
  466. }
  467. if($act_idx > 1){
  468. $parseStr .= '<td class="op_action"><div class="viewOpBox_demo">';
  469. $parseStr .= $t_parseStr;
  470. $parseStr .= '</div><a href="javascript:void(0);" class="opration"><span>操作</span><i></i></a></td>';
  471. }
  472. else{
  473. $parseStr .= '<td class="op_action">';
  474. $parseStr .= $t_parseStr;
  475. $parseStr .= '</td>';
  476. }
  477. }
  478. }
  479. $parseStr .= '</tr></volist><tr><td colspan="'.$colNum.'" class="bottomTd"> &nbsp;</td></tr></table>';
  480. $parseStr .= "\n<!-- Think 系统列表组件结束 -->\n";
  481. return $parseStr;
  482. }
  483. /**
  484. +----------------------------------------------------------
  485. * tree_list标签解析
  486. * 格式: <html:list datasource="" show="" />
  487. *
  488. +----------------------------------------------------------
  489. * @access public
  490. +----------------------------------------------------------
  491. * @param string $attr 标签属性
  492. +----------------------------------------------------------
  493. * @return string
  494. +----------------------------------------------------------
  495. */
  496. public function _tree_list($attr)
  497. {
  498. $tag = $this->parseXmlAttr($attr,'list');
  499. $id = $tag['id']; //表格ID
  500. $datasource = $tag['datasource']; //列表显示的数据源VoList名称
  501. $pk = empty($tag['pk'])?'id':$tag['pk'];//主键名,默认为id
  502. $style = $tag['style']; //样式名
  503. $name = !empty($tag['name'])?$tag['name']:'vo'; //Vo对象名
  504. $action = $tag['action']; //是否显示功能操作
  505. $checkbox = $tag['checkbox']; //是否显示Checkbox
  506. if(isset($tag['actionlist'])) {
  507. $actionlist = explode(',',trim($tag['actionlist'])); //指定功能列表
  508. }
  509. if(substr($tag['show'],0,1)=='$') {
  510. $show = $this->tpl->get(substr($tag['show'],1));
  511. }else {
  512. $show = $tag['show'];
  513. }
  514. $show = explode(',',$show); //列表显示字段列表
  515. //计算表格的列数
  516. $colNum = count($show);
  517. if(!empty($checkbox)) $colNum++;
  518. if(!empty($action)) $colNum++;
  519. //显示开始
  520. $parseStr = "<!-- Think 系统列表组件开始 -->\n";
  521. $parseStr .= '<table id="'.$id.'" class="'.$style.'" cellpadding=0 cellspacing=0 >';
  522. $parseStr .= '<tr><td colspan="'.$colNum.'" class="topTd" >&nbsp; </td></tr>';
  523. $parseStr .= '<tr class="row" >';
  524. //列表需要显示的字段
  525. $fields = array();
  526. foreach($show as $key=>$val) {
  527. $fields[] = explode(':',$val);
  528. }
  529. if(!empty($checkbox) && 'true'==strtolower($checkbox)) {//如果指定需要显示checkbox列
  530. $parseStr .='<th width="8"><input type="checkbox" id="check" onclick="CheckAll(\''.$id.'\')"></th>';
  531. }
  532. foreach($fields as $field) {//显示指定的字段
  533. $property = explode('|',$field[0]);
  534. $showname = explode('|',$field[1]);
  535. if(isset($showname[1])) {
  536. $parseStr .= '<th width="'.$showname[1].'">';
  537. }else {
  538. $parseStr .= '<th>';
  539. }
  540. $showname[2] = isset($showname[2])?$showname[2]:$showname[0];
  541. $parseStr .= '<a href="javascript:sortBy(\''.$property[0].'\',\'{$sort}\',\''.MODULE_NAME.'\',\''.ACTION_NAME.'\')" title="'.L("TAG_LANG_ORDER").$showname[2].'{$sortType} ">'.$showname[0].'<eq name="order" value="'.$property[0].'" ><img src="__TMPL__Common/images/{$sortImg}.gif" width="12" height="17" border="0" align="absmiddle"></eq></a></th>';
  542. }
  543. if(!empty($action)) {//如果指定显示操作功能列
  544. $parseStr .= '<th >'.l("TAG_LANG_OPERATE").'</th>';
  545. }
  546. $parseStr .= '</tr>';
  547. $parseStr .= '<volist name="'.$datasource.'" id="'.$name.'" ><tr class="row" >'; //支持鼠标移动单元行颜色变化 具体方法在js中定义
  548. if(!empty($checkbox)) {//如果需要显示checkbox 则在每行开头显示checkbox
  549. $parseStr .= '<td>';
  550. $parseStr .= '<if condition="$'.$name.'[level] eq -1"><input type="checkbox" name="key" class="key" value="{$'.$name.'.'.$pk.'}"><else />&nbsp;</if>';
  551. $parseStr .= '</td>';
  552. }
  553. foreach($fields as $field) {
  554. //显示定义的列表字段
  555. $parseStr .= '<td>';
  556. if(!empty($field[2])) {
  557. // 支持列表字段链接功能 具体方法由JS函数实现
  558. $href = explode('|',$field[2]);
  559. if(count($href)>1) {
  560. //指定链接传的字段值
  561. // 支持多个字段传递
  562. $array = explode('^',$href[1]);
  563. if(count($array)>1) {
  564. foreach ($array as $a){
  565. $temp[] = '\'{$'.$name.'.'.$a.'|addslashes}\'';
  566. }
  567. $parseStr .= '<a href="javascript:'.$href[0].'('.implode(',',$temp).')">';
  568. }else{
  569. $parseStr .= '<a href="javascript:'.$href[0].'(\'{$'.$name.'.'.$href[1].'|addslashes}\')">';
  570. }
  571. }else {
  572. //如果没有指定默认传编号值
  573. $parseStr .= '<a href="javascript:'.$field[2].'(\'{$'.$name.'.'.$pk.'|addslashes}\')">';
  574. }
  575. }
  576. if(strpos($field[0],'^')) {
  577. $property = explode('^',$field[0]);
  578. foreach ($property as $p){
  579. $unit = explode('|',$p);
  580. if(count($unit)>1) {
  581. $parseStr .= '{$'.$name.'.'.$unit[0].'|'.$unit[1].'} ';
  582. }else {
  583. $parseStr .= '{$'.$name.'.'.$p.'} ';
  584. }
  585. }
  586. }else{
  587. $property = explode('|',$field[0]);
  588. if(count($property)>1) {
  589. $parseStr .= '{$'.$name.'.'.$property[0].'|'.$property[1].'}';
  590. }else {
  591. $parseStr .= '{$'.$name.'.'.$field[0].'}';
  592. }
  593. }
  594. if(!empty($field[2])) {
  595. $parseStr .= '</a>';
  596. }
  597. $parseStr .= '</td>';
  598. }
  599. if(!empty($action)) {//显示功能操作
  600. if(!empty($actionlist[0])) {//显示指定的功能项
  601. $parseStr .= '<td>';
  602. foreach($actionlist as $val) {
  603. if(strpos($val,':')) {
  604. $a = explode(':',$val);
  605. $b = explode('|',$a[1]);
  606. if(count($b)>1) {
  607. $c = explode('|',$a[0]);
  608. if(count($c)>1) {
  609. $parseStr .= '<a href="javascript:'.$c[1].'(\'{$'.$name.'.'.$pk.'}\')"><?php if(0== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[1].'<?php } ?></a><a href="javascript:'.$c[0].'({$'.$name.'.'.$pk.'})"><?php if(1== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[0].'<?php } ?></a>&nbsp;';
  610. }else {
  611. $parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$pk.'}\')"><?php if(0== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[1].'<?php } ?><?php if(1== (is_array($'.$name.')?$'.$name.'["status"]:$'.$name.'->status)){ ?>'.$b[0].'<?php } ?></a>&nbsp;';
  612. }
  613. }else {
  614. $parseStr .= '<a href="javascript:'.$a[0].'(\'{$'.$name.'.'.$pk.'}\')">'.$a[1].'</a>&nbsp;';
  615. }
  616. }else{
  617. $array = explode('|',$val);
  618. if(count($array)>2) {
  619. $parseStr .= ' <a href="javascript:'.$array[1].'(\'{$'.$name.'.'.$array[0].'}\')">'.$array[2].'</a>&nbsp;';
  620. }else{
  621. $parseStr .= ' {$'.$name.'.'.$val.'}&nbsp;';
  622. }
  623. }
  624. }
  625. $parseStr .= '</td>';
  626. }
  627. }
  628. $parseStr .= '</tr></volist><tr><td colspan="'.$colNum.'" class="bottomTd"> &nbsp;</td></tr></table>';
  629. $parseStr .= "\n<!-- Think 系统列表组件结束 -->\n";
  630. return $parseStr;
  631. }
  632. /**
  633. +----------------------------------------------------------
  634. * imgUpload标签解析
  635. * 格式: <html:imgUpload name='name' value='value' width='width' height='height' />
  636. +----------------------------------------------------------
  637. * @access public
  638. +----------------------------------------------------------
  639. * @param string $attr 标签属性
  640. +----------------------------------------------------------
  641. * @return string|void
  642. +----------------------------------------------------------
  643. */
  644. public function _imgUpload($attr)
  645. {
  646. $tag = $this->parseXmlAttr($attr,'imgUpload');
  647. $name = $tag['name'];
  648. $id = $tag['id'];
  649. $width = $tag['width']?$tag['width']:'35';
  650. $height = $tag['height']?$tag['height']:'35';
  651. $value = $tag['value'];
  652. if($value)
  653. {
  654. $img_url = "<if condition=\"".$value." eq ''\">./admin/Tpl/default/Common/images/no_pic.gif<else />{".$value."}</if>";
  655. $svalue = "{".$value."}";
  656. }
  657. else
  658. {
  659. $img_url = "./admin/Tpl/default/Common/images/no_pic.gif";
  660. $svalue = "";
  661. }
  662. /*$parseStr="<div style='width:120px; height:40px; margin-left:10px; display:inline-block; float:left;' class='none_border'><script type='text/javascript'>var editer_$id;".
  663. "KindEditor.ready(function(K) {".
  664. "editer_$id = K.create('textarea#$id', {" .
  665. "allowFileManager : true," .
  666. "items : ['upload_image'],".
  667. "skinType: 'tinymce',".
  668. "allowFileManager : true,".
  669. "resizeMode : 0".
  670. "});".
  671. "});".
  672. "KE.show({".
  673. "id : eid,".
  674. "items : ['upload_image'],".
  675. "skinType: 'tinymce',".
  676. "allowFileManager : true,".
  677. "resizeMode : 0".
  678. "});"
  679. "</script>";
  680. if($value)
  681. $parseStr.= "<div style='font-size:0px;'><textarea id='".$id."' name='".$name."' style='width:120px; height:25px;' >{".$value."}</textarea> </div></div>";
  682. else
  683. $parseStr.= "<div style='font-size:0px;'><textarea id='".$id."' name='".$name."' style='width:120px; height:25px;' ></textarea> </div>";
  684. $parseStr.="<input type='text' id='focus_".$id."' style='font-size:0px; border:0px; padding:0px; margin:0px; line-height:0px; width:0px; height:0px;' /></div>";
  685. $parseStr.= "<img src='".$img_url."' ".$script." style='display:inline-block; float:left; cursor:pointer; margin-left:10px; border:#ccc solid 1px; width:".$width."px; height:".$height."px;' id='img_".$id."' />";
  686. $parseStr.= "<img src='".__ROOT__."/admin/Tpl/default/Common/images/del.gif' style='".$hide." margin-left:10px; float:left; border:#ccc solid 1px; width:35px; height:35px; cursor:pointer;' id='img_del_".$id."' onclick='delimg(\"".$id."\")' title='删除' />";
  687. */
  688. if(empty($value))
  689. $cls="display:none";
  690. else
  691. $cls= "<if condition=\"".$value." eq ''\">display:none</if>";
  692. $parseStr= "<span>
  693. <div style='float:left; height:".$width."px; padding-top:1px;'>
  694. <input type='hidden' value='".$svalue."' name='$name' id='keimg_h_$id' />
  695. <div class='buttonActive' style='margin-right:5px;'>
  696. <div class='buttonContent'>
  697. <button type='button' class='keimg ke-icon-upload_image' rel='$id'>选择图片</button>
  698. </div>
  699. </div>
  700. </div>
  701. <a href='$img_url' target='_blank' id='keimg_a_$id' ><img src='$img_url' id='keimg_m_$id' width=$width height=$height style='float:left; border:#ccc solid 1px; margin-left:5px;' /></a>
  702. <div style='float:left; height:".$width."px; padding-top:1px;'>
  703. <div class='buttonActive'>
  704. <div class='buttonContent'>
  705. <img src='".__ROOT__."/admin/Tpl/default/Common/images/del.gif' style='$cls; margin-left:10px; float:left; border:#ccc solid 1px; width:35px; height:35px; cursor:pointer;' class='keimg_d' rel='$id' title='删除'>
  706. </div>
  707. </div>
  708. </div>
  709. </span>";
  710. return $parseStr;
  711. }
  712. public function _imgcutUpload($attr)
  713. {
  714. $tag = $this->parseXmlAttr($attr,'imgcutUpload');
  715. $name = $tag['name'];
  716. $id = $tag['id'];
  717. $width = $tag['width']?$tag['width']:'35';
  718. $height = $tag['height']?$tag['height']:'35';
  719. $dstwidth = $tag['dstwidth']?$tag['dstwidth']:'35';
  720. $detheight = $tag['detheight']?$tag['detheight']:'35';
  721. $value = $tag['value'];
  722. if($value)
  723. {
  724. $img_url = "<if condition=\"".$value." eq ''\">./admin/Tpl/default/Common/images/no_pic.gif<else />{".$value."}</if>";
  725. $svalue = "{".$value."}";
  726. }
  727. else
  728. {
  729. $img_url = "./admin/Tpl/default/Common/images/no_pic.gif";
  730. $svalue = "";
  731. }
  732. if(empty($value))
  733. $cls="display:none";
  734. else
  735. $cls= "<if condition=\"".$value." eq ''\">display:none</if>";
  736. $id_a = $id.'_a';
  737. $parseStr = "<span>
  738. <div style='float:left; height:".$height."px; padding-top:1px;' onclick='open_avatar_view($dstwidth,$detheight,\"$id\");'>
  739. <div class='buttonActive' style='margin-right:5px;'>
  740. <div class='buttonContent'>
  741. <button type='button' class=' ke-icon-upload_image' >选择图片</button>
  742. </div>
  743. </div>
  744. </div>
  745. <a href='$img_url' target='_blank' id='$id_a' >
  746. <img src='$img_url' id='$id' width='$width' height='$height' style='float:left; border:#ccc solid 1px; margin-left:5px;'>
  747. </a>
  748. <input type='hidden' name='$id' value='$svalue'>
  749. </span>";
  750. return $parseStr;
  751. }
  752. public function _fileUpload($attr)
  753. {
  754. $tag = $this->parseXmlAttr($attr,'fileUpload');
  755. $name = $tag['name'];
  756. $id = $tag['id'];
  757. $width = $tag['width']?$tag['width']:'35';
  758. $height = $tag['height']?$tag['height']:'35';
  759. $value = $tag['value'];
  760. if($value)
  761. {
  762. $file_url = "<if condition=\"".$value." eq ''\">./admin/Tpl/default/Common/images/no_pic.gif<else />{".$value."}</if>";
  763. $svalue = "{".$value."}";
  764. }
  765. else
  766. {
  767. $file_url = "./admin/Tpl/default/Common/images/no_pic.gif";
  768. $svalue = "";
  769. }
  770. if(empty($value))
  771. $cls="display:none";
  772. else
  773. $cls= "<if condition=\"".$value." eq ''\">display:none</if>";
  774. $parseStr= "<span>
  775. <div style='float:left; height:".$width."px; padding-top:1px;'>
  776. <input type='hidden' value='".$svalue."' name='$name' id='keimg_h_$name' />
  777. <div class='buttonActive' style='margin-right:5px;'>
  778. <div class='buttonContent'>
  779. <button type='button' class='kefile ke-icon-upload_file' rel='$name'>选择文件</button>
  780. </div>
  781. </div>
  782. </div>
  783. <div style='float:left; height:".$width."px; padding-top:1px;'>
  784. <div class='buttonActive'>
  785. <div class='buttonContent'>
  786. <input type='text' value='' name='kefile_url' class='kefile_url' readonly style='width:500px'/>
  787. </div>
  788. </div>
  789. </div>
  790. </span>";
  791. return $parseStr;
  792. }
  793. }//类定义结束
  794. ?>