PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/mods/pm_enhanced/pm_enhanced.php

https://bitbucket.org/webop/webop-forum
PHP | 268 lines | 175 code | 55 blank | 38 comment | 32 complexity | 58a2df4f3d48d76e0ac0b184f3a16af9 MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. /**
  3. * Intercepts a search GET URL and sends it to a proper Phorum URL
  4. *
  5. * @return void
  6. *
  7. */
  8. function pm_enhanced_intercept_search_form()
  9. {
  10. if(phorum_page=="pm"){
  11. if(count($_GET) && isset($_GET["search"])){
  12. $dest_url = phorum_get_url(PHORUM_PM_URL, "page=list", "folder_id=".$_GET["folder_id"], "search=".rawurlencode($_GET["search"]));
  13. phorum_redirect_by_url($dest_url);
  14. exit();
  15. }
  16. }
  17. }
  18. /**
  19. * Retrieve all private messages for a user in a folder.
  20. *
  21. * @param mixed $folder
  22. * The folder to use. Either a special folder (PHORUM_PM_INBOX or
  23. * PHORUM_PM_OUTBOX) or the id of a custom user folder.
  24. *
  25. * @param integer $user_id
  26. * The user to retrieve messages for or NULL to use the active
  27. * Phorum user (default).
  28. *
  29. * @param boolean $reverse
  30. * If set to a true value (default), sorting of messages is done
  31. * in reverse (newest first).
  32. *
  33. * @return array
  34. * An array of private messages for the folder.
  35. */
  36. function pm_enhanced_get_list($folder, $user_id = NULL, $reverse = TRUE)
  37. {
  38. $PHORUM = $GLOBALS['PHORUM'];
  39. if(empty($PHORUM["mod_pm_enhanced"]["count"])){
  40. $PHORUM["mod_pm_enhanced"] = array(
  41. "count" => 20
  42. );
  43. }
  44. if ($user_id === NULL) $user_id = $PHORUM['user']['user_id'];
  45. settype($user_id, 'int');
  46. settype($reverse, 'bool');
  47. if (is_numeric($folder)) {
  48. $folder_where = "pm_folder_id = $folder";
  49. } elseif ($folder == PHORUM_PM_INBOX || $folder == PHORUM_PM_OUTBOX) {
  50. $folder_where = "(pm_folder_id = 0 AND special_folder = '$folder')";
  51. } else trigger_error(
  52. 'phorum_db_pm_list(): Illegal folder "'.htmlspecialchars($folder).'" '.
  53. 'requested for user id "'.$user_id.'"',
  54. E_USER_ERROR
  55. );
  56. if(isset($PHORUM["args"]["pageno"]) && $PHORUM["args"]["pageno"] > 1){
  57. $page = $PHORUM["args"]["pageno"];
  58. $start = ($PHORUM["args"]["pageno"] - 1) * $PHORUM["mod_pm_enhanced"]["count"];
  59. } else {
  60. $page = 1;
  61. $start = 0;
  62. }
  63. $count = $PHORUM["mod_pm_enhanced"]["count"];
  64. $search_where = "";
  65. $url_safe_search = "";
  66. $html_safe_search = "";
  67. if(!empty($PHORUM["args"]["search"])){
  68. $like_string = _pm_enhanced_create_like_string(
  69. array(
  70. "author",
  71. "subject",
  72. "message"
  73. ),
  74. $PHORUM["args"]["search"]
  75. );
  76. $search_where = "AND $like_string";
  77. $url_safe_search = rawurlencode($PHORUM["args"]["search"]);
  78. $html_safe_search = htmlspecialchars($PHORUM["args"]["search"], ENT_COMPAT, $PHORUM["DATA"]["HCHARSET"]);
  79. }
  80. // Retrieve the messages from the folder.
  81. $messages = phorum_db_interact(
  82. DB_RETURN_ASSOCS,
  83. "SELECT SQL_CALC_FOUND_ROWS
  84. m.pm_message_id AS pm_message_id,
  85. m.user_id, author,
  86. subject, datestamp,
  87. meta, pm_xref_id,
  88. pm_folder_id, special_folder,
  89. read_flag, reply_flag
  90. FROM {$PHORUM['pm_messages_table']} AS m,
  91. {$PHORUM['pm_xref_table']} AS x
  92. WHERE x.user_id = $user_id AND
  93. $folder_where AND
  94. x.pm_message_id = m.pm_message_id
  95. $search_where
  96. ORDER BY x.pm_message_id " . ($reverse ? 'DESC' : 'ASC')."
  97. LIMIT $start, $count",
  98. 'pm_message_id'
  99. );
  100. $total_rows = phorum_db_interact(
  101. DB_RETURN_VALUE,
  102. "SELECT found_rows() as total_rows",
  103. "total_rows"
  104. );
  105. // Add the recipient information unserialized to the messages.
  106. foreach ($messages as $id => $message) {
  107. $meta = unserialize($message['meta']);
  108. $messages[$id]['recipients'] = $meta['recipients'];
  109. }
  110. $pages=ceil($total_rows/$count);
  111. if($pages<=11){
  112. $page_start=1;
  113. } elseif($pages-$page<5) {
  114. $page_start=$pages-10;
  115. } elseif($pages>11 && $page>6){
  116. $page_start=$page-5;
  117. } else {
  118. $page_start=1;
  119. }
  120. if(!empty($url_safe_search)){
  121. $pm_page_template = phorum_get_url(PHORUM_PM_URL, "page=list", "folder_id=$folder", "pageno=%pageno%", "search=".$url_safe_search);
  122. } else {
  123. $pm_page_template = phorum_get_url(PHORUM_PM_URL, "page=list", "folder_id=$folder", "pageno=%pageno%");
  124. }
  125. $GLOBALS["PHORUM"]["DATA"]["URL"]["PM_SEARCH_ACTION"] = phorum_get_url(PHORUM_PM_URL, "page=list", "folder_id=$folder");
  126. $GLOBALS["PHORUM"]["DATA"]["SAFE_SEARCH"] = $html_safe_search;
  127. for($x=0;$x<11 && $x<$pages;$x++){
  128. $pageno=$x+$page_start;
  129. $GLOBALS["PHORUM"]["DATA"]["PAGES"][] = array(
  130. "pageno"=>$pageno,
  131. 'url'=>str_replace("%pageno%", $pageno , $pm_page_template),
  132. );
  133. }
  134. $GLOBALS["PHORUM"]["DATA"]["CURRENTPAGE"]=$page;
  135. $GLOBALS["PHORUM"]["DATA"]["TOTALPAGES"]=$pages;
  136. if($page_start>1){
  137. $GLOBALS["PHORUM"]["DATA"]["URL"]["FIRSTPAGE"]=str_replace("%pageno%", 1 ,$pm_page_template);
  138. }
  139. if($pageno<$pages){
  140. $GLOBALS["PHORUM"]["DATA"]["URL"]["LASTPAGE"]=str_replace("%pageno%", $pages, $pm_page_template);
  141. }
  142. if($pages>$page){
  143. $nextpage=$page+1;
  144. $GLOBALS["PHORUM"]["DATA"]["URL"]["NEXTPAGE"]=str_replace("%pageno%", $nextpage, $pm_page_template);
  145. }
  146. if($page>1){
  147. $prevpage=$page-1;
  148. $GLOBALS["PHORUM"]["DATA"]["URL"]["PREVPAGE"]=str_replace("%pageno%", $prevpage, $pm_page_template);
  149. }
  150. return $messages;
  151. }
  152. function _pm_enhanced_create_like_string($fields, $search) {
  153. $tokens = _pm_enhanced_tokenize_terms($search);
  154. $clauses = array();
  155. foreach($tokens as $token){
  156. if(preg_match('!\((.+?)\)!', $token, $match)){
  157. $sub_token = explode(",", $match[1]);
  158. } else {
  159. $sub_token = array($token);
  160. }
  161. $tok_clauses = array();
  162. foreach($sub_token as $sub){
  163. $sub = trim($sub);
  164. if($sub[0]=="-"){
  165. $sub = substr($sub, 1);
  166. $cond = "NOT LIKE";
  167. $op = "AND";
  168. } else {
  169. $cond = "LIKE";
  170. $op = "OR";
  171. }
  172. if(preg_match('!"(.+?)"!', $sub, $match)){
  173. $sub = $match[1];
  174. }
  175. $sub = mysql_escape_string($sub);
  176. foreach($fields as $field){
  177. $tok_clauses[] = "$field $cond '%$sub%'";
  178. }
  179. }
  180. $clauses[] = "(".implode(" {$op} ", $tok_clauses).")";
  181. }
  182. return implode(" AND\n", $clauses);
  183. }
  184. /**
  185. * Tokenizes a string into an array of terms including negation and quoting
  186. *
  187. * @param string $search_string The string to tokenize
  188. * @return array
  189. *
  190. */
  191. function _pm_enhanced_tokenize_terms( $search_string ) {
  192. // surround with spaces so matching is easier
  193. $search_string = " $search_string ";
  194. $paren_terms = array();
  195. if ( strstr( $search_string, '(' ) ) {
  196. // now pull out all grouped terms eg. (nano mini)
  197. preg_match_all( '/ ([+\-~]*\(.+?\)) /', $search_string, $tokenArray1 );
  198. $search_string = preg_replace( '/ [+\-~]*\(.+?\) /', ' ', $search_string );
  199. $paren_terms = $tokenArray1[1];
  200. }
  201. $quoted_terms = array();
  202. if ( strstr( $search_string, '"' ) ) {
  203. // first pull out all the double quoted strings (e.g. '"iMac DV" or -"iMac DV"')
  204. preg_match_all( '/ ([+\-~]*".+?") /', $search_string, $tokenArray0 );
  205. $search_string = preg_replace( '/ [+\-~]*".+?" /', ' ', $search_string );
  206. $quoted_terms = $tokenArray0[1];
  207. }
  208. // finally pull out the rest words in the string
  209. $norm_terms = preg_split( "/\s+/", $search_string, 0, PREG_SPLIT_NO_EMPTY );
  210. // merge them all together and return
  211. return array_merge( $quoted_terms, $paren_terms, $norm_terms );
  212. } // end of tokenizeTerms()
  213. ?>