piler/webui/controller/search/helper.php

173 lines
6.4 KiB
PHP
Raw Normal View History

2012-02-08 23:14:28 +01:00
<?php
class ControllerSearchHelper extends Controller {
private $error = array();
private $a = array(
'date1' => '',
'date2' => '',
'direction' => '',
'size' => '',
'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' => '',
'id' => '',
'raw' => '',
'match' => array()
2012-02-08 23:14:28 +01:00
);
public function index(){
$this->id = "content";
if(ENABLE_MOBILE_PREVIEW && MOBILE_DEVICE) {
$this->template = "search/helper-mobile.tpl";
} else {
$this->template = "search/helper.tpl";
}
2012-02-08 23:14:28 +01:00
$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
if(isset($this->request->post['search']) && preg_match("/(from|to|subject|body|direction|d|size|date1|date2|attachment|a|tag|note|id|raw)\:/", $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
$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() {
$match = '';
if(isset($this->request->post['from']) && $this->request->post['from']) { $match .= sprintf('%s %s ', FROM_TOKEN, $this->request->post['from']); }
if(isset($this->request->post['to']) && $this->request->post['to']) { $match .= sprintf('%s %s ', TO_TOKEN, $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;
$from = $match = '';
$prev_token_is_email = 0;
2012-09-06 15:27:20 +02:00
if(!isset($data['search'])) { return; }
$s = preg_replace("/OR/", "|", $data['search']);
$b = preg_split("/\s/", $s);
2012-09-06 15:27:20 +02:00
foreach ($b as $k => $v) {
2012-09-06 15:27:20 +02:00
if($v == '') { continue; }
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, '@')) {
$prev_token_is_email = 1;
if($from == '') { $from = FROM_TOKEN; }
$from .= " $v";
}
else {
$match .= ' ' . $v;
2012-09-06 15:27:20 +02:00
}
}
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
}
?>