added a primitive global search view
This commit is contained in:
parent
2770b1a902
commit
503c02aaac
@ -9,6 +9,7 @@ class Site extends CI_Controller
|
|||||||
var $VIEW_DELETE = 'site_delete';
|
var $VIEW_DELETE = 'site_delete';
|
||||||
var $VIEW_CATALOG = 'site_catalog';
|
var $VIEW_CATALOG = 'site_catalog';
|
||||||
var $VIEW_LOG = 'log';
|
var $VIEW_LOG = 'log';
|
||||||
|
var $VIEW_SEARCH = 'site_search';
|
||||||
|
|
||||||
function __construct ()
|
function __construct ()
|
||||||
{
|
{
|
||||||
@ -609,6 +610,100 @@ class Site extends CI_Controller
|
|||||||
redirect ("wiki/attachment/{$part[0]}/{$hexwikiname}/{$hexattname}");
|
redirect ("wiki/attachment/{$part[0]}/{$hexwikiname}/{$hexattname}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function search ($scope = '', $needle = '')
|
||||||
|
{
|
||||||
|
$login = $this->login->getUser ();
|
||||||
|
if (CODEPOT_SIGNIN_COMPULSORY && $login['id'] == '')
|
||||||
|
redirect (CODEPOT_SIGNIN_REDIR_PATH . $this->converter->AsciiTohex(current_url()));
|
||||||
|
|
||||||
|
$search = new stdClass();
|
||||||
|
$search->scope = $scope;
|
||||||
|
$search->needle = $this->converter->HexToAscii($needle);
|
||||||
|
|
||||||
|
$data['login'] = $login;
|
||||||
|
$data['search'] = $search;
|
||||||
|
|
||||||
|
$this->load->view ($this->VIEW_SEARCH, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function enjson_search ($filter = '', $offset = '')
|
||||||
|
{
|
||||||
|
$this->load->model ('WikiModel', 'wikis');
|
||||||
|
$this->load->model ('IssueModel', 'issues');
|
||||||
|
$this->load->model ('FileModel', 'files');
|
||||||
|
|
||||||
|
$login = $this->login->getUser ();
|
||||||
|
if (CODEPOT_SIGNIN_COMPULSORY && $login['id'] == '')
|
||||||
|
{
|
||||||
|
$status = 'signin';
|
||||||
|
$results = array();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$scope = '';
|
||||||
|
$needle = '';
|
||||||
|
if ($filter != '')
|
||||||
|
{
|
||||||
|
parse_str ($this->converter->HexToAscii($filter), $search);
|
||||||
|
if (array_key_exists ('scope', $search)) $scope = $search['scope'];
|
||||||
|
if (array_key_exists ('needle', $search)) $needle = $search['needle'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filter == '' && $offset == '')
|
||||||
|
{
|
||||||
|
$offset = 0;
|
||||||
|
}
|
||||||
|
else if ($filter != '' && $offset == '')
|
||||||
|
{
|
||||||
|
if (is_numeric($filter))
|
||||||
|
{
|
||||||
|
$offset = (integer)$filter;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$offset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$offset = (integer)$offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
$status = 'ok';
|
||||||
|
$results = array();
|
||||||
|
|
||||||
|
if ($scope == 'wikis' || $scope == 'all')
|
||||||
|
{
|
||||||
|
$x = $this->wikis->search($needle);
|
||||||
|
if ($x === FALSE) $status = 'dberr';
|
||||||
|
else $results = array_merge($results, $x);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scope == 'issues' || $scope == 'all')
|
||||||
|
{
|
||||||
|
$x = $this->issues->search($needle);
|
||||||
|
if ($x === FALSE) $status = 'dberr';
|
||||||
|
else $results = array_merge($results, $x);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scope == 'files' || $scope == 'all')
|
||||||
|
{
|
||||||
|
$x = $this->files->search($needle);
|
||||||
|
if ($x === FALSE) $status = 'dberr';
|
||||||
|
else $results = array_merge($results, $x);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($status != 'ok') $results = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = array (
|
||||||
|
'status' => $status,
|
||||||
|
'results' => $results
|
||||||
|
);
|
||||||
|
|
||||||
|
print codepot_json_encode($data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -560,6 +560,83 @@ class FileModel extends CI_Model
|
|||||||
restore_error_handler ();
|
restore_error_handler ();
|
||||||
return $x;
|
return $x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function search ($needle = '')
|
||||||
|
{
|
||||||
|
$items = array();
|
||||||
|
if ($needle == '') return $items;
|
||||||
|
|
||||||
|
$this->db->trans_start ();
|
||||||
|
|
||||||
|
$this->db->select ('projectid,name,tag,description');
|
||||||
|
$this->db->like ('name', $needle);
|
||||||
|
$this->db->or_like ('tag', $needle);
|
||||||
|
$this->db->or_like ('description', $needle);
|
||||||
|
$query = $this->db->get('file');
|
||||||
|
if ($this->db->trans_status() === FALSE)
|
||||||
|
{
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $query->result();
|
||||||
|
if (!empty($result))
|
||||||
|
{
|
||||||
|
foreach ($result as $r)
|
||||||
|
{
|
||||||
|
$posa = stripos($r->name, $needle);
|
||||||
|
$posb = stripos($r->tag, $needle);
|
||||||
|
$posc = stripos($r->description, $needle);
|
||||||
|
if ($posa !== false || $posb !== false || $posc !== false)
|
||||||
|
{
|
||||||
|
$text = "";
|
||||||
|
if ($posc !== false)
|
||||||
|
{
|
||||||
|
$start_pos = $posc - 30;
|
||||||
|
if ($start_pos < 0) $start_pos = 0;
|
||||||
|
$text = substr($r->description, $start_pos, strlen($needle) + 100);
|
||||||
|
}
|
||||||
|
array_push ($items, array( 'type' => 'file_holder', 'projectid' => $r->projectid, 'name' => $r->name, 'tag' => $r->tag, 'partial_text' => $text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->select ('projectid,name,filename,description');
|
||||||
|
$this->db->like ('filename', $needle);
|
||||||
|
$this->db->or_like ('description', $needle);
|
||||||
|
$query = $this->db->get ('file_list');
|
||||||
|
|
||||||
|
if ($this->db->trans_status() === FALSE)
|
||||||
|
{
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $query->result();
|
||||||
|
if (!empty($result))
|
||||||
|
{
|
||||||
|
foreach ($result as $r)
|
||||||
|
{
|
||||||
|
$posa = stripos($r->filename, $needle);
|
||||||
|
$posb = stripos($r->description, $needle);
|
||||||
|
if ($posa !== false || $posb !== false)
|
||||||
|
{
|
||||||
|
$text = "";
|
||||||
|
if ($posb !== false)
|
||||||
|
{
|
||||||
|
$start_pos = $posb - 30;
|
||||||
|
if ($start_pos < 0) $start_pos = 0;
|
||||||
|
$text = substr($r->description, $start_pos, strlen($needle) + 30);
|
||||||
|
}
|
||||||
|
array_push ($items, array( 'type' => 'file', 'projectid' => $r->projectid, 'name' => $r->name, 'filename' => $r->filename, 'partial_text' => $text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -1076,6 +1076,109 @@ class IssueModel extends CI_Model
|
|||||||
$issue = &$result[0];
|
$issue = &$result[0];
|
||||||
return ($issue->createdby == $userid || $issue->updatedby == $userid);
|
return ($issue->createdby == $userid || $issue->updatedby == $userid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function search ($needle = '')
|
||||||
|
{
|
||||||
|
$items = array();
|
||||||
|
if ($needle == '') return $items;
|
||||||
|
|
||||||
|
$this->db->trans_start ();
|
||||||
|
|
||||||
|
$this->db->select ('projectid,id,summary,description');
|
||||||
|
$this->db->like ('summary', $needle);
|
||||||
|
$this->db->or_like ('description', $needle);
|
||||||
|
$query = $this->db->get('issue');
|
||||||
|
if ($this->db->trans_status() === FALSE)
|
||||||
|
{
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $query->result();
|
||||||
|
if (!empty($result))
|
||||||
|
{
|
||||||
|
foreach ($result as $r)
|
||||||
|
{
|
||||||
|
$posa = stripos($r->summary, $needle);
|
||||||
|
$posb = stripos($r->description, $needle);
|
||||||
|
if ($posa !== false || $posb !== false)
|
||||||
|
{
|
||||||
|
$text = "";
|
||||||
|
if ($posb !== false)
|
||||||
|
{
|
||||||
|
$start_pos = $posb - 30;
|
||||||
|
if ($start_pos < 0) $start_pos = 0;
|
||||||
|
$text = substr($r->description, $start_pos, strlen($needle) + 100);
|
||||||
|
}
|
||||||
|
array_push ($items, array( 'type' => 'issue', 'projectid' => $r->projectid, 'issueid' => $r->id, 'summary' => $r->summary, 'partial_text' => $text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->select ('projectid,id,sno,comment');
|
||||||
|
$this->db->like ('comment', $needle);
|
||||||
|
$query = $this->db->get ('issue_change');
|
||||||
|
|
||||||
|
if ($this->db->trans_status() === FALSE)
|
||||||
|
{
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $query->result();
|
||||||
|
if (!empty($result))
|
||||||
|
{
|
||||||
|
// TODO: create a link to each chnage log comment in the main issue view.
|
||||||
|
// Use the link to jump to the comment.
|
||||||
|
foreach ($result as $r)
|
||||||
|
{
|
||||||
|
$posa = false;
|
||||||
|
if (($posa = stripos($r->comment, $needle)) !== false)
|
||||||
|
{
|
||||||
|
$start_pos = $posa - 30;
|
||||||
|
if ($start_pos < 0) $start_pos = 0;
|
||||||
|
$text = substr($r->comment, $start_pos, strlen($needle) + 100);
|
||||||
|
array_push ($items, array( 'type' => 'issue', 'projectid' => $r->projectid, 'issueid' => $r->id, 'summary' => $r->sno, 'partial_text' => $text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->select ('projectid,issueid,filename,description');
|
||||||
|
$this->db->like ('filename', $needle);
|
||||||
|
$this->db->or_like ('description', $needle);
|
||||||
|
$query = $this->db->get ('issue_file_list');
|
||||||
|
|
||||||
|
if ($this->db->trans_status() === FALSE)
|
||||||
|
{
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $query->result();
|
||||||
|
if (!empty($result))
|
||||||
|
{
|
||||||
|
foreach ($result as $r)
|
||||||
|
{
|
||||||
|
$posa = stripos($r->filename, $needle);
|
||||||
|
$posb = stripos($r->description, $needle);
|
||||||
|
if ($posa !== false || $posb !== false)
|
||||||
|
{
|
||||||
|
$text = "";
|
||||||
|
if ($posb !== false)
|
||||||
|
{
|
||||||
|
$start_pos = $posb - 30;
|
||||||
|
if ($start_pos < 0) $start_pos = 0;
|
||||||
|
$text = substr($r->description, $start_pos, strlen($needle) + 30);
|
||||||
|
}
|
||||||
|
array_push ($items, array( 'type' => 'issue_file', 'projectid' => $r->projectid, 'issueid' => $r->issueid, 'filename' => $r->filename, 'partial_text' => $text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -518,6 +518,75 @@ class WikiModel extends CI_Model
|
|||||||
restore_error_handler ();
|
restore_error_handler ();
|
||||||
return $x;
|
return $x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function search ($needle = '')
|
||||||
|
{
|
||||||
|
$items = array();
|
||||||
|
if ($needle == '') return $items;
|
||||||
|
|
||||||
|
$this->db->trans_start ();
|
||||||
|
|
||||||
|
$this->db->select ('projectid,name,text,doctype');
|
||||||
|
$this->db->like ('name', $needle);
|
||||||
|
$this->db->or_like ('text', $needle);
|
||||||
|
$query = $this->db->get('wiki');
|
||||||
|
if ($this->db->trans_status() === FALSE)
|
||||||
|
{
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $query->result();
|
||||||
|
if (!empty($result))
|
||||||
|
{
|
||||||
|
foreach ($result as $r)
|
||||||
|
{
|
||||||
|
$posa = stripos($r->name, $needle);
|
||||||
|
$posb = stripos($r->text, $needle);
|
||||||
|
/* TODO: consider the wiki type and strip special tags, and let matching happen against the normal text only */
|
||||||
|
if ($posa !== false || $posb !== false)
|
||||||
|
{
|
||||||
|
$text = "";
|
||||||
|
if ($posb !== false)
|
||||||
|
{
|
||||||
|
$start_pos = $posb - 30;
|
||||||
|
if ($start_pos < 0) $start_pos = 0;
|
||||||
|
$text = substr($r->text, $start_pos, strlen($needle) + 100);
|
||||||
|
}
|
||||||
|
array_push ($items, array( 'type' => 'wiki', 'projectid' => $r->projectid, 'name' => $r->name, 'partial_text' => $text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->select ('projectid,wikiname,name');
|
||||||
|
|
||||||
|
$this->db->like ('name', $needle);
|
||||||
|
$query = $this->db->get ('wiki_attachment');
|
||||||
|
|
||||||
|
if ($this->db->trans_status() === FALSE)
|
||||||
|
{
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $query->result();
|
||||||
|
if (!empty($result))
|
||||||
|
{
|
||||||
|
foreach ($result as $r)
|
||||||
|
{
|
||||||
|
/* TODO: consider the wiki type and strip special tags, and let matching happen against the normal text only */
|
||||||
|
if (($posa = stripos($r->name, $needle)) !== false)
|
||||||
|
{
|
||||||
|
array_push ($items, array( 'type' => 'wiki_attachment', 'projectid' => $r->projectid, 'name' => $r->name, 'wikiname' => $r->wikiname));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->trans_complete ();
|
||||||
|
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -28,6 +28,7 @@ www_DATA = \
|
|||||||
site_edit.php \
|
site_edit.php \
|
||||||
site_delete.php \
|
site_delete.php \
|
||||||
site_home.php \
|
site_home.php \
|
||||||
|
site_search.php \
|
||||||
site_show.php \
|
site_show.php \
|
||||||
taskbar.php \
|
taskbar.php \
|
||||||
user_home.php \
|
user_home.php \
|
||||||
|
@ -280,6 +280,7 @@ www_DATA = \
|
|||||||
site_edit.php \
|
site_edit.php \
|
||||||
site_delete.php \
|
site_delete.php \
|
||||||
site_home.php \
|
site_home.php \
|
||||||
|
site_search.php \
|
||||||
site_show.php \
|
site_show.php \
|
||||||
taskbar.php \
|
taskbar.php \
|
||||||
user_home.php \
|
user_home.php \
|
||||||
|
Loading…
Reference in New Issue
Block a user