2006-12-02 04:36:16 +00:00
< ? php
/*
2009-11-12 15:11:17 +00:00
* e107 website system
*
2009-11-18 01:06:08 +00:00
* Copyright ( C ) 2008 - 2009 e107 Inc ( e107 . org )
2009-11-12 15:11:17 +00:00
* Released under the terms and conditions of the
* GNU General Public License ( http :// www . gnu . org / licenses / gpl . txt )
*
*
*
* $Source : / cvs_backup / e107_0 . 8 / e107_handlers / search_class . php , v $
2010-02-10 18:18:01 +00:00
* $Revision $
* $Date $
* $Author $
2009-11-12 15:11:17 +00:00
*/
2006-12-02 04:36:16 +00:00
if ( ! defined ( 'e107_INIT' )) { exit ; }
2022-04-04 10:54:24 -07:00
/**
*
*/
class e_search
2014-01-05 11:25:30 -08:00
{
2006-12-02 04:36:16 +00:00
var $query ;
var $text ;
var $pos ;
var $bullet ;
var $keywords ;
var $stopwords_php = " |a|about|an|and|are|as|at|be|by|com|edu|for|from|how|i|in|is|it|of|on|or|that|the|this|to|was|what|when|where|who|will|with|the|www| " ;
var $stopwords_mysql = " |a|a's|able|about|above|according|accordingly|across|actually|after|afterwards|again|against|ain't|all|allow|allows|almost|alone|along|already|also|although|always|am|among|amongst|an|and|another|any|anybody|anyhow|anyone|anything|anyway|anyways|anywhere|apart|appear|appreciate|appropriate|are|aren't|around|as|aside|ask|asking|associated|at|available|away|awfully|be|became|because|become|becomes|becoming|been|before|beforehand|behind|being|believe|below|beside|besides|best|better|between|beyond|both|brief|but|by|c'mon|c's|came|can|can't|cannot|cant|cause|causes|certain|certainly|changes|clearly|co|com|come|comes|concerning|consequently|consider|considering|contain|containing|contains|corresponding|could|couldn't|course|currently|definitely|described|despite|did|didn't|different|do|does|doesn't|doing|don't|done|down|downwards|during|each|edu|eg|eight|either|else|elsewhere|enough|entirely|especially|et|etc|even|ever|every|everybody|everyone|everything|everywhere|ex|exactly|example|except|far|few|fifth|first|five|followed|following|follows|for|former|formerly|forth|four|from|further|furthermore|get|gets|getting|given|gives|go|goes|going|gone|got|gotten|greetings|had|hadn't|happens|hardly|has|hasn't|have|haven't|having|he|he's|hello|help|hence|her|here|here's|hereafter|hereby|herein|hereupon|hers|herself|hi|him|himself|his|hither|hopefully|how|howbeit|however|i|i'd|i'll|i'm|i've|ie|if|ignored|immediate|in|inasmuch|inc|indeed|indicate|indicated|indicates|inner|insofar|instead|into|inward|is|isn't|it|it'd|it'll|it's|its|itself|just|keep|keeps|kept|know|knows|known|last|lately|later|latter|latterly|least|less|lest|let|let's|like|liked|likely|little|look|looking|looks|ltd|mainly|many|may|maybe|me|mean|meanwhile|merely|might|more|moreover|most|mostly|much|must|my|myself|name|namely|nd|near|nearly|necessary|need|needs|neither|never|nevertheless|new|next|nine|no|nobody|non|none|noone|nor|normally|not|nothing|novel|now|nowhere|obviously|of|off|often|oh|ok|okay|old|on|once|one|ones|only|onto|or|other|others|otherwise|ought|our|ours|ourselves|out|outside|over|overall|own|particular|particularly|per|perhaps|php|placed|please|plus|possible|presumably|probably|provides|que|quite|qv|rather|rd|re|really|reasonably|regarding|regardless|regards|relatively|respectively|right|said|same|saw|say|saying|says|second|secondly|see|seeing|seem|seemed|seeming|seems|seen|self|selves|sensible|sent|serious|seriously|seven|several|shall|she|should|shouldn't|since|six|so|some|somebody|somehow|someone|something|sometime|sometimes|somewhat|somewhere|soon|sorry|specified|specify|specifying|still|sub|such|sup|sure|t's|take|taken|tell|tends|th|than|thank|thanks|thanx|that|that's|thats|the|their|theirs|them|themselves|then|thence|there|there's|thereafter|thereby|therefore|therein|theres|thereupon|these|they|they'd|they'll|they're|they've|think|third|this|thorough|thoroughly|those|though|three|through|throughout|thru|thus|to|together|too|took|toward|towards|tried|tries|truly|try|trying|twice|two|un|under|unfortunately|unless|unlikely|until|unto|up|upon|us|use|used|useful|uses|using|usually|value|various|very|via|viz|vs|want|wants|was|wasn't|way|we|we'd|we'll|we're|we've|welcome|well|went|were|weren't|what|what's|whatever|when|whence|whenever|where|where's|whereafter|whereas|whereby|wherein|whereupon|wherever|whether|which|while|whither|who|who's|whoever|whole|whom|whose|why|will|willing|wish|with|within|without|won't|wonder|would|would|wouldn't|yes|yet|you|you'd|you'll|you're|you've|your|yours|yourself|yourselves|zero| " ;
2016-02-02 14:28:59 -08:00
var $params ;
2021-01-13 16:16:50 -08:00
public $stop_keys = array ();
2016-02-02 14:28:59 -08:00
2022-04-04 10:54:24 -07:00
/**
* @ param $query
*/
2016-02-01 20:29:46 -08:00
function __construct ( $query = '' )
2009-08-23 10:57:51 +00:00
{
2013-10-24 04:15:25 +03:00
$tp = e107 :: getParser ();
2021-09-04 15:06:19 +02:00
$this -> query = ( string ) $query ;
2009-08-23 10:57:51 +00:00
$this -> bullet = '' ;
2013-10-24 04:15:25 +03:00
if ( defined ( 'GLYPH' ))
2009-08-23 10:57:51 +00:00
{
2013-10-24 04:15:25 +03:00
$this -> bullet = '<i class="' . GLYPH . '"></i>' ;
}
elseif ( defined ( 'BULLET' ))
{
$this -> bullet = '<img src="' . THEME_ABS . 'images/' . BULLET . '" alt="" class="icon" />' ;
2009-08-23 10:57:51 +00:00
}
elseif ( file_exists ( THEME . 'images/bullet2.gif' ))
{
2013-10-24 04:15:25 +03:00
$this -> bullet = '<img src="' . THEME_ABS . 'images/bullet2.gif" alt="bullet" class="icon" />' ;
2009-08-23 10:57:51 +00:00
}
2016-02-02 14:28:59 -08:00
$this -> bullet = '' ; // Use CSS instead.
2016-02-01 20:29:46 -08:00
preg_match_all ( '/(\W?".*?")|(.*?)(\s|$)/' , $this -> query , $boolean_keys );
2020-06-26 13:58:59 -07:00
$this -> keywords [ 'split' ] = array_unique ( array_filter ( str_replace ( '"' , '' , array_merge ( $boolean_keys [ 1 ], $boolean_keys [ 2 ]))));
sort ( $this -> keywords [ 'split' ]);
2016-02-01 20:29:46 -08:00
foreach ( $this -> keywords [ 'split' ] as $k_key => $key )
{
2006-12-02 04:36:16 +00:00
if ( ! $this -> stopword ( $key )) {
2020-01-18 18:26:35 +01:00
if ( $key [( $tp -> ustrlen ( $key ) - 1 )] == '*' ) {
2006-12-02 04:36:16 +00:00
$this -> keywords [ 'wildcard' ][ $k_key ] = TRUE ;
2013-10-24 04:15:25 +03:00
$key = $tp -> usubstr ( $key , 0 , - 1 );
2006-12-02 04:36:16 +00:00
} else {
$this -> keywords [ 'wildcard' ][ $k_key ] = FALSE ;
}
2020-01-18 18:26:35 +01:00
if ( $key [ 0 ] == '+' ) {
2006-12-02 04:36:16 +00:00
$this -> keywords [ 'boolean' ][ $k_key ] = '+' ;
$this -> keywords [ 'match' ][ $k_key ] = substr ( $key , 1 );
2020-01-18 18:26:35 +01:00
} else if ( $key [ 0 ] == '-' ) {
2006-12-02 04:36:16 +00:00
$this -> keywords [ 'boolean' ][ $k_key ] = '-' ;
$this -> keywords [ 'match' ][ $k_key ] = substr ( $key , 1 );
} else {
$this -> keywords [ 'boolean' ][ $k_key ] = FALSE ;
$this -> keywords [ 'match' ][ $k_key ] = $key ;
}
2021-01-24 17:00:02 -08:00
$this -> keywords [ 'exact' ][ $k_key ] = $tp -> ustrpos ( $key , ' ' ) !== false ;
2006-12-02 04:36:16 +00:00
$this -> keywords [ 'match' ][ $k_key ] = $tp -> toDB ( $this -> keywords [ 'match' ][ $k_key ]);
2016-02-01 20:29:46 -08:00
}
else {
2006-12-02 04:36:16 +00:00
unset ( $this -> keywords [ 'split' ][ $k_key ]);
}
}
}
2014-01-05 11:25:30 -08:00
2022-04-04 10:54:24 -07:00
/**
* @ param $get
* @ return void
*/
2016-02-02 14:28:59 -08:00
function setParams ( $get = array ())
{
$this -> params = $get ;
}
2014-01-05 11:25:30 -08:00
2022-04-04 10:54:24 -07:00
/**
* @ return mixed
*/
2016-02-02 14:28:59 -08:00
function getParams ()
{
return $this -> params ;
}
2014-01-05 11:25:30 -08:00
2022-04-04 10:54:24 -07:00
/**
* @ param $table
* @ param $return_fields
* @ param $search_fields
* @ param $weights
* @ param $handler
* @ param $no_results
* @ param $where
* @ param $order
* @ return array
*/
2016-02-02 14:28:59 -08:00
public function parsesearch ( $table , $return_fields , $search_fields , $weights , $handler , $no_results , $where , $order )
2014-01-05 11:25:30 -08:00
{
global $query , $search_prefs , $pre_title , $search_chars , $search_res , $result_flag ;
$sql = e107 :: getDb ( 'search' );
2013-10-24 04:15:25 +03:00
$tp = e107 :: getParser ();
2014-01-05 11:25:30 -08:00
2016-02-01 20:29:46 -08:00
if ( $handler == 'self' ) //v2 use 'compile' function inside e_search.php;
2014-01-05 11:25:30 -08:00
{
$handler = array ( $this , 'compile' );
}
if ( is_array ( $return_fields ))
{
2014-01-13 11:07:02 -08:00
$return_fields = implode ( " , " , $return_fields );
2014-01-05 11:25:30 -08:00
}
2006-12-02 04:36:16 +00:00
$this -> query = $tp -> toDB ( $query );
2016-02-01 20:29:46 -08:00
$match_query = '' ;
2014-01-05 11:25:30 -08:00
if ( ! $search_prefs [ 'mysql_sort' ])
{
2016-02-01 20:29:46 -08:00
if ( e_DEBUG )
{
echo e107 :: getMessage () -> addDebug ( " Using PHP Sort Method " ) -> render ();;
}
2006-12-02 04:36:16 +00:00
$field_operator = 'AND ' ;
2014-01-05 11:25:30 -08:00
foreach ( $this -> keywords [ 'match' ] as $k_key => $key )
{
2006-12-02 04:36:16 +00:00
$boolean_regex = '' ;
2016-02-01 20:29:46 -08:00
2014-01-05 11:25:30 -08:00
if ( $this -> keywords [ 'boolean' ][ $k_key ] == '+' )
{
2006-12-02 04:36:16 +00:00
$key_operator = 'OR ' ;
$break = TRUE ;
$no_exact = TRUE ;
2016-02-01 20:29:46 -08:00
}
elseif ( $this -> keywords [ 'boolean' ][ $k_key ] == '-' )
2014-01-05 11:25:30 -08:00
{
foreach ( $this -> keywords as $unset_key => $unset_value )
{
2006-12-02 04:36:16 +00:00
unset ( $this -> keywords [ $unset_key ][ $k_key ]);
}
$key_operator = 'AND ' ;
$boolean_regex = 'NOT' ;
$no_exact = TRUE ;
2014-01-05 11:25:30 -08:00
}
2016-02-01 20:29:46 -08:00
elseif ( ! isset ( $break ))
2014-01-05 11:25:30 -08:00
{
2006-12-02 04:36:16 +00:00
$key_operator = 'OR ' ;
2014-01-05 11:25:30 -08:00
if ( isset ( $switch ))
{
2006-12-02 04:36:16 +00:00
$field_operator = 'OR ' ;
}
$switch = TRUE ;
2014-01-05 11:25:30 -08:00
}
else
{
2006-12-02 04:36:16 +00:00
break ;
}
2016-02-01 20:29:46 -08:00
2006-12-02 04:36:16 +00:00
$match_query .= isset ( $uninitial_field ) ? " " . $field_operator . " ( " : " ( " ;
$uninitial_field = TRUE ;
2016-02-01 20:29:46 -08:00
if ( $this -> keywords [ 'wildcard' ][ $k_key ] || ! $search_prefs [ 'boundary' ])
{
2006-12-02 04:36:16 +00:00
$wildcard = '' ;
2016-02-01 20:29:46 -08:00
}
else
{
2006-12-02 04:36:16 +00:00
$wildcard = '[[:>:]]' ;
}
2016-02-01 20:29:46 -08:00
2006-12-02 04:36:16 +00:00
$key_count = 1 ;
2016-02-01 20:29:46 -08:00
foreach ( $search_fields as $field )
{
2006-12-02 04:36:16 +00:00
$regexp = $search_prefs [ 'boundary' ] ? " [[:<:]] " . $key . $wildcard : $key ;
$match_query .= " " . $field . " " . $boolean_regex . " REGEXP ' " . $regexp . " ' " ;
if ( $key_count != count ( $search_fields )) {
$match_query .= $key_operator ;
}
$key_count ++ ;
}
2016-02-01 20:29:46 -08:00
2006-12-02 04:36:16 +00:00
$match_query .= " ) " ;
}
2016-02-01 20:29:46 -08:00
if ( $order )
{
2006-12-02 04:36:16 +00:00
$sql_order = 'ORDER BY ' ;
$order_count = count ( $order );
$i = 1 ;
2016-02-01 20:29:46 -08:00
foreach ( $order as $sort_key => $sort_value )
{
2006-12-02 04:36:16 +00:00
$sql_order .= $sort_key . ' ' . $sort_value ;
2016-02-01 20:29:46 -08:00
if ( $i != $order_count )
{
2006-12-02 04:36:16 +00:00
$sql_order .= ', ' ;
}
$i ++ ;
}
2016-02-01 20:29:46 -08:00
} else
{
2006-12-02 04:36:16 +00:00
$sql_order = '' ;
}
2016-02-01 20:29:46 -08:00
2006-12-02 04:36:16 +00:00
$limit = $search_prefs [ 'php_limit' ] ? ' LIMIT 0,' . $search_prefs [ 'php_limit' ] : '' ;
2016-02-01 20:29:46 -08:00
2006-12-02 04:36:16 +00:00
$sql_query = " SELECT " . $return_fields . " FROM # " . $table . " WHERE " . $where . " ( " . $match_query . " ) " . $sql_order . $limit . " ; " ;
2016-02-01 20:29:46 -08:00
2014-01-13 11:07:02 -08:00
if ((( $keycount = count ( $this -> keywords [ 'split' ])) > 1 ) && ( strpos ( $query , '"' ) === FALSE ) && ( ! isset ( $no_exact )))
{
2006-12-02 04:36:16 +00:00
$exact_query [] = $query ;
$this -> keywords [ 'split' ] = array_merge ( $exact_query , $this -> keywords [ 'split' ]);
}
2014-01-05 11:25:30 -08:00
}
2016-02-01 20:29:46 -08:00
else // MySQL Sorting.
2014-01-05 11:25:30 -08:00
{
2016-02-01 20:29:46 -08:00
if ( e_DEBUG )
{
2016-06-01 18:36:16 -07:00
e107 :: getDebug () -> log ( " Using MYSQL Sort Method " );
2016-02-01 20:29:46 -08:00
}
2006-12-02 04:36:16 +00:00
$this -> query = str_replace ( '"' , '"' , $this -> query );
2014-06-02 04:49:24 +03:00
//$field_query = implode(',', $search_fields);
2014-01-13 11:07:02 -08:00
foreach ( $search_fields as $field_key => $field )
{
2017-03-18 12:11:56 -07:00
$search_query [] = " ( " . varset ( $weights [ $field_key ], 0.6 ) . " * (MATCH( " . $field . " ) AGAINST (' " . str_replace ( " " , " + " , $this -> query ) . " ' IN BOOLEAN MODE))) " ;
2014-06-02 04:49:24 +03:00
$field_query [] = " MATCH( " . $field . " ) AGAINST (' " . $this -> query . " ' IN BOOLEAN MODE) " ;
2006-12-02 04:36:16 +00:00
}
2014-01-13 11:07:02 -08:00
2006-12-02 04:36:16 +00:00
$match_query = implode ( ' + ' , $search_query );
2014-06-02 04:49:24 +03:00
$field_query = implode ( ' || ' , $field_query );
2006-12-02 04:36:16 +00:00
$sql_order = '' ;
2016-02-01 20:29:46 -08:00
2014-01-13 11:07:02 -08:00
foreach ( $order as $sort_key => $sort_value )
{
2006-12-02 04:36:16 +00:00
$sql_order .= ', ' . $sort_key . ' ' . $sort_value ;
}
2017-03-18 12:11:56 -07:00
$limit = " LIMIT " . intval ( $result_flag ) . " , " . $search_res ;
2014-01-13 11:07:02 -08:00
2014-06-02 04:49:24 +03:00
$sql_query = " SELECT SQL_CALC_FOUND_ROWS " . $return_fields . " , ( " . $match_query . " ) AS relevance FROM # " . $table . " WHERE " . $where . " ( " . $field_query . " ) HAVING relevance > 0 ORDER BY relevance DESC " . $sql_order . $limit . " ; " ;
2016-02-01 20:29:46 -08:00
2006-12-02 04:36:16 +00:00
}
2016-02-02 14:28:59 -08:00
if ( E107_DBG_SQLQUERIES )
{
2017-03-18 12:11:56 -07:00
echo e107 :: getMessage () -> addDebug ( str_replace ( '#' , MPREFIX , $sql_query )) -> render ();
2016-02-02 14:28:59 -08:00
}
2014-01-05 11:25:30 -08:00
if ( $ps [ 'results' ] = $sql -> gen ( $sql_query ))
{
if ( ! $search_prefs [ 'mysql_sort' ])
{
2006-12-02 04:36:16 +00:00
$x = 0 ;
2016-02-01 20:29:46 -08:00
foreach ( $search_fields as $field_key => $field )
{
2006-12-02 04:36:16 +00:00
$crop_fields [] = preg_replace ( '/(.*?)\./' , '' , $field );
}
2016-02-01 20:29:46 -08:00
while ( $row = $sql -> fetch ())
2014-01-05 11:25:30 -08:00
{
2006-12-02 04:36:16 +00:00
$weight = 0 ;
2014-01-05 11:25:30 -08:00
foreach ( $crop_fields as $field_key => $field )
{
2006-12-02 04:36:16 +00:00
$this -> text = $row [ $field ];
2014-01-05 11:25:30 -08:00
foreach ( $this -> keywords [ 'match' ] as $k_key => $this -> query )
{
2020-12-20 11:50:10 -08:00
if ( stripos ( $this -> text , $this -> query ) !== false )
2014-01-05 11:25:30 -08:00
{
if ( $this -> keywords [ 'exact' ][ $k_key ] || $this -> keywords [ 'boolean' ][ $k_key ])
{
2006-12-02 04:36:16 +00:00
$weight += (( $weights [ $field_key ] * 2 ) * ( $keycount ));
$endweight = TRUE ;
2014-01-05 11:25:30 -08:00
}
else if ( ! $endweight )
{
2006-12-02 04:36:16 +00:00
$weight += $weights [ $field_key ];
}
}
}
$endweight = FALSE ;
}
2014-01-05 11:25:30 -08:00
foreach ( $row as $r_key => $r_value )
{
2006-12-02 04:36:16 +00:00
$qrow [ $x ][ $r_key ] = $r_value ;
$qrow [ $x ][ 'relevance' ] = $weight ;
$qrow [ $x ][ 'search_id' ] = $x ;
}
$x ++ ;
}
2014-01-05 11:25:30 -08:00
foreach ( $qrow as $info )
{
2006-12-02 04:36:16 +00:00
$sortarr [] = $info [ 'relevance' ];
}
array_multisort ( $sortarr , SORT_DESC , $qrow , SORT_DESC );
$result_number = ( $x < ( $result_flag + $search_res )) ? $x : $result_flag + $search_res ;
for ( $i = $result_flag ; $i < $result_number ; $i ++ ) {
$display_row [] = $qrow [ $i ];
}
} else {
$x = 0 ;
2020-12-14 16:21:48 -08:00
while ( $row = $sql -> fetch ())
2014-01-05 11:25:30 -08:00
{
2006-12-02 04:36:16 +00:00
$display_row [] = $row ;
$x ++ ;
}
}
2014-01-05 11:25:30 -08:00
foreach ( $display_row as $row )
{
2006-12-02 04:36:16 +00:00
$res = call_user_func ( $handler , $row );
2014-01-05 11:25:30 -08:00
if ( ! $res [ 'omit_result' ])
{
2006-12-02 04:36:16 +00:00
$matches = array ( $res [ 'title' ], $res [ 'summary' ]);
$endcrop = FALSE ;
2016-02-02 14:28:59 -08:00
$output = '' ; // <!-- Start Search Block -->';
2006-12-02 04:36:16 +00:00
$title = TRUE ;
2014-02-04 09:22:34 -08:00
if ( ! empty ( $matches ))
{
2016-02-01 20:29:46 -08:00
2014-02-04 09:22:34 -08:00
foreach ( $matches as $this -> text )
2014-01-06 18:41:35 -08:00
{
2014-02-04 09:22:34 -08:00
$this -> text = nl2br ( $this -> text );
2021-01-19 18:52:56 -08:00
$t_search = $tp -> search ;
$t_replace = $tp -> replace ;
2014-02-04 09:22:34 -08:00
$s_search = array ( '<br />' , '[' , ']' );
$s_replace = array ( ' ' , '<' , '>' );
$search = array_merge ( $t_search , $s_search );
$replace = array_merge ( $t_replace , $s_replace );
$this -> text = strip_tags ( str_replace ( $search , $replace , $this -> text ));
if ( ! empty ( $this -> keywords [ 'match' ]))
{
2016-02-01 20:29:46 -08:00
2014-02-04 09:22:34 -08:00
foreach ( $this -> keywords [ 'match' ] as $match_id => $this -> query )
{
$boundary = $search_prefs [ 'boundary' ] ? '\b' : '' ;
if ( $this -> keywords [ 'wildcard' ][ $match_id ]) {
$regex_append = " .*? " . $boundary . " ) " ;
} else {
$regex_append = $boundary . " ) " ;
}
if (( $match_start = $tp -> ustristr ( $this -> text , $this -> query )) !== FALSE )
{
$this -> pos = $tp -> ustrlen ( $this -> text ) - $tp -> ustrlen ( $match_start );
if ( ! $endcrop && ! $title ) {
$this -> parsesearch_crop ();
$endcrop = TRUE ;
}
$key = $tp -> usubstr ( $this -> text , $this -> pos , $tp -> ustrlen ( $this -> query ));
2016-02-01 20:29:46 -08:00
$this -> text = preg_replace ( " #( " . $boundary . $this -> query . $regex_append . " #i " , " <mark> \\ 1</mark> " , $this -> text );
2014-02-04 09:22:34 -08:00
}
2006-12-02 04:36:16 +00:00
}
}
2014-02-04 09:22:34 -08:00
if ( $title )
2014-01-06 18:41:35 -08:00
{
2014-02-04 09:22:34 -08:00
if ( $pre_title == 0 )
{
$pre_title_output = " " ;
}
else if ( $pre_title == 1 )
{
$pre_title_output = $res [ 'pre_title' ];
}
else if ( $pre_title == 2 )
{
$pre_title_output = $pre_title ;
}
2016-02-02 14:28:59 -08:00
$this -> text = $this -> bullet . " <h4><a class='title visit' href=' " . $res [ 'link' ] . " '> " . $pre_title_output . $this -> text . " </a></h4> { DETAILS}<div> " . $res [ 'pre_summary' ];
2014-01-06 18:41:35 -08:00
}
2014-02-04 09:22:34 -08:00
elseif ( ! $endcrop )
2014-01-06 18:41:35 -08:00
{
2014-02-04 09:22:34 -08:00
$this -> parsesearch_crop ();
2006-12-02 04:36:16 +00:00
}
2014-01-06 18:41:35 -08:00
2014-02-04 09:22:34 -08:00
$output .= $this -> text ;
$title = FALSE ;
2006-12-02 04:36:16 +00:00
}
}
$display_rel = $search_prefs [ 'relevance' ] ? " | " . LAN_SEARCH_69 . " : " . round ( $row [ 'relevance' ], 1 ) : " " ;
2016-02-02 14:28:59 -08:00
$output_array [ 'text' ][] = " <li> " . str_replace ( '{DETAILS}' , " <span class='text-muted'> " . $res [ 'detail' ] . $display_rel . " </span> " , $output ) . $tp -> toText ( $res [ 'post_summary' ]) . " </div></li> \n \n " ;
// $ps['data'][] = $res;
2014-01-06 18:41:35 -08:00
}
else
{
2006-12-02 04:36:16 +00:00
$ps [ 'results' ] -- ;
$res [ 'omit_result' ] = FALSE ;
}
}
2014-01-06 18:41:35 -08:00
2006-12-02 04:36:16 +00:00
$ps_limit = $output_array [ 'text' ];
$result_number = ( $x < $search_res ) ? $x : $search_res ;
2014-01-06 18:41:35 -08:00
for ( $i = 0 ; $i < $result_number ; $i ++ )
{
2006-12-02 04:36:16 +00:00
$ps [ 'text' ] .= $ps_limit [ $i ];
}
2014-01-05 11:25:30 -08:00
}
else
{
2006-12-02 04:36:16 +00:00
$ps [ 'text' ] = $no_results ;
}
2010-01-03 22:01:59 +00:00
if ( $search_prefs [ 'mysql_sort' ])
{
$ps [ 'results' ] = $sql -> total_results ; // db class reads result of SELECT FOUND_ROWS() for us
2006-12-02 04:36:16 +00:00
}
return $ps ;
}
2022-04-04 10:54:24 -07:00
/**
* @ return void
*/
function parsesearch_crop ()
2014-01-05 11:25:30 -08:00
{
2006-12-02 04:36:16 +00:00
global $search_chars ;
2013-10-24 04:15:25 +03:00
$tp = e107 :: getParser ();
2006-12-02 04:36:16 +00:00
if ( strlen ( $this -> text ) > $search_chars ) {
2013-10-24 04:15:25 +03:00
if ( $this -> pos < ( $search_chars - $tp -> ustrlen ( $this -> query ))) {
$this -> text = $tp -> usubstr ( $this -> text , 0 , $search_chars ) . " ... " ;
} else if ( $this -> pos > ( $tp -> ustrlen ( $this -> text ) - ( $search_chars - $tp -> ustrlen ( $this -> query )))) {
$this -> text = " ... " . $tp -> usubstr ( $this -> text , ( $tp -> ustrlen ( $this -> text ) - ( $search_chars - $tp -> ustrlen ( $this -> query ))));
2006-12-02 04:36:16 +00:00
} else {
2013-10-24 04:15:25 +03:00
$this -> text = " ... " . $tp -> usubstr ( $this -> text , ( $this -> pos - round (( $search_chars / 3 ))), $search_chars ) . " ... " ;
2006-12-02 04:36:16 +00:00
}
2013-10-24 04:15:25 +03:00
$match_start = $tp -> ustristr ( $this -> text , $this -> query );
$this -> pos = $tp -> ustrlen ( $this -> text ) - $tp -> ustrlen ( $match_start );
2006-12-02 04:36:16 +00:00
}
}
2014-01-05 11:25:30 -08:00
2022-04-04 10:54:24 -07:00
/**
* @ param $key
* @ return bool
*/
function stopword ( $key )
2014-01-05 11:25:30 -08:00
{
2006-12-02 04:36:16 +00:00
global $search_prefs ;
2013-10-24 04:15:25 +03:00
$tp = e107 :: getParser ();
2020-01-18 18:26:35 +01:00
if ( $search_prefs [ 'mysql_sort' ] && ( $key [ 0 ] == '+' )) {
2013-10-24 04:15:25 +03:00
$key = $tp -> usubstr ( $key , 1 );
2006-12-02 04:36:16 +00:00
}
2020-01-18 18:26:35 +01:00
if (( $key [( $tp -> ustrlen ( $key ) - 1 )] != '*' ) && ( $key [ 0 ] != '+' )) {
2013-10-24 04:15:25 +03:00
if ( $tp -> ustrlen ( $key ) > 2 ) {
2006-12-02 04:36:16 +00:00
if ( $search_prefs [ 'mysql_sort' ]) {
$stopword_list = $this -> stopwords_mysql ;
} else {
$stopword_list = $this -> stopwords_php ;
}
2013-10-24 04:15:25 +03:00
if ( $tp -> ustrpos ( $stopword_list , '|' . $key . '|' ) !== FALSE ) {
2006-12-02 04:36:16 +00:00
$this -> stop_keys [] = $key ;
return TRUE ;
} else {
return FALSE ;
}
} else {
$this -> stop_keys [] = $key ;
return TRUE ;
}
} else {
return FALSE ;
}
}
2014-01-05 11:25:30 -08:00
2006-12-02 04:36:16 +00:00
}