2012-02-08 23:14:28 +01:00
< ? php
class ControllerSearchHelper extends Controller {
private $error = array ();
private $a = array (
'date1' => '' ,
'date2' => '' ,
'direction' => '' ,
'size' => '' ,
2015-04-13 16:23:52 +02:00
'aname' => '' ,
2012-02-08 23:14:28 +01:00
'attachment_type' => '' ,
2012-02-10 14:06:00 +01:00
'tag' => '' ,
2012-09-06 15:27:20 +02:00
'note' => '' ,
2012-08-28 22:00:45 +02:00
'ref' => '' ,
2012-09-06 15:27:20 +02:00
'folders' => '' ,
2012-09-15 15:30:35 +02:00
'extra_folders' => '' ,
2013-09-09 15:06:44 +02:00
'id' => '' ,
2013-10-05 11:34:06 +02:00
'match' => array ()
2012-02-08 23:14:28 +01:00
);
public function index (){
$this -> id = " content " ;
$this -> template = " search/helper.tpl " ;
$this -> layout = " common/layout-empty " ;
$request = Registry :: get ( 'request' );
$db = Registry :: get ( 'db' );
$sphx = Registry :: get ( 'sphx' );
$this -> load -> model ( 'search/search' );
$this -> load -> model ( 'search/message' );
$this -> load -> model ( 'user/user' );
$this -> data [ 'page' ] = 0 ;
if ( isset ( $this -> request -> post [ 'page' ])) { $this -> data [ 'page' ] = $this -> request -> post [ 'page' ]; }
$this -> data [ 'page_len' ] = get_page_length ();
$this -> data [ 'n' ] = - 1 ;
2012-09-06 15:27:20 +02:00
if ( $this -> request -> post [ 'searchtype' ] == 'expert' ){
2012-02-12 16:16:54 +01:00
2016-08-15 07:25:17 +02:00
if ( isset ( $this -> request -> post [ 'search' ]) && preg_match ( " /(from|to|subject|body|direction|d|size|date1|date2|attachment|a|aname|tag|note|id|folder) \ :/ " , $this -> request -> post [ 'search' ])) {
2014-01-23 21:39:47 +01:00
$this -> a = $this -> model_search_search -> preprocess_post_expert_request ( $this -> request -> post );
2012-09-06 15:27:20 +02:00
}
else {
$this -> naive_preprocess_post_expert_request ( $this -> request -> post );
}
2012-02-12 16:16:54 +01:00
2012-02-08 23:14:28 +01:00
$this -> fixup_post_request ();
2012-02-12 16:16:54 +01:00
2013-12-23 12:12:18 +01:00
list ( $this -> data [ 'n' ], $this -> data [ 'total_found' ], $this -> data [ 'all_ids' ], $this -> data [ 'messages' ]) = $this -> model_search_search -> search_messages ( $this -> a , $this -> data [ 'page' ]);
2012-02-12 16:16:54 +01:00
}
else {
2012-02-08 23:14:28 +01:00
$this -> fixup_post_simple_request ();
2013-12-23 12:12:18 +01:00
list ( $this -> data [ 'n' ], $this -> data [ 'total_found' ], $this -> data [ 'all_ids' ], $this -> data [ 'messages' ]) = $this -> model_search_search -> search_messages ( $this -> a , $this -> data [ 'page' ]);
2012-02-08 23:14:28 +01:00
}
2012-09-06 15:27:20 +02:00
2012-03-10 14:52:50 +01:00
if ( $this -> a [ 'ref' ]) { $this -> data [ '_ref' ] = $this -> a [ 'ref' ]; }
2012-04-27 22:57:43 +02:00
if ( isset ( $this -> request -> post [ 'ref' ]) && $this -> request -> post [ 'ref' ]) { $this -> data [ '_ref' ] = $this -> request -> post [ 'ref' ]; }
2012-02-08 23:14:28 +01:00
/* paging info */
$this -> data [ 'prev_page' ] = $this -> data [ 'page' ] - 1 ;
$this -> data [ 'next_page' ] = $this -> data [ 'page' ] + 1 ;
2015-08-11 15:16:13 +02:00
if ( $this -> data [ 'total_found' ] > MAX_SEARCH_HITS ) {
$this -> data [ 'total_pages' ] = ceil ( MAX_SEARCH_HITS / $this -> data [ 'page_len' ]) - 1 ;
$this -> data [ 'hits' ] = MAX_SEARCH_HITS ;
}
else {
$this -> data [ 'total_pages' ] = $this -> data [ 'total_pages' ] = ceil ( $this -> data [ 'total_found' ] / $this -> data [ 'page_len' ]) - 1 ;
$this -> data [ 'hits' ] = $this -> data [ 'total_found' ];
}
2012-02-08 23:14:28 +01:00
$this -> data [ 'hits_from' ] = $this -> data [ 'page' ] * $this -> data [ 'page_len' ] + 1 ;
2015-08-11 15:16:13 +02:00
$this -> data [ 'hits_to' ] = $this -> data [ 'page' ] * $this -> data [ 'page_len' ] + $this -> data [ 'n' ];
2012-02-08 23:14:28 +01:00
2014-01-10 12:27:26 +01:00
$this -> data [ 'sort' ] = $this -> request -> post [ 'sort' ];
$this -> data [ 'order' ] = $this -> request -> post [ 'order' ];
2012-02-08 23:14:28 +01:00
$this -> render ();
}
private function fixup_post_simple_request () {
2013-10-05 11:34:06 +02:00
$match = '' ;
if ( isset ( $this -> request -> post [ 'from' ]) && $this -> request -> post [ 'from' ]) { $match .= " @from " . $this -> request -> post [ 'from' ] . ' ' ; }
if ( isset ( $this -> request -> post [ 'to' ]) && $this -> request -> post [ 'to' ]) { $match .= " @to " . $this -> request -> post [ 'to' ] . ' ' ; }
if ( isset ( $this -> request -> post [ 'subject' ]) && $this -> request -> post [ 'subject' ]) { $match .= " @subject " . $this -> request -> post [ 'subject' ] . ' ' ; }
if ( isset ( $this -> request -> post [ 'body' ]) && $this -> request -> post [ 'body' ]) { $match .= " @body " . $this -> request -> post [ 'body' ] . ' ' ; }
if ( isset ( $this -> request -> post [ 'tag' ])) { $this -> a [ 'tag' ] = $this -> request -> post [ 'tag' ]; }
if ( isset ( $this -> request -> post [ 'note' ])) { $this -> a [ 'note' ] = $this -> request -> post [ 'note' ]; }
if ( isset ( $this -> request -> post [ 'attachment_type' ])) { $this -> a [ 'attachment_type' ] = $this -> request -> post [ 'attachment_type' ]; }
if ( isset ( $this -> request -> post [ 'date1' ])) { $this -> a [ 'date1' ] = $this -> request -> post [ 'date1' ]; }
if ( isset ( $this -> request -> post [ 'date2' ])) { $this -> a [ 'date2' ] = $this -> request -> post [ 'date2' ]; }
if ( $this -> a [ 'attachment_type' ] && $this -> a [ 'attachment_type' ] != " any " ) { $match .= " @attachment_types " . preg_replace ( " /,/ " , " OR " , $this -> a [ 'attachment_type' ]); }
$match = preg_replace ( " /OR/ " , " | " , $match );
$this -> a [ 'match' ] = preg_split ( " / / " , $match );
2014-06-03 23:17:43 +02:00
$this -> a [ 'sort' ] = " date " ;
$this -> a [ 'order' ] = 0 ;
2012-02-08 23:14:28 +01:00
}
private function fixup_post_request () {
2012-02-15 11:03:27 +01:00
if ( isset ( $this -> request -> post [ 'ref' ])) { $this -> a [ 'ref' ] = $this -> request -> post [ 'ref' ]; }
2012-09-06 15:27:20 +02:00
if ( isset ( $this -> request -> post [ 'folders' ])) { $this -> a [ 'folders' ] = $this -> request -> post [ 'folders' ]; }
2012-09-15 15:30:35 +02:00
if ( isset ( $this -> request -> post [ 'extra_folders' ])) { $this -> a [ 'extra_folders' ] = $this -> request -> post [ 'extra_folders' ]; }
2012-02-15 11:03:27 +01:00
2012-02-08 23:14:28 +01:00
$this -> a [ 'sort' ] = $this -> request -> post [ 'sort' ];
$this -> a [ 'order' ] = $this -> request -> post [ 'order' ];
}
2012-09-06 15:27:20 +02:00
private function naive_preprocess_post_expert_request ( $data = array ()) {
$ndate = 0 ;
2013-10-05 11:34:06 +02:00
$from = $match = '' ;
$prev_token_is_email = 0 ;
2012-09-06 15:27:20 +02:00
if ( ! isset ( $data [ 'search' ])) { return ; }
2013-10-05 11:34:06 +02:00
$s = preg_replace ( " /OR/ " , " | " , $data [ 'search' ]);
$b = preg_split ( " / \ s/ " , $s );
2012-09-06 15:27:20 +02:00
while ( list ( $k , $v ) = each ( $b )) {
if ( $v == '' ) { continue ; }
2013-07-28 20:56:59 +02:00
if ( preg_match ( " / \ d { 4} \ - \ d { 1,2} \ - \ d { 1,2}/ " , $v ) || preg_match ( " / \ d { 1,2} \ / \ d { 1,2} \ / \ d { 4}/ " , $v )) {
2012-09-06 15:27:20 +02:00
$ndate ++ ;
$this -> a [ " date $ndate " ] = $v ;
}
else if ( strchr ( $v , '@' )) {
2013-10-05 11:34:06 +02:00
$prev_token_is_email = 1 ;
if ( $from == '' ) { $from = " @from " ; }
$from .= " $v " ;
}
else {
if ( $prev_token_is_email == 1 ) {
$prev_token_is_email = 0 ;
$from .= " $v " ;
}
else {
$match .= ' ' . $v ;
}
2012-09-06 15:27:20 +02:00
}
}
2013-10-05 11:34:06 +02:00
if ( $match && $match != ' ' . $this -> data [ 'text_enter_search_terms' ]) {
$match = " @(subject,body) $match " ;
}
if ( $from ) { $match = $from . ' ' . $match ; }
$this -> a [ 'match' ] = preg_split ( " / / " , $match );
2012-09-06 15:27:20 +02:00
if ( $this -> a [ 'date1' ] && $this -> a [ 'date2' ] == '' ) { $this -> a [ 'date2' ] = $this -> a [ 'date1' ]; }
}
2012-02-08 23:14:28 +01:00
}
?>