PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/source/class/class_tag.php

https://github.com/kuaileshike/upload
PHP | 226 lines | 205 code | 15 blank | 6 comment | 50 complexity | 02c21d9c6bf462a743a5ca3d8f96551e MD5 | raw file
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: class_tag.php 28830 2012-03-14 08:30:08Z chenmengshu $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class tag
  12. {
  13. public function add_tag($tags, $itemid, $idtype = 'tid', $returnarray = 0) {
  14. if($tags == '' || !in_array($idtype, array('', 'tid', 'blogid', 'uid'))) {
  15. return;
  16. }
  17. $tags = str_replace(array(chr(0xa3).chr(0xac), chr(0xa1).chr(0x41), chr(0xef).chr(0xbc).chr(0x8c)), ',', censor($tags));
  18. if(strexists($tags, ',')) {
  19. $tagarray = array_unique(explode(',', $tags));
  20. } else {
  21. $langcore = lang('core');
  22. $tags = str_replace($langcore['fullblankspace'], ' ', $tags);
  23. $tagarray = array_unique(explode(' ', $tags));
  24. }
  25. $tagcount = 0;
  26. foreach($tagarray as $tagname) {
  27. $tagname = trim($tagname);
  28. if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $tagname)) {
  29. $status = $idtype != 'uid' ? 0 : 3;
  30. $result = C::t('common_tag')->get_bytagname($tagname, $idtype);
  31. if($result['tagid']) {
  32. if($result['status'] == $status) {
  33. $tagid = $result['tagid'];
  34. }
  35. } else {
  36. $tagid = C::t('common_tag')->insert($tagname,$status);
  37. }
  38. if($tagid) {
  39. if($itemid) {
  40. C::t('common_tagitem')->replace($tagid,$itemid,$idtype);
  41. }
  42. $tagcount++;
  43. if(!$returnarray) {
  44. $return .= $tagid.','.$tagname."\t";
  45. } else {
  46. $return[$tagid] = $tagname;
  47. }
  48. }
  49. if($tagcount > 4) {
  50. unset($tagarray);
  51. break;
  52. }
  53. }
  54. }
  55. return $return;
  56. }
  57. public function update_field($tags, $itemid, $idtype = 'tid', $typeinfo = array()) {
  58. if($idtype == 'tid') {
  59. $tagstr = C::t('forum_post')->fetch_threadpost_by_tid_invisible($itemid);
  60. $tagstr = $tagstr['tags'];
  61. } elseif($idtype == 'blogid') {
  62. $tagstr = C::t('home_blogfield')->fetch_tag_by_blogid($itemid);
  63. } else {
  64. return '';
  65. }
  66. $tagarray = $tagidarray = $tagarraynew = array();
  67. $results = C::t('common_tagitem')->select(0, $itemid, $idtype);
  68. foreach($results as $result) {
  69. $tagidarray[] = $result['tagid'];
  70. }
  71. if($tagidarray) {
  72. $results = C::t('common_tag')->get_byids($tagidarray);
  73. foreach($results as $result) {
  74. $tagarray[$result[tagid]] = $result['tagname'];
  75. }
  76. }
  77. $tags = $this->add_tag($tags, $itemid, $idtype, 1);
  78. foreach($tags as $tagid => $tagname) {
  79. $tagarraynew[] = $tagname;
  80. if(empty($tagarray[$tagid])) {
  81. $tagstr = $tagstr.$tagid.','.$tagname."\t";
  82. }
  83. }
  84. foreach($tagarray as $tagid => $tagname) {
  85. if(!in_array($tagname, $tagarraynew)) {
  86. C::t('common_tagitem')->delete($tagid, $itemid, $idtype);
  87. $tagstr = str_replace("$tagid,$tagname\t", '', $tagstr);
  88. }
  89. }
  90. return $tagstr;
  91. }
  92. public function copy_tag($oldid, $newid, $idtype = 'tid') {
  93. $results = C::t('common_tagitem')->select(0, $oldid, $idtype);
  94. foreach($results as $result) {
  95. C::t('common_tagitem')->insert(array(
  96. 'tagid' => $result['tagid'],
  97. 'itemid' => $newid,
  98. 'idtype' => $idtype
  99. ));
  100. }
  101. }
  102. public function merge_tag($tagidarray, $newtag, $idtype = '') {
  103. $newtag = str_replace(',', '', $newtag);
  104. $newtag = trim($newtag);
  105. if(!$newtag) {
  106. return 'tag_empty';
  107. }
  108. if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $newtag)) {
  109. $tidarray = $blogidarray = array();
  110. $newtaginfo = $this->add_tag($newtag, 0, $idtype, 1);
  111. foreach($newtaginfo as $tagid => $tagname) {
  112. $newid = $tagid;
  113. }
  114. $tagidarray = array_diff((array)$tagidarray, (array)$newid);
  115. if($idtype !== 'uid') {
  116. $tagnames = C::t('common_tag')->get_byids($tagidarray);
  117. $results = C::t('common_tagitem')->select($tagidarray);
  118. foreach($results as $result) {
  119. $result['tagname'] = addslashes($tagnames[$result[tagid]]['tagname']);
  120. if($result['idtype'] == 'tid') {
  121. $itemid = $result[itemid];
  122. if(!isset($tidarray[$itemid])) {
  123. $post = C::t('forum_post')->fetch_threadpost_by_tid_invisible($itemid);
  124. $tidarray[$itemid] = $post['tags'];
  125. }
  126. $tidarray[$itemid] = str_replace("$result[tagid],$result[tagname]\t", '', $tidarray[$itemid]);
  127. } elseif($result['idtype'] == 'blogid') {
  128. $itemid = $result[itemid];
  129. if(!isset($blogidarray[$itemid])) {
  130. $blogfield = C::t('home_blogfield')->fetch($itemid);
  131. $blogidarray[$itemid] = $blogfield['tag'];
  132. }
  133. $blogidarray[$itemid] = str_replace("$result[tagid],$result[tagname]\t", '', $blogidarray[$itemid]);
  134. }
  135. }
  136. }
  137. $checkunique = array();
  138. $checktagids = $tagidarray;
  139. $checktagids[] = $newid;
  140. $results = C::t('common_tagitem')->select($checktagids);
  141. foreach($results as $row) {
  142. if($checkunique[$row['itemid'].'_'.$row['idtype']] == 'deleted' || empty($checkunique[$row['itemid'].'_'.$row['idtype']])) {
  143. if(empty($checkunique[$row['itemid'].'_'.$row['idtype']])) {
  144. $checkunique[$row['itemid'].'_'.$row['idtype']] = 1;
  145. }
  146. } else {
  147. C::t('common_tagitem')->unique($row['tagid'], $row['itemid'], $row['idtype']);
  148. $checkunique[$row['itemid'].'_'.$row['idtype']] = 'deleted';
  149. }
  150. }
  151. C::t('common_tagitem')->merge_by_tagids($newid, $tagidarray);
  152. C::t('common_tag')->delete_byids($tagidarray);
  153. if($tidarray) {
  154. foreach($tidarray as $key => $var) {
  155. C::t('forum_post')->update_by_tid('tid:'.$key, $key, array('tags' => $var), false, false, 1);
  156. C::t('forum_post')->concat_threadtags_by_tid($key, "$newid,$newtag\t");
  157. }
  158. }
  159. if($blogidarray) {
  160. foreach($blogidarray as $key => $var) {
  161. C::t('home_blogfield')->update($key, array('tag' => $var.$newid.','.$newtag.'\t'));
  162. }
  163. }
  164. } else {
  165. return 'tag_length';
  166. }
  167. return 'succeed';
  168. }
  169. public function delete_tag($tagidarray, $idtype = '') {
  170. $tidarray = $blogidarray = array();
  171. if(!is_array($tagidarray)) {
  172. return false;
  173. }
  174. if($idtype != 'uid') {
  175. $tagnames = C::t('common_tag')->get_byids($tagidarray);
  176. $items = C::t('common_tagitem')->select($tagidarray);
  177. foreach($items as $result) {
  178. $result['tagname'] = addslashes($tagnames[$result[tagid]]['tagname']);
  179. if($result['idtype'] == 'tid') {
  180. $itemid = $result[itemid];
  181. if(!isset($tidarray[$itemid])) {
  182. $post = C::t('forum_post')->fetch_threadpost_by_tid_invisible($itemid);
  183. $tidarray[$itemid] = $post['tags'];
  184. }
  185. $tidarray[$itemid] = str_replace("$result[tagid],$result[tagname]\t", '', $tidarray[$itemid]);
  186. } elseif($result['idtype'] == 'blogid') {
  187. $itemid = $result[itemid];
  188. if(!isset($blogidarray[$itemid])) {
  189. $blogfield = C::t('home_blogfield')->fetch($itemid);
  190. $blogidarray[$itemid] = $blogfield['tag'];
  191. }
  192. $blogidarray[$itemid] = str_replace("$result[tagid],$result[tagname]\t", '', $blogidarray[$itemid]);
  193. }
  194. }
  195. }
  196. if($tidarray) {
  197. foreach($tidarray as $key => $var) {
  198. C::t('forum_post')->update_by_tid('tid:'.$key, $key, array('tags' => $var), false, false, 1);
  199. }
  200. }
  201. if($blogidarray) {
  202. foreach($blogidarray as $key => $var) {
  203. C::t('home_blogfield')->update($key, array('tag' => $var));
  204. }
  205. }
  206. C::t('common_tag')->delete_byids($tagidarray);
  207. C::t('common_tagitem')->delete($tagidarray);
  208. return true;
  209. }
  210. }
  211. ?>