?
Path : /home/admin/public_html/old/board/administrator/components/com_kunena/lib/ |
Current File : /home/admin/public_html/old/board/administrator/components/com_kunena/lib/kunena.search.class.php |
<?php /** * @version $Id: kunena.search.class.php 2059 2010-03-14 03:42:18Z mahagr $ * Kunena Component * @package Kunena * * @Copyright (C) 2008 - 2009 Kunena Team All rights reserved * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL * @link http://www.kunena.com * * Based on FireBoard Component * @Copyright (C) 2006 - 2007 Best Of Joomla All rights reserved * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL * @link http://www.bestofjoomla.com * * Based on Joomlaboard Component * @copyright (C) 2000 - 2004 TSMF / Jan de Graaff / All Rights Reserved * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL * @author TSMF & Jan de Graaff **/ // Dont allow direct linking defined( '_JEXEC' ) or die('Restricted access'); DEFINE('KUNENA_URL_LIST_SEPARATOR', ' '); class CKunenaSearch { /** search results **/ var $arr_kunena_results = array(); /** function **/ var $func; /** search words **/ var $searchword; /** search strings **/ var $arr_kunena_searchstrings; /** search username **/ var $str_kunena_username; /** error number **/ var $int_kunena_errornr; /** error msg **/ var $str_kunena_errormsg; /** params **/ var $params = array(); /** total **/ var $total = 0; /** limitstart **/ var $limitstart; /** limit **/ var $limit; /** defaults **/ var $defaults = array( 'titleonly' => 0, 'searchuser' => '', 'starteronly' => 0, 'replyless' => 0, 'replylimit' => 0, 'searchdate' => '365', 'beforeafter' => 'after', 'sortby' => 'lastpost', 'order' => 'dec', 'catids' => '0'); /** * Search constructor * @param limitstart First shown item * @param limit Limit */ function CKunenaSearch() { global $kunena_my; $app =& JFactory::getApplication(); $kunena_db = &JFactory::getDBO(); $fbConfig =& CKunenaConfig::getInstance(); // TODO: started_by // TODO: active_in // Default values for checkboxes depends on function $this->func = strtolower(JRequest::getCmd('func')); if($this->func == 'search') { $this->defaults['exactname'] = $this->defaults['childforums'] = 1; } else { $this->defaults['exactname'] = $this->defaults['childforums'] = 0; } $q = JRequest::getVar('q', ''); // Search words // Backwards compability for old templates if (empty($q) && isset($_REQUEST['searchword'])) { $q = JRequest::getVar('searchword', ''); } $q = stripslashes($q); $this->params['titleonly'] = JRequest::getInt('titleonly', $this->defaults['titleonly']); $this->params['searchuser'] = stripslashes(JRequest::getVar('searchuser', $this->defaults['searchuser'])); $this->params['starteronly'] = JRequest::getInt('starteronly', $this->defaults['starteronly']); $this->params['exactname'] = JRequest::getInt('exactname', $this->defaults['exactname']); $this->params['replyless'] = JRequest::getInt('replyless', $this->defaults['replyless']); $this->params['replylimit'] = JRequest::getInt('replylimit', $this->defaults['replylimit']); $this->params['searchdate'] = JRequest::getVar('searchdate', $this->defaults['searchdate']); $this->params['beforeafter'] = JRequest::getVar('beforeafter', $this->defaults['beforeafter']); $this->params['sortby'] = JRequest::getVar('sortby', $this->defaults['sortby']); $this->params['order'] = JRequest::getVar('order', $this->defaults['order']); $this->params['childforums'] = JRequest::getInt('childforums', $this->defaults['childforums']); $this->params['catids'] = strtr(JRequest::getVar('catids', '0', 'get'), KUNENA_URL_LIST_SEPARATOR, ','); $limitstart = $this->limitstart = JRequest::getInt('limitstart', 0); $limit = $this->limit = JRequest::getInt('limit', $fbConfig->messages_per_page_search); extract($this->params); if ($limit<1 || $limit>40) $limit = $this->limit = $fbConfig->messages_per_page_search; if (isset($_POST['q']) || isset($_POST['searchword'])) { $this->params['catids'] = implode(',', JRequest::getVar('catids', array(0), 'post', 'array')); $url = CKunenaLink::GetSearchURL($fbConfig, $this->func, $q, $limitstart, $limit, $this->getUrlParams()); header("HTTP/1.1 303 See Other"); header("Location: " . htmlspecialchars_decode($url)); $app->close(); } if ($q == _GEN_SEARCH_BOX) $q = ''; $this->searchword = $q; $arr_searchwords = explode(' ', $q); $do_search = FALSE; $this->arr_kunena_searchstrings = array(); foreach ($arr_searchwords as $q) { $q = trim($q); if (strlen($q)>2) $do_search = TRUE; $this->arr_kunena_searchstrings[] = $q; } if (strlen($searchuser)>0) $do_search = TRUE; $arr_searchwords = $this->arr_kunena_searchstrings; $this->str_kunena_username = $searchuser; if ($do_search != TRUE) { $this->int_kunena_errornr = 1; $this->str_kunena_errormsg = _KUNENA_SEARCH_ERR_SHORTKEYWORD; return; } $search_forums = $this->get_search_forums($catids, $childforums); /* if there are no forums to search in, set error and return */ if (empty($search_forums)) { $this->int_kunena_errornr = 2; $this->str_kunena_errormsg = _KUNENA_SEARCH_NOFORUM; return; } for ($x = 0; $x < count($arr_searchwords); $x++) { $searchword = $arr_searchwords[$x]; $searchword = $kunena_db->getEscaped(addslashes(trim($searchword))); if (empty($searchword)) continue; $matches = array (); $not = ''; $operator = ' OR '; if (strstr($searchword, '-') == $searchword) { $not = 'NOT'; $operator = 'AND'; $searchword = substr($searchword, 1); } if($titleonly=='0') { $querystrings[] = "(t.message {$not} LIKE '%{$searchword}%' {$operator} m.subject {$not} LIKE '%{$searchword}%')"; } else { $querystrings[] = "(m.subject {$not} LIKE '%{$searchword}%')"; } } //User searching if(strlen($searchuser)>0) { if($exactname=='1') { $querystrings[] = "m.name LIKE '" . $kunena_db->getEscaped(addslashes($searchuser)) . "'"; } else { $querystrings[] = "m.name LIKE '%" . $kunena_db->getEscaped(addslashes($searchuser)) . "%'"; } } $time = 0; switch($searchdate) { case 'lastvisit': $kunena_db->setQuery("SELECT lasttime FROM #__fb_sessions WHERE userid='{$kunena_my->id}'"); $time = $kunena_db->loadResult(); break; case 'all': break; case '1': case '7': case '14': case '30': case '90': case '180': case '365': $time = time() - 86400*intval($searchdate); //24*3600 break; default: $time = time() - 86400*365; $searchdate = '365'; } if ($time) { if($beforeafter == 'after') { $querystrings[] = "m.time > '{$time}'"; } else { $querystrings[] = "m.time <= '{$time}'"; } } /* build query */ $querystrings[] = "m.moved='0'"; $querystrings[] = "m.hold='0'"; $querystrings[] = "m.catid IN ({$search_forums})"; $where = implode(' AND ', $querystrings); $groupby = array(); if($order =='dec') $order1 = 'DESC'; else $order1 = 'ASC'; switch ($sortby) { case 'title': $orderby = "m.subject {$order1}, m.time {$order1}"; break; case 'views': $orderby = "m.hits {$order1}, m.time {$order1}"; break; /* case 'threadstart': $orderby = "m.time {$order1}, m.ordering {$order1}, m.hits {$order1}"; break; */ case 'forum': $orderby = "m.catid {$order1}, m.time {$order1}, m.ordering {$order1}"; break; /* case 'replycount': case 'postusername': */ case 'lastpost': default: $orderby = "m.time {$order1}, m.ordering {$order1}, m.catid {$order1}"; } if (count($groupby) > 0) $groupby = ' GROUP BY ' . implode(',', $groupby); else $groupby = ''; /* get total */ $kunena_db->setQuery("SELECT COUNT(*) FROM #__fb_messages AS m JOIN #__fb_messages_text AS t ON m.id=t.mesid WHERE {$where} {$groupby}"); $this->total = $kunena_db->loadResult(); check_dberror("Unable to count messages."); /* if there are no forums to search in, set error and return */ if ($this->total == 0) { $this->int_kunena_errornr = 3; $this->str_kunena_errormsg = _KUNENA_SEARCH_ERR_NOPOSTS; return; } if ($this->total < $this->limitstart) $this->limitstart = $limitstart = (int)($this->total / $this->limit); /* get results */ $sql = "SELECT m.id, m.subject, m.catid, m.thread, m.name, m.time, t.mesid, t.message FROM #__fb_messages_text AS t JOIN #__fb_messages AS m ON m.id=t.mesid WHERE {$where} {$groupby} ORDER BY {$orderby}"; $kunena_db->setQuery($sql, $limitstart, $limit); $rows = $kunena_db->loadObjectList(); check_dberror("Unable to load messages."); $this->str_kunena_errormsg = $sql . '<br />' . $kunena_db->getErrorMsg(); if (count($rows) > 0) $this->arr_kunena_results = $rows; else $this->arr_kunena_results = array (); return; } /** get searchstrings (array) **/ function get_searchstrings() { return $this->arr_kunena_searchstrings; } function get_searchusername() { return $this->str_kunena_username; } /** get limit (int) **/ function get_limit() { return $this->limit; } /** get start (int) **/ function get_limitstart() { return $this->limitstart; } /** get results (array) **/ function get_results() { return $this->arr_kunena_results; } function getUrlParams() { $url_params = ''; foreach ($this->params as $param => $value) { if ($param == 'catids') $value = strtr($value, ',', KUNENA_URL_LIST_SEPARATOR); if ($value != $this->defaults[$param]) $url_params .= "&$param=".urlencode($value); } return $url_params; } function get_search_forums(&$catids, $childforums = 1) { $fbSession =& CKunenaSession::getInstance(); $kunena_db = &JFactory::getDBO(); $kunena_my = &JFactory::getUser(); /* get allowed forums */ $allowed_string = ''; if ($fbSession->allowed && $fbSession->allowed != 'na') { $allowed_string = "id IN ({$fbSession->allowed})"; } else { $allowed_string = "published='1' AND pub_access='0'"; } $kunena_db->setQuery("SELECT id, parent FROM #__fb_categories WHERE {$allowed_string}"); $allowed_forums = $kunena_db->loadAssocList('id'); check_dberror("Unable to get public categories."); $allow_list = array(); foreach ($allowed_forums as $forum) { // Children list: parent => array(child1, child2, ...) $allow_list[$forum['parent']][] = $forum['id']; } $catids = explode(',', $catids); $result = array(); if (count($catids) > 0 && !in_array(0, $catids)) { // Algorithm: // Start with selected categories and pop them from the catlist one by one // Every popped item in the catlist will be added into result list // For every category: push all its children into the catlist while ($cur = array_pop($catids)) { $result[$cur] = $cur; if (array_key_exists($cur, $allow_list)) foreach ($allow_list[$cur] as $forum) if (!in_array($forum, $catids)) array_push($catids, $forum); } $search_forums = implode(",", $result); } else { $search_forums = implode(",", array_keys($allowed_forums)); } return $search_forums; } /** * Display results * @param string actionstring */ function show() { $fbConfig =& CKunenaConfig::getInstance(); extract($this->params); $q = implode(" ", $this->get_searchstrings()); $searchuser = $this->get_searchusername(); $limitstart = $this->get_limitstart(); $limit = $this->get_limit(); $selected = ' selected="selected"'; $checked = ' checked="checked"'; $fb_advsearch_hide = 1; if ($this->int_kunena_errornr) { $q = $this->searchword; $fb_advsearch_hide = 0; } if (file_exists(KUNENA_ABSTMPLTPATH . '/plugin/advancedsearch/advsearch.php')) { include (KUNENA_ABSTMPLTPATH . '/plugin/advancedsearch/advsearch.php'); } else { include (KUNENA_PATH_TEMPLATE_DEFAULT .DS. 'plugin/advancedsearch/advsearch.php'); } $results = $this->get_results(); $totalRows = $this->total; $pagination = KunenaSearchPagination($this->func, $q, $this->getUrlParams(), floor($limitstart/$limit)+1, $limit, floor($totalRows/$limit)+1, 7); if (defined('KUNENA_DEBUG')) echo '<p style="background-color:#FFFFCC;border:1px solid red;">' . $this->str_kunena_errormsg . '</p>'; ?> <?php if (empty($q) && empty($searchuser)) { return; } $boardclass = 'fb_'; ?> <div class="<?php echo $boardclass; ?>_bt_cvr1"> <div class="<?php echo $boardclass; ?>_bt_cvr2"> <div class="<?php echo $boardclass; ?>_bt_cvr3"> <div class="<?php echo $boardclass; ?>_bt_cvr4"> <div class="<?php echo $boardclass; ?>_bt_cvr5"> <table class = "fb_blocktable" id ="fb_forumsearch" border = "0" cellspacing = "0" cellpadding = "0" width="100%"> <thead> <tr> <th colspan = "3"> <div class = "fb_title_cover"> <span class="fb_title fbl"><?php echo _KUNENA_SEARCH_RESULTS; ?></span> <b><?php printf(_FORUM_SEARCH, $q); ?></b> </div> </th> </tr> </thead> <tbody> <tr class = "fb_sth"> <th class = "th-1 <?php echo $boardclass; ?>sectiontableheader"> <?php echo _GEN_SUBJECT; ?> </th> <th class = "th-2 <?php echo $boardclass; ?>sectiontableheader"> <?php echo _GEN_AUTHOR; ?> </th> <th class = "th-3 <?php echo $boardclass; ?>sectiontableheader"> <?php echo _GEN_DATE; ?> </th> </tr> <?php $tabclass = array ( "sectiontableentry1", "sectiontableentry2" ); $k = 0; if ($totalRows == 0 && $this->int_kunena_errornr) { echo '<tr class="' . $boardclass . '' . $tabclass[$k] . '" ><td colspan="3" style="text-align:center;font-weight:bold">' . $this->str_kunena_errormsg . '</td></tr>'; } // Cleanup incoming searchword; international chars can cause garbage at the end // real problem might lie with search box form and how we post and receive the data // However, this works for now $q = trim($q); // JJ Add different color $searchlist = $this->get_searchstrings(); foreach ($results as $result) { $k = 1 - $k; $ressubject = $result->subject; // Clean up subject $ressubject = stripslashes(smile::purify($ressubject)); $ressubject = smile::htmlwrap($ressubject, $fbConfig->wrap); $resmessage = stripslashes($result->message); // Strip smiles and bbcode out of search results; they look ugly $resmessage = CKunenaTools::prepareContent($resmessage); $resmessage = smile::purify($resmessage); $resmessage = kn_mb_substr(kunena_htmlspecialchars($resmessage), 0, 300); $resmessage = smile::htmlwrap($resmessage, $fbConfig->wrap); $utf8 = (KUNENA_CHARSET == 'UTF-8') ? "u" : ""; foreach ($searchlist as $searchword) { if (empty($searchword)) continue; $ressubject = preg_replace("/".preg_quote($searchword, '/')."/i".$utf8, '<span class="searchword" >' . $searchword . '</span>', $ressubject); $resmessage = preg_replace("/".preg_quote($searchword, '/')."/i".$utf8, '<span class="searchword" >' . $searchword . '</span>', $resmessage); } echo '<tr class="' . $boardclass . '' . $tabclass[$k] . '">'; echo '<td class = "td-1" ><a href="' . JRoute::_(KUNENA_LIVEURLREL . '&func=view&id=' . $result->id . '&catid=' . $result->catid) . '#' . $result->id . '" >' . $ressubject . '</a><br />' . $resmessage . '<br /><br /></td>'; echo '<td class = "td-2" >' . kunena_htmlspecialchars(stripslashes($result->name)) . '</td>'; echo '<td class = "td-3" >' . date(_DATETIME, $result->time) . '</td></tr>'; echo "\n"; } ?> <?php if ($totalRows > $limit) { ?> <tr class = "fb_sth" > <th colspan = "3" style = "text-align:center" class = "th-1 <?php echo $boardclass; ?>sectiontableheader"> <?php echo $pagination; ?> </th> </tr> <?php } ?> <tr class = "fb_sth" > <th colspan = "3" style = "text-align:center" class = "th-1 <?php echo $boardclass; ?>sectiontableheader"> <?php $resStart = $limitstart+1; $resStop = $limitstart+count($results); if ($resStart<$resStop) $resStartStop = (string)($resStart).' - '.(string)($resStop); else $resStartStop = '0'; printf(_FORUM_SEARCHRESULTS, $resStartStop, $totalRows); ?> </th> </tr> </tbody> </table> </div> </div> </div> </div> </div> <?php } } function KunenaSearchPagination($function, $q, $urlparams, $page, $limit, $totalpages, $maxpages) { $fbConfig =& CKunenaConfig::getInstance(); if ($page==0) $page++; $startpage = ($page - floor($maxpages/2) < 1) ? 1 : $page - floor($maxpages/2); $endpage = $startpage + $maxpages; if ($endpage > $totalpages) { $startpage = ($totalpages-$maxpages) < 1 ? 1 : $totalpages-$maxpages; $endpage = $totalpages; } $output = '<div class="fb_pagination">'._PAGE; if ($startpage > 1) { if ($endpage < $totalpages) $endpage--; $output .= CKunenaLink::GetSearchLink($fbConfig, $function, $q, 0, $limit, 1, $urlparams, $rel='nofollow'); if ($startpage > 2) { $output .= "..."; } } for ($i = $startpage; $i <= $endpage && $i <= $totalpages; $i++) { if ($page == $i) { $output .= "<strong>$i</strong>"; } else { $output .= CKunenaLink::GetSearchLink($fbConfig, $function, $q, ($i-1)*$limit, $limit, $i, $urlparams, $rel='nofollow'); } } if ($endpage < $totalpages) { if ($endpage < $totalpages-1) { $output .= "..."; } $output .= CKunenaLink::GetSearchLink($fbConfig, $function, $q, ($totalpages-1)*$limit, $limit, $totalpages, $urlparams, $rel='nofollow'); } $output .= '</div>'; return $output; } ?>