From 66ef1c6fa3b164bc51184191b6b4a1d27b77b7ca Mon Sep 17 00:00:00 2001 From: leiyong <1549684884@qq.com> Date: Tue, 19 Jan 2021 11:13:23 +0800 Subject: [PATCH] * Finish task#9005. --- config/filter.php | 3 + config/zentaopms.php | 3 + db/update20.0.beta3.sql | 36 ++ db/zentao.sql | 36 ++ lib/spliter/spliter.class.php | 124 ++++++ module/action/model.php | 53 +++ module/common/lang/de.php | 40 +- module/common/lang/en.php | 40 +- module/common/lang/fr.php | 43 +- module/common/lang/vi.php | 43 +- module/common/lang/zh-cn.php | 34 +- module/common/model.php | 34 +- module/dev/config.php | 3 + module/dev/lang/de.php | 3 + module/dev/lang/en.php | 3 + module/dev/lang/fr.php | 3 + module/dev/lang/vi.php | 3 + module/dev/lang/zh-cn.php | 3 + module/group/lang/resource.php | 14 +- module/index/css/index.css | 18 + module/index/js/index.js | 131 ++++++ module/index/view/index.html.php | 11 +- module/program/view/pgmproduct.html.php | 4 +- module/search/config.php | 135 ++++++ module/search/control.php | 95 +++++ module/search/css/index.css | 39 ++ module/search/js/buildindex.js | 23 + module/search/lang/de.php | 38 ++ module/search/lang/en.php | 38 ++ module/search/lang/fr.php | 38 ++ module/search/lang/vi.php | 38 ++ module/search/lang/zh-cn.php | 38 ++ module/search/model.php | 542 ++++++++++++++++++++++++ module/search/view/buildindex.html.php | 32 ++ module/search/view/index.html.php | 49 +++ module/task/control.php | 24 +- 36 files changed, 1693 insertions(+), 121 deletions(-) create mode 100644 lib/spliter/spliter.class.php create mode 100644 module/search/css/index.css create mode 100644 module/search/js/buildindex.js create mode 100644 module/search/view/buildindex.html.php create mode 100644 module/search/view/index.html.php diff --git a/config/filter.php b/config/filter.php index 81657d9d99..184c7ef70e 100644 --- a/config/filter.php +++ b/config/filter.php @@ -284,3 +284,6 @@ $filter->repo->ajaxsynccommit->cookie['syncBranch'] = 'reg::any'; $filter->webhook->bind->get['selectedDepts'] = 'reg::checked'; $filter->webhook->bind->cookie['selectedDepts'] = 'reg::checked'; + +$filter->search->index->get['words'] = 'reg::any'; +$filter->search->index->get['type'] = 'code'; diff --git a/config/zentaopms.php b/config/zentaopms.php index d2727feafb..4e0296a8bb 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -174,6 +174,9 @@ if(!defined('TABLE_BUDGET')) define('TABLE_BUDGET', '`' . $config->d if(!defined('TABLE_HOLIDAY')) define('TABLE_HOLIDAY', '`' . $config->db->prefix . 'holiday`'); if(!defined('TABLE_WEEKLYREPORT')) define('TABLE_WEEKLYREPORT', '`' . $config->db->prefix . 'weeklyreport`'); +if(!defined('TABLE_SEARCHINDEX')) define('TABLE_SEARCHINDEX', $config->db->prefix . 'searchindex'); +if(!defined('TABLE_SEARCHDICT')) define('TABLE_SEARCHDICT', $config->db->prefix . 'searchdict'); + $config->objectTables['product'] = TABLE_PRODUCT; $config->objectTables['story'] = TABLE_STORY; $config->objectTables['productplan'] = TABLE_PRODUCTPLAN; diff --git a/db/update20.0.beta3.sql b/db/update20.0.beta3.sql index 44d439daeb..6276aa723d 100644 --- a/db/update20.0.beta3.sql +++ b/db/update20.0.beta3.sql @@ -18,3 +18,39 @@ ALTER TABLE `zt_project` DROP `storyConcept`; ALTER TABLE `zt_product` DROP `storyConcept`; ALTER TABLE `zt_user` CHANGE `avatar` `avatar` text NOT NULL AFTER `commiter`; + +-- DROP TABLE IF EXISTS `zt_searchindex`; +CREATE TABLE IF NOT EXISTS `zt_searchindex` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` char(20) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `title` text NOT NULL, + `content` text NOT NULL, + `addedDate` datetime NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `object` (`objectType`,`objectID`), + KEY `addedDate` (`addedDate`), + FULLTEXT KEY `content` (`content`), + FULLTEXT KEY `title` (`title`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- DROP TABLE IF EXISTS `zt_searchdict`; +CREATE TABLE IF NOT EXISTS `zt_searchdict` ( + `key` smallint(5) unsigned NOT NULL, + `value` char(3) NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +REPLACE INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES +(1, 'search', 'index'), +(2, 'search', 'index'), +(3, 'search', 'index'), +(4, 'search', 'index'), +(5, 'search', 'index'), +(6, 'search', 'index'), +(7, 'search', 'index'), +(8, 'search', 'index'), +(9, 'search', 'index'), +(10, 'search', 'index'), +(1, 'search', 'buildIndex'); diff --git a/db/zentao.sql b/db/zentao.sql index d0e5e4e44f..01a9f54ee0 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1,3 +1,26 @@ +-- DROP TABLE IF EXISTS `zt_searchindex`; +CREATE TABLE IF NOT EXISTS `zt_searchindex` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` char(20) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `title` text NOT NULL, + `content` text NOT NULL, + `addedDate` datetime NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `object` (`objectType`,`objectID`), + KEY `addedDate` (`addedDate`), + FULLTEXT KEY `content` (`content`), + FULLTEXT KEY `title` (`title`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- DROP TABLE IF EXISTS `zt_searchdict`; +CREATE TABLE IF NOT EXISTS `zt_searchdict` ( + `key` smallint(5) unsigned NOT NULL, + `value` char(3) NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + -- DROP TABLE IF EXISTS `zt_acl`; CREATE TABLE IF NOT EXISTS `zt_acl` ( `id` mediumint(9) NOT NULL AUTO_INCREMENT, @@ -1481,6 +1504,19 @@ INSERT INTO `zt_group` (`id`, `name`, `role`, `desc`) VALUES (12, 'LIMITED', 'limited', 'For limited user'), (13, '项目管理员', 'PRJAdmin', '项目管理员可以维护项目的权限'); +INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES +(1, 'search', 'index'), +(2, 'search', 'index'), +(3, 'search', 'index'), +(4, 'search', 'index'), +(5, 'search', 'index'), +(6, 'search', 'index'), +(7, 'search', 'index'), +(8, 'search', 'index'), +(9, 'search', 'index'), +(10, 'search', 'index'), +(1, 'search', 'buildIndex'); + INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (1, 'action', 'editComment'), (1, 'action', 'hideAll'), diff --git a/lib/spliter/spliter.class.php b/lib/spliter/spliter.class.php new file mode 100644 index 0000000000..c630596a22 --- /dev/null +++ b/lib/spliter/spliter.class.php @@ -0,0 +1,124 @@ + + * @package spliter + * @version $Id$ + * @link http://www.chanzhi.org + * @see http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html + * @see http://stackoverflow.com/questions/9361303/can-i-get-the-unicode-value-of-a-character-or-vise-versa-with-php + */ +class spliter +{ + /** + * Split a utf-8 string into words, computing unicode for every word. + * + * @param string $string + * @access public + * @return array + */ + public function utf8Split($string) + { + $string = strtolower($string); + $i = 0; + $length = strlen($string); + $dict = array(); + $words = ''; + $offset = 0; + + while($i <= $length) + { + $letter = substr($string, $i, 1); + $ord = ord($letter); + + /* The first letter is ascii, try to get a word. */ + if($ord >= 0 && $ord <= 191) + { + $i ++; + + if($this->isLetter($letter)) + { + $word = $letter; + while($i <= $length) + { + $letter = substr($string, $i, 1); + if(!$this->isLetter($letter)) break; + + $word .= $letter; + $i++; + } + + /* Process intigers. */ + if(is_numeric($word) and (strpos($word, '.') === false)) $word = "|" . $word . "|"; + $word = str_pad(strtolower($word), 5, '_'); + $words .= ' ' . $word; + } + continue; + } + + if($ord >= 192 && $ord <= 223) $offset = 2; + if($ord >= 224 && $ord <= 239) $offset = 3; + if($ord >= 240 && $ord <= 247) $offset = 4; + if($ord >= 248 && $ord <= 251) $offset = 5; + if($ord >= 252 && $ord <= 253) $offset = 6; + + if($offset >= 2) + { + $letter = substr($string, $i, $offset); + $unicode = $this->unicode($letter); + if(strlen($unicode) == 5) + { + $dict[$unicode] = $letter; + $words .= ' ' . $unicode; + } + else + { + $words .= ' ' . $letter; + } + $i += $offset; + } + } + + return array('dict' => $dict, 'words' => $words); + } + + /** + * Return unicode value for a char. + * + * @param string $c + * @access public + * @return int + */ + public function unicode($c) + { + if(ord($c{0}) >= 0 && ord($c{0}) <= 127) return ord($c{0}); + if(ord($c{0}) >= 192 && ord($c{0}) <= 223) return (ord($c{0}) - 192) * 64 + (ord($c{1}) - 128); + if(ord($c{0}) >= 224 && ord($c{0}) <= 239) return (ord($c{0}) - 224) * 4096 + (ord($c{1}) - 128) * 64 + (ord($c{2}) - 128); + if(ord($c{0}) >= 240 && ord($c{0}) <= 247) return (ord($c{0}) - 240) * 262144 + (ord($c{1}) - 128) * 4096 + (ord($c{2}) - 128) * 64 + (ord($c{3}) - 128); + if(ord($c{0}) >= 248 && ord($c{0}) <= 251) return (ord($c{0}) - 248) * 16777216 + (ord($c{1}) - 128) * 262144 + (ord($c{2}) - 128) * 4096 + (ord($c{3}) - 128) * 64 + (ord($c{4}) - 128); + if(ord($c{0}) >= 252 && ord($c{0}) <= 253) return (ord($c{0}) - 252) * 1073741824 + (ord($c{1}) - 128) * 16777216 + (ord($c{2}) - 128) * 262144 + (ord($c{3}) - 128) * 4096 + (ord($c{4}) - 128) * 64 + (ord($c{5}) - 128); + + if(ord($c{0}) >= 254 && ord($c{0}) <= 255) return false; + return false; + } + + /** + * Judge a char is Letter or not. + * + * @param string $letter + * @access public + * @return bool + */ + public function isLetter($letter) + { + $ord = ord($letter); + if($ord >= ord('a') and $ord <= ord('z')) return true; + if($ord >= ord('A') and $ord <= ord('Z')) return true; + if($ord >= ord(0) and $ord <= ord(9)) return true; + if($letter and strpos('._/->:&', $letter) !== false) return true; + return false; + } +} diff --git a/module/action/model.php b/module/action/model.php index 5c1dc4bbb5..58893fb728 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -69,6 +69,8 @@ class actionModel extends model $this->loadModel('message')->send($objectType, $objectID, $actionType, $actionID, $actor); + $this->saveIndex($objectType, $objectID, $actionType); + return $actionID; } @@ -1185,4 +1187,55 @@ class actionModel extends model ->fetch('count'); return $count > 0; } + + /** + * Save global search object index information. + * + * @param string $objectType + * @param int $objectID + * @param string $actionType + * @access public + * @return bool + */ + public function saveIndex($objectType, $objectID, $actionType) + { + $this->loadModel('search'); + $actionType = strtolower($actionType); + if(!isset($this->config->search->fields->$objectType)) return true; + if(strpos($this->config->search->buildAction, ",{$actionType},") === false and empty($_POST['comment'])) return true; + if($actionType == 'deleted' or $actionType == 'erased') return $this->search->deleteIndex($objectType, $objectID); + + $field = $this->config->search->fields->$objectType; + $query = $this->search->buildIndexQuery($objectType, $testDeleted = false); + $data = $query->andWhere('t1.' . $field->id)->eq($objectID)->fetch(); + if(empty($data)) return true; + + $data->comment = ''; + if($objectType == 'effort' and $data->objectType == 'task') return true; + if($objectType == 'case') + { + $caseStep = $this->dao->select('*')->from(TABLE_CASESTEP)->where('`case`')->eq($objectID)->andWhere('version')->eq($data->version)->fetchAll(); + $data->desc = ''; + $data->expect = ''; + foreach($caseStep as $step) + { + $data->desc .= $step->desc . "\n"; + $data->expect .= $step->expect . "\n"; + } + } + + $actions = $this->dao->select('*')->from(TABLE_ACTION) + ->where('objectType')->eq($objectType) + ->andWhere('objectID')->eq($objectID) + ->orderBy('id asc') + ->fetchAll(); + foreach($actions as $action) + { + if($action->action == 'opened') $data->{$field->addedDate} = $action->date; + $data->{$field->editedDate} = $action->date; + if(!empty($action->comment)) $data->comment .= $action->comment . "\n"; + } + + $this->search->saveIndex($objectType, $data); + } } diff --git a/module/common/lang/de.php b/module/common/lang/de.php index 06df3be9c7..48b7dde614 100644 --- a/module/common/lang/de.php +++ b/module/common/lang/de.php @@ -131,6 +131,11 @@ $lang->typeAB = 'Typ'; $lang->common = new stdclass(); $lang->common->common = 'Standard Module'; +global $config; +list($programModule, $programMethod) = explode('-', $config->programLink); +list($productModule, $productMethod) = explode('-', $config->productLink); +list($projectModule, $projectMethod) = explode('-', $config->projectLink); + /* Main menu. */ $lang->mainNav = new stdclass(); $lang->mainNav->my = ' My|my|index|'; @@ -220,7 +225,11 @@ $lang->holiday->menu = $lang->subject->menu; $lang->measurement = new stdclass(); $lang->measurement->menu = new stdclass(); +$lang->searchTips = ''; +$lang->searchAB = 'Search'; + /* Object list in search form. */ +$lang->searchObjects['all'] = 'All'; $lang->searchObjects['bug'] = 'Bug'; $lang->searchObjects['story'] = 'Story'; $lang->searchObjects['task'] = 'Aufgaben'; @@ -236,6 +245,7 @@ $lang->searchObjects['testreport'] = 'Test-Bericht'; $lang->searchObjects['program'] = 'Program'; $lang->searchObjects['project'] = 'Project'; $lang->searchObjects['execution'] = $lang->sprintCommon; +$lang->searchObjects['user'] = 'User'; $lang->searchTips = 'ID (strg+g)'; /* Code formats for import. */ @@ -338,18 +348,18 @@ $lang->story->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->task = array('link' => 'Aufgabenliste|project|task|projectID=%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); -$lang->project->menu->burn = array('link' => 'Burn|project|burn|projectID=%s'); -$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); -$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => 'Test Aufgabe|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); -$lang->project->menu->doc = array('link' => 'Dok|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->task = array('link' => 'Aufgabenliste|project|task|projectID=%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); +$lang->project->menu->burn = array('link' => 'Burn|project|burn|projectID=%s'); +$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); +$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => 'Test Aufgabe|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); +$lang->project->menu->doc = array('link' => 'Dok|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); $lang->project->subMenu = new stdclass(); $lang->project->subMenu->view = new stdclass(); @@ -560,6 +570,9 @@ $lang->admin->subMenu->system = new stdclass(); $lang->admin->subMenu->system->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); $lang->admin->subMenu->system->timezone = array('link' => 'Timezone|custom|timezone', 'subModule' => 'custom'); +$lang->admin->subMenu->system->buildIndex = array('link' => 'Full Text Search|search|buildindex|'); +$lang->admin->subMenuOrder->system[15] = 'buildIndex'; + $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); $lang->action = new stdclass(); @@ -619,6 +632,7 @@ $lang->navGroup = new stdclass(); $lang->navGroup->my = 'my'; $lang->navGroup->todo = 'my'; $lang->navGroup->effort = 'my'; +$lang->navGroup->score = 'my'; $lang->navGroup->personnel = 'program'; @@ -999,6 +1013,6 @@ $lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectsto $lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => ''); $lang->nc->menu = $lang->auditplan->menu; -$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage'); +$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage'); include (dirname(__FILE__) . '/menuOrder.php'); diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 7a3d219dce..e7dde67eb2 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -131,6 +131,11 @@ $lang->typeAB = 'Type'; $lang->common = new stdclass(); $lang->common->common = 'Common Module'; +global $config; +list($programModule, $programMethod) = explode('-', $config->programLink); +list($productModule, $productMethod) = explode('-', $config->productLink); +list($projectModule, $projectMethod) = explode('-', $config->projectLink); + /* Main menu. */ $lang->mainNav = new stdclass(); $lang->mainNav->my = ' My|my|index|'; @@ -220,7 +225,11 @@ $lang->holiday->menu = $lang->subject->menu; $lang->measurement = new stdclass(); $lang->measurement->menu = new stdclass(); +$lang->searchTips = ''; +$lang->searchAB = 'Search'; + /* Object list in search form. */ +$lang->searchObjects['all'] = 'All'; $lang->searchObjects['bug'] = 'Bug'; $lang->searchObjects['story'] = 'Story'; $lang->searchObjects['task'] = 'Task'; @@ -236,6 +245,7 @@ $lang->searchObjects['testreport'] = 'Test Report'; $lang->searchObjects['program'] = 'Program'; $lang->searchObjects['project'] = 'Project'; $lang->searchObjects['execution'] = $lang->sprintCommon; +$lang->searchObjects['user'] = 'User'; $lang->searchTips = 'ID (ctrl+g)'; /* Code formats for import. */ @@ -338,18 +348,18 @@ $lang->story->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->task = array('link' => 'Task|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); -$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); -$lang->project->menu->burn = array('link' => 'Burndown|project|burn|projectID=%s'); -$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); -$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => 'Request|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); -$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->task = array('link' => 'Task|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); +$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); +$lang->project->menu->burn = array('link' => 'Burndown|project|burn|projectID=%s'); +$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); +$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => 'Request|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); +$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); $lang->project->subMenu = new stdclass(); $lang->project->subMenu->view = new stdclass(); @@ -560,6 +570,9 @@ $lang->admin->subMenu->system = new stdclass(); $lang->admin->subMenu->system->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); $lang->admin->subMenu->system->timezone = array('link' => 'Timezone|custom|timezone', 'subModule' => 'custom'); +$lang->admin->subMenu->system->buildIndex = array('link' => 'Full Text Search|search|buildindex|'); +$lang->admin->subMenuOrder->system[15] = 'buildIndex'; + $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); $lang->action = new stdclass(); @@ -619,6 +632,7 @@ $lang->navGroup = new stdclass(); $lang->navGroup->my = 'my'; $lang->navGroup->todo = 'my'; $lang->navGroup->effort = 'my'; +$lang->navGroup->score = 'my'; $lang->navGroup->personnel = 'program'; @@ -999,6 +1013,6 @@ $lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectsto $lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => ''); $lang->nc->menu = $lang->auditplan->menu; -$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage'); +$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage'); include (dirname(__FILE__) . '/menuOrder.php'); diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php index b522a94d44..84362b5dd3 100644 --- a/module/common/lang/fr.php +++ b/module/common/lang/fr.php @@ -131,6 +131,11 @@ $lang->typeAB = 'Type'; $lang->common = new stdclass(); $lang->common->common = 'Module Commun'; +global $config; +list($programModule, $programMethod) = explode('-', $config->programLink); +list($productModule, $productMethod) = explode('-', $config->productLink); +list($projectModule, $projectMethod) = explode('-', $config->projectLink); + /* Main menu. */ $lang->mainNav = new stdclass(); $lang->mainNav->my = ' My|my|index|'; @@ -220,7 +225,11 @@ $lang->holiday->menu = $lang->subject->menu; $lang->measurement = new stdclass(); $lang->measurement->menu = new stdclass(); +$lang->searchTips = ''; +$lang->searchAB = 'Search'; + /* Object list in search form. */ +$lang->searchObjects['all'] = 'All'; $lang->searchObjects['bug'] = 'Bug'; $lang->searchObjects['story'] = 'Story'; $lang->searchObjects['task'] = 'Tâche'; @@ -236,6 +245,7 @@ $lang->searchObjects['testreport'] = 'CR de Test'; $lang->searchObjects['program'] = 'Program'; $lang->searchObjects['project'] = 'Project'; $lang->searchObjects['execution'] = $lang->sprintCommon; +$lang->searchObjects['user'] = 'User'; $lang->searchTips = 'ID (ctrl+g)'; /* Code formats for import. */ @@ -338,21 +348,18 @@ $lang->story->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->task = array('link' => 'Tâche|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); -$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); -$lang->project->menu->burn = array('link' => 'Atterrissage|project|burn|projectID=%s'); -$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); -$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => 'Recette|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); -$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->team = array('link' => 'Equipe|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->action = array('link' => 'Historique|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->view = array('link' => "Vue d'ensemble|project|view|projectID=%s", 'alias' => 'edit,start,suspend,putoff,close'); -$lang->project->menu->whitelist = array('link' => 'Whitelist|project|whitelist|projectID=%s', 'alias' => 'addwhitelist', 'subModule' => 'personnel'); +$lang->project->menu->task = array('link' => 'Tâche|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); +$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); +$lang->project->menu->burn = array('link' => 'Atterrissage|project|burn|projectID=%s'); +$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->story = array('link' => "Story|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); +$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => 'Recette|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); +$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->team = array('link' => 'Equipe|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); $lang->project->subMenu = new stdclass(); $lang->project->subMenu->view = new stdclass(); @@ -563,6 +570,9 @@ $lang->admin->subMenu->system = new stdclass(); $lang->admin->subMenu->system->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); $lang->admin->subMenu->system->timezone = array('link' => 'Timezone|custom|timezone', 'subModule' => 'custom'); +$lang->admin->subMenu->system->buildIndex = array('link' => 'Full Text Search|search|buildindex|'); +$lang->admin->subMenuOrder->system[15] = 'buildIndex'; + $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); $lang->action = new stdclass(); @@ -622,6 +632,7 @@ $lang->navGroup = new stdclass(); $lang->navGroup->my = 'my'; $lang->navGroup->todo = 'my'; $lang->navGroup->effort = 'my'; +$lang->navGroup->score = 'my'; $lang->navGroup->personnel = 'program'; @@ -1002,6 +1013,6 @@ $lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectsto $lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => ''); $lang->nc->menu = $lang->auditplan->menu; -$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage'); +$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage'); include (dirname(__FILE__) . '/menuOrder.php'); diff --git a/module/common/lang/vi.php b/module/common/lang/vi.php index a474c115a8..55b1542df9 100644 --- a/module/common/lang/vi.php +++ b/module/common/lang/vi.php @@ -131,6 +131,11 @@ $lang->typeAB = 'Loại'; $lang->common = new stdclass(); $lang->common->common = 'Module chung'; +global $config; +list($programModule, $programMethod) = explode('-', $config->programLink); +list($productModule, $productMethod) = explode('-', $config->productLink); +list($projectModule, $projectMethod) = explode('-', $config->projectLink); + /* Main menu. */ $lang->mainNav = new stdclass(); $lang->mainNav->my = ' My|my|index|'; @@ -220,7 +225,11 @@ $lang->holiday->menu = $lang->subject->menu; $lang->measurement = new stdclass(); $lang->measurement->menu = new stdclass(); +$lang->searchTips = ''; +$lang->searchAB = 'Tìm ki?m'; + /* Object list in search form. */ +$lang->searchObjects['all'] = 'T?t c?'; $lang->searchObjects['bug'] = 'Bug'; $lang->searchObjects['story'] = 'Câu chuyện'; $lang->searchObjects['task'] = 'Nhiệm vụ'; @@ -236,6 +245,7 @@ $lang->searchObjects['testreport'] = 'Test báo cáo'; $lang->searchObjects['program'] = 'Program'; $lang->searchObjects['project'] = 'Project'; $lang->searchObjects['execution'] = $lang->sprintCommon; +$lang->searchObjects['user'] = 'User'; $lang->searchTips = 'ID (ctrl+g)'; /* Code formats for import. */ @@ -338,21 +348,18 @@ $lang->story->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->task = array('link' => 'Nhiệm vụ|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); -$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); -$lang->project->menu->burn = array('link' => 'Burndown|project|burn|projectID=%s'); -$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->story = array('link' => 'Câu chuyện|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); -$lang->project->menu->build = array('link' => 'Bản dựng|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => 'Yêu cầu|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); -$lang->project->menu->doc = array('link' => 'Tài liệu|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->team = array('link' => 'Đội nhóm|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->action = array('link' => 'Lịch sử|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->view = array('link' => 'Tổng quan|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); -$lang->project->menu->whitelist = array('link' => 'Whitelist|project|whitelist|projectID=%s', 'alias' => 'addwhitelist', 'subModule' => 'personnel'); +$lang->project->menu->task = array('link' => 'Nhiệm vụ|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); +$lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); +$lang->project->menu->burn = array('link' => 'Burndown|project|burn|projectID=%s'); +$lang->project->menu->view = array('link' => 'View|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->story = array('link' => "Câu chuyện|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); +$lang->project->menu->build = array('link' => 'Bản dựng|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => 'Yêu cầu|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); +$lang->project->menu->doc = array('link' => 'Tài liệu|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->team = array('link' => 'Đội nhóm|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->more = array('link' => 'More|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); $lang->project->subMenu = new stdclass(); $lang->project->subMenu->view = new stdclass(); @@ -563,6 +570,9 @@ $lang->admin->subMenu->system = new stdclass(); $lang->admin->subMenu->system->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); $lang->admin->subMenu->system->timezone = array('link' => 'Timezone|custom|timezone', 'subModule' => 'custom'); +$lang->admin->subMenu->system->buildIndex = array('link' => 'Full Text Search|search|buildindex|'); +$lang->admin->subMenuOrder->system[15] = 'buildIndex'; + $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); $lang->action = new stdclass(); @@ -622,6 +632,7 @@ $lang->navGroup = new stdclass(); $lang->navGroup->my = 'my'; $lang->navGroup->todo = 'my'; $lang->navGroup->effort = 'my'; +$lang->navGroup->score = 'my'; $lang->navGroup->personnel = 'program'; @@ -1002,6 +1013,6 @@ $lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectsto $lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => ''); $lang->nc->menu = $lang->auditplan->menu; -$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage'); +$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage'); include (dirname(__FILE__) . '/menuOrder.php'); diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 9b4f09cb62..c5ad25e747 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -225,7 +225,11 @@ $lang->holiday->menu = $lang->subject->menu; $lang->measurement = new stdclass(); $lang->measurement->menu = new stdclass(); -/* 查询条中可以选择的对象列表。*/ +$lang->searchTips = ''; +$lang->searchAB = '搜索'; + +/* 查询中可以选择的对象列表。*/ +$lang->searchObjects['all'] = '全部'; $lang->searchObjects['bug'] = 'Bug'; $lang->searchObjects['story'] = "{$lang->SRCommon}"; $lang->searchObjects['task'] = '任务'; @@ -241,6 +245,7 @@ $lang->searchObjects['testreport'] = '测试报告'; $lang->searchObjects['program'] = '项目集'; $lang->searchObjects['project'] = '项目'; $lang->searchObjects['execution'] = $lang->sprintCommon; +$lang->searchObjects['user'] = '用户'; $lang->searchTips = '编号(ctrl+g)'; /* 导入支持的编码格式。*/ @@ -343,18 +348,18 @@ $lang->story->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->task = array('link' => '任务|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); -$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s'); -$lang->project->menu->burn = array('link' => '燃尽图|project|burn|projectID=%s'); -$lang->project->menu->view = array('link' => '视图|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); -$lang->project->menu->story = array('link' => "{$lang->SRCommon}|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); -$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => '测试单|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); -$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->more = array('link' => '更多|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->task = array('link' => '任务|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); +$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s'); +$lang->project->menu->burn = array('link' => '燃尽图|project|burn|projectID=%s'); +$lang->project->menu->view = array('link' => '视图|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->story = array('link' => "{$lang->SRCommon}|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = array('link' => 'Bug|project|bug|projectID=%s'); +$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => '测试单|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask'); +$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->more = array('link' => '更多|project|whitelist|projectID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover'); $lang->project->subMenu = new stdclass(); $lang->project->subMenu->view = new stdclass(); @@ -565,6 +570,9 @@ $lang->admin->subMenu->system = new stdclass(); $lang->admin->subMenu->system->cron = array('link' => '定时|cron|index', 'subModule' => 'cron'); $lang->admin->subMenu->system->timezone = array('link' => '时区|custom|timezone', 'subModule' => 'custom'); +$lang->admin->subMenu->system->buildIndex = array('link' => '重建索引|search|buildindex|'); +$lang->admin->subMenuOrder->system[15] = 'buildIndex'; + $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); $lang->action = new stdclass(); diff --git a/module/common/model.php b/module/common/model.php index f94998383e..ede6ac6fd4 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -748,45 +748,21 @@ class commonModel extends model */ public static function printSearchBox() { - global $app, $config, $lang; - $moduleName = $app->getModuleName(); - $methodName = $app->getMethodName(); - $searchObject = $moduleName; - - if($moduleName == 'product') - { - if($methodName == 'browse') $searchObject = 'story'; - } - elseif($moduleName == 'project') - { - if(strpos('task|story|bug|build', $methodName) !== false) $searchObject = $methodName; - } - elseif($moduleName == 'my' or $moduleName == 'user') - { - $searchObject = $methodName; - if($methodName == 'execution') $searchObject = 'project'; - } - if(empty($lang->searchObjects[$searchObject])) $searchObject = 'bug'; - - echo "