git-svn-id: https://192.168.0.254/svn/Proyectos.FundacionLQDVI_WebCongresos/trunk@2 94ccb1af-fd9d-d947-8d90-7f70ea60afc8
565 lines
19 KiB
PHP
565 lines
19 KiB
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;
|
|
}
|
|
|
|
?>
|