diff --git a/framework/model.class.php b/framework/model.class.php index 0bcbd659ce..5d293a32c3 100644 --- a/framework/model.class.php +++ b/framework/model.class.php @@ -282,6 +282,42 @@ class model extends baseModel return $menu; } + /** + * 缓存用于构造搜索参数的方法和参数。 + * Cache the method and arguments used to build search parameters. + * + * @param string $module + * @param string $classMethod 构造搜索参数的类名和方法名,以::分隔。The class name and method name which builds the search params, separated by ::. + * @param array $methodArgs 调用构造搜索参数的方法时传入的参数列表(实参)。 The arguments passed to the method which builds the search params (actual parameters). + * @access public + * @return void + */ + public function cacheSearchFunc(string $module, string $classMethod, array $methodArgs) + { + list($className, $methodName) = explode('::', $classMethod); + + $funcModel = str_replace(['ext', 'Model'], '', $className); + + $key = 0; + $funcArgs = []; + $method = new ReflectionMethod($className, $methodName); + $params = $method->getParameters(); // 构造搜索参数的方法的参数列表(形参)。The parameters of the method which builds the search params (formal parameters). + foreach($params as $param) + { + if(isset($methodArgs[$key])) + { + $funcArgs[$param->getName()] = $methodArgs[$key]; + } + elseif($param->isDefaultValueAvailable()) + { + $funcArgs[$param->getName()] = $param->getDefaultValue(); + } + $key++; + } + + $this->session->set($module . 'SearchFunc', ['funcModel' => $funcModel, 'funcName' => $methodName, 'funcArgs' => $funcArgs]); + } + /** * Process status of an object according to its subStatus. * diff --git a/module/execution/control.php b/module/execution/control.php index 7912807501..34d806dbc3 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -197,9 +197,7 @@ class execution extends control /* Build the search form. */ $modules = $this->loadModel('tree')->getTaskOptionMenu($executionID, 0, $showModule); $actionURL = $this->createLink('execution', 'task', "executionID=$executionID&status=bySearch¶m=myQueryID&orderBy=$orderBy&recTotal=0&recPerPage=100&pageID=1&from=$from&blockID=$blockID"); - $this->config->execution->search['onMenuBar'] = 'yes'; - if(!$execution->multiple) unset($this->config->execution->search['fields']['execution']); - $this->execution->buildTaskSearchForm($executionID, $this->executions, $queryID, $actionURL); + $this->execution->buildTaskSearchForm($executionID, $productID, $this->executions, $queryID, $actionURL); $this->view->title = $execution->name . $this->lang->hyphen . $this->lang->execution->task; $this->view->tasks = $tasks; diff --git a/module/execution/model.php b/module/execution/model.php index 472adc91ef..745de2984a 100755 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -4169,15 +4169,28 @@ class executionModel extends model * Build task search form. * * @param int $executionID + * @param int $productID * @param array $executions * @param int $queryID * @param string $actionURL + * @param bool $cacheSearchFunc 是否缓存构造搜索参数的方法。默认缓存可以提高性能,构造搜索表单时再加载真实值。 * @access public * @return void */ - public function buildTaskSearchForm(int $executionID, array $executions, int $queryID, string $actionURL) + public function buildTaskSearchForm(int $executionID, int $productID, array $executions, int $queryID, string $actionURL, string $module = 'task', bool $cacheSearchFunc = true) { - $showAll = empty($executionID) && empty($executions) ? true : false; + $searchConfig = $this->config->execution->search; + if($cacheSearchFunc) + { + $this->cacheSearchFunc($module, __METHOD__, func_get_args()); + return $searchConfig; + } + + $searchConfig['module'] = $module; + $searchConfig['actionURL'] = $actionURL; + $searchConfig['queryID'] = $queryID; + + $showAll = empty($executionID) && empty($executions); if($showAll) { $executions = $this->getPairs(0, 'all', "nocode,noprefix,multiple"); @@ -4185,27 +4198,49 @@ class executionModel extends model } $execution = $this->getByID($executionID); - $this->config->execution->search['actionURL'] = $actionURL; - $this->config->execution->search['queryID'] = $queryID; - $this->config->execution->search['params']['story']['values'] = $this->loadModel('story')->getExecutionStoryPairs($executionID, 0, 'all', '', 'full', 'unclosed', 'story', false); + $searchConfig['params']['story']['values'] = $this->loadModel('story')->getExecutionStoryPairs($executionID, 0, 'all', '', 'full', 'unclosed', 'story', false); + + if($module == 'task') + { + $searchConfig['onMenuBar'] = 'yes'; + if(!$execution->multiple) unset($searchConfig['fields']['execution']); + } + elseif($module == 'programplanTask') + { + unset($searchConfig['fields']['project']); + $executions = $this->loadModel('programplan')->getPairs($executionID, $productID, 'all'); + } + elseif($module == 'projectTask') + { + unset($searchConfig['fields']['project']); + unset($searchConfig['fields']['module']); + } if(isset($execution->type) && $execution->type == 'project') { - unset($this->config->execution->search['fields']['project']); - $this->config->execution->search['params']['execution']['values'] = array('' => '') + $executions; + unset($searchConfig['fields']['project']); + if(isset($searchConfig['fields']['execution'])) $searchConfig['params']['execution']['values'] = array('' => '') + $executions; } else { - $this->config->execution->search['params']['execution']['values'] = $showAll ? $executions : array(''=>'', $executionID => zget($executions, $executionID, ''), 'all' => $this->lang->execution->allExecutions); + if(isset($searchConfig['fields']['execution'])) $searchConfig['params']['execution']['values'] = $showAll ? $executions : array(''=>'', $executionID => zget($executions, $executionID, ''), 'all' => $this->lang->execution->allExecutions); } - $projects = $this->loadModel('project')->getPairsByProgram(); - $this->config->execution->search['params']['project']['values'] = $projects + array('all' => $this->lang->project->allProjects); + if(isset($searchConfig['fields']['project'])) + { + $projects = $this->loadModel('project')->getPairsByProgram(); + $searchConfig['params']['project']['values'] = $projects + array('all' => $this->lang->project->allProjects); + } - $showAllModule = isset($this->config->execution->task->allModule) ? $this->config->execution->task->allModule : ''; - $this->config->execution->search['params']['module']['values'] = $this->loadModel('tree')->getTaskOptionMenu($executionID, 0, $showAllModule ? 'allModule' : ''); + if(isset($searchConfig['fields']['module'])) + { + $showAllModule = $this->config->execution->task->allModule ?? ''; + $searchConfig['params']['module']['values'] = $this->loadModel('tree')->getTaskOptionMenu($executionID, 0, $showAllModule ? 'allModule' : ''); + } - $this->loadModel('search')->setSearchParams($this->config->execution->search); + $this->loadModel('search')->setSearchParams($searchConfig); + + return $searchConfig; } /** diff --git a/module/execution/test/lib/execution.unittest.class.php b/module/execution/test/lib/execution.unittest.class.php index fb44b4ae75..9325d6e881 100644 --- a/module/execution/test/lib/execution.unittest.class.php +++ b/module/execution/test/lib/execution.unittest.class.php @@ -2481,15 +2481,18 @@ class executionTest * Test build task search form. * * @param int $executionID + * @param int $productID + * @param array $executions * @param int $queryID + * @param string $actionURL + * @param string $module + * @param bool $cacheSearchFunc * @access public - * @return int + * @return array */ - public function buildTaskSearchFormTest($executionID, $queryID) + public function buildTaskSearchFormTest($executionID, $productID, $executions, $queryID, $actionURL, $module, $cacheSearchFunc): array { - $this->executionModel->buildTaskSearchForm($executionID, array($executionID => 'yes'), $queryID, 'searchTask'); - - return $_SESSION['tasksearchParams']['queryID']; + return $this->executionModel->buildTaskSearchForm($executionID, $productID, $executions, $queryID, $actionURL, $module, $cacheSearchFunc); } /** diff --git a/module/execution/test/model/buildtasksearchform.php b/module/execution/test/model/buildtasksearchform.php index 88db73d26d..ddf701e594 100755 --- a/module/execution/test/model/buildtasksearchform.php +++ b/module/execution/test/model/buildtasksearchform.php @@ -4,17 +4,18 @@ include dirname(__FILE__, 5) . '/test/lib/init.php'; include dirname(__FILE__, 2) . '/lib/execution.unittest.class.php'; $execution = zenData('project'); -$execution->id->range('1-5'); -$execution->name->range('项目1,项目2,迭代1,迭代2,迭代3'); -$execution->type->range('project{2},sprint,stage,kanban'); +$execution->id->range('1-8'); +$execution->name->range('项目1,项目2,迭代1,迭代2,迭代3,阶段1,阶段2,阶段3'); +$execution->type->range('project{2},sprint,stage,kanban,stage{3}'); +$execution->model->range('scrum,waterfall,``{6}'); $execution->status->range('doing'); -$execution->parent->range('0,0,1,1,2'); -$execution->project->range('0,0,1,1,2'); -$execution->grade->range('2{2},1{3}'); -$execution->path->range('1,2,`1,3`,`1,4`,`2,5`')->prefix(',')->postfix(','); +$execution->parent->range('0,0,1{3},2{3}'); +$execution->project->range('0,0,1{3},2{3}'); +$execution->grade->range('2{2},1{6}'); +$execution->path->range('1,2,`1,3`,`1,4`,`1,5`,`2,6`,`2,7`,`2,8`')->prefix(',')->postfix(','); $execution->begin->range('20230102 000000:0')->type('timestamp')->format('YY/MM/DD'); $execution->end->range('20230212 000000:0')->type('timestamp')->format('YY/MM/DD'); -$execution->gen(5); +$execution->gen(8); $task = zenData('task'); $task->id->range('1-10'); @@ -36,6 +37,10 @@ $query->form->range('`a:59:{s:9:"fieldname";s:0:"";s:11:"fieldstatus";s:0:"";s:9 $query->sql->range("`(( 1 AND `name` LIKE '%任务%' ) AND ( 1 )) AND deleted = '0'`"); $query->gen(1); +$module = zenData('module'); +$module->name->range('1,2,3,4,5')->prefix('模块'); +$module->gen(5); + su('admin'); /** @@ -44,20 +49,144 @@ title=测试executionModel->buildTaskSearchForm(); timeout=0 cid=1 -- 正确的执行,正确的queryID @1 -- 错误的执行,正确的queryID @1 -- 正确的执行,错误的queryID @0 -- 错误的执行,错误的queryID @0 -- 正确的执行,正确的queryID @2 +- module 为 projectTask,缓存查询参数,查询参数中 queryID 为空。 @0 +- module 为 projectTask,缓存查询参数,查询参数中 actionURL 为空。 @0 +- module 为 projectTask,缓存查询参数,查询参数中有 project 字段。 @1 +- module 为 projectTask,缓存查询参数,查询参数中有 module 字段。 @1 +- module 为 projectTask,缓存查询参数,打印 module 的值。属性module @task +- module 为 projectTask,缓存查询参数,打印所属执行列表。 + - 属性3 @0 + - 属性4 @0 + - 属性5 @0 +- module 为 projectTask,不缓存查询参数,查询参数中 queryID 有值。 @1 +- module 为 projectTask,不缓存查询参数,查询参数中 actionURL 有值。 @1 +- module 为 projectTask,不缓存查询参数,查询参数中没有 project 字段。 @0 +- module 为 projectTask,不缓存查询参数,查询参数中没有 module 字段。 @0 +- module 为 projectTask,不缓存查询参数,打印 module 的值。属性module @projectTask +- module 为 projectTask,不缓存查询参数,打印 queryID 的值。属性queryID @1 +- module 为 projectTask,不缓存查询参数,打印 actionURL 的值。属性actionURL @/project-execution-bySearch-1-order_desc-0-0-100-1-myQueryID.html +- module 为 projectTask,不缓存查询参数,打印所属执行列表。 + - 属性3 @迭代1 + - 属性4 @迭代2 + - 属性5 @迭代3 +- module 为 programplanTask,缓存查询参数,查询参数中 queryID 为空。 @0 +- module 为 programplanTask,缓存查询参数,查询参数中 actionURL 为空。 @0 +- module 为 programplanTask,缓存查询参数,查询参数中有 project 字段。 @1 +- module 为 programplanTask,缓存查询参数,打印 module 的值。属性module @task +- module 为 programplanTask,缓存查询参数,打印所属执行列表。 + - 属性6 @0 + - 属性7 @0 + - 属性8 @0 +- module 为 programplanTask,不缓存查询参数,查询参数中 queryID 有值。 @1 +- module 为 programplanTask,不缓存查询参数,查询参数中 actionURL 有值。 @1 +- module 为 programplanTask,不缓存查询参数,查询参数中没有 project 字段。 @0 +- module 为 programplanTask,不缓存查询参数,打印 module 的值。属性module @programplanTask +- module 为 programplanTask,不缓存查询参数,打印 queryID 的值。属性queryID @1 +- module 为 programplanTask,不缓存查询参数,打印 actionURL 的值。属性actionURL @/programplan-browse-2-0-gantt-id_asc-0-bysearch-myQueryID.html +- module 为 programplanTask,不缓存查询参数,打印所属执行列表。 + - 属性6 @/阶段1 + - 属性7 @/阶段2 + - 属性8 @/阶段3 +- module 为 task,缓存查询参数,查询参数中 queryID 为空。 @0 +- module 为 task,缓存查询参数,查询参数中 actionURL 为空。 @0 +- module 为 task,缓存查询参数,查询参数中 onMenuBar 为空。 @0 +- module 为 task,缓存查询参数,打印所属项目列表。 + - 属性1 @0 + - 属性2 @0 + - 属性all @0 +- module 为 task,缓存查询参数,打印所属执行列表。 + - @0 + - 属性3 @0 + - 属性all @0 +- module 为 task,不缓存查询参数,查询参数中 queryID 有值。 @1 +- module 为 task,不缓存查询参数,查询参数中 actionURL 有值。 @1 +- module 为 task,不缓存查询参数,查询参数中 onMenuBar 有值。 @1 +- module 为 task,不缓存查询参数,打印 module 的值。属性module @task +- module 为 task,不缓存查询参数,打印 queryID 的值。属性queryID @1 +- module 为 task,不缓存查询参数,打印 actionURL 的值。属性actionURL @/execution-task-3-bySearch-myQueryID.html +- module 为 task,不缓存查询参数,打印所属项目列表。 + - 属性1 @项目1 + - 属性2 @项目2 + - 属性all @所有项目 +- module 为 task,不缓存查询参数,打印所属执行列表。 + - @~~ + - 属性3 @迭代1 + - 属性all @所有执行 */ -$executionIDList = array('3', '0'); -$queryIDList = array('0', '1', '2'); - $execution = new executionTest(); -r($execution->buildTaskSearchFormTest($executionIDList[0], $queryIDList[1])) && p() && e('1'); // 正确的执行,正确的queryID -r($execution->buildTaskSearchFormTest($executionIDList[1], $queryIDList[1])) && p() && e('1'); // 错误的执行,正确的queryID -r($execution->buildTaskSearchFormTest($executionIDList[0], $queryIDList[0])) && p() && e('0'); // 正确的执行,错误的queryID -r($execution->buildTaskSearchFormTest($executionIDList[1], $queryIDList[0])) && p() && e('0'); // 错误的执行,错误的queryID -r($execution->buildTaskSearchFormTest($executionIDList[1], $queryIDList[2])) && p() && e('2'); // 正确的执行,正确的queryID +$productID = 0; +$queryID = 1; + +/** + * 测试为项目迭代列表页面构造搜索参数功能。 + */ +$executionID = 1; +$executions = [3 => '迭代1', 4 => '迭代2', 5 => '迭代3']; +$actionURL = '/project-execution-bySearch-1-order_desc-0-0-100-1-myQueryID.html'; +$module = 'projectTask'; +$searchConfig = $execution->buildTaskSearchFormTest($executionID, $productID, $executions, $queryID, $actionURL, $module, true); +r(isset($searchConfig['queryID'])) && p() && e(0); // module 为 projectTask,缓存查询参数,查询参数中 queryID 为空。 +r(isset($searchConfig['actionURL'])) && p() && e(0); // module 为 projectTask,缓存查询参数,查询参数中 actionURL 为空。 +r(isset($searchConfig['fields']['project'])) && p() && e(1); // module 为 projectTask,缓存查询参数,查询参数中有 project 字段。 +r(isset($searchConfig['fields']['module'])) && p() && e(1); // module 为 projectTask,缓存查询参数,查询参数中有 module 字段。 +r($searchConfig) && p('module') && e('task'); // module 为 projectTask,缓存查询参数,打印 module 的值。 +r($searchConfig['params']['execution']['values']) && p('3,4,5') && e('0,0,0'); // module 为 projectTask,缓存查询参数,打印所属执行列表。 + +$searchConfig = $execution->buildTaskSearchFormTest($executionID, $productID, $executions, $queryID, $actionURL, $module, false); +r(isset($searchConfig['queryID'])) && p() && e(1); // module 为 projectTask,不缓存查询参数,查询参数中 queryID 有值。 +r(isset($searchConfig['actionURL'])) && p() && e(1); // module 为 projectTask,不缓存查询参数,查询参数中 actionURL 有值。 +r(isset($searchConfig['fields']['project'])) && p() && e(0); // module 为 projectTask,不缓存查询参数,查询参数中没有 project 字段。 +r(isset($searchConfig['fields']['module'])) && p() && e(0); // module 为 projectTask,不缓存查询参数,查询参数中没有 module 字段。 +r($searchConfig) && p('module') && e('projectTask'); // module 为 projectTask,不缓存查询参数,打印 module 的值。 +r($searchConfig) && p('queryID') && e('1'); // module 为 projectTask,不缓存查询参数,打印 queryID 的值。 +r($searchConfig) && p('actionURL') && e('/project-execution-bySearch-1-order_desc-0-0-100-1-myQueryID.html'); // module 为 projectTask,不缓存查询参数,打印 actionURL 的值。 +r($searchConfig['params']['execution']['values']) && p('3,4,5') && e('迭代1,迭代2,迭代3'); // module 为 projectTask,不缓存查询参数,打印所属执行列表。 + +/** + * 测试为瀑布项目阶段甘特图页面构造搜索参数功能。 + */ +$executionID = 2; +$executions = [3 => '迭代1', 4 => '迭代2', 5 => '迭代3']; +$actionURL = '/programplan-browse-2-0-gantt-id_asc-0-bysearch-myQueryID.html'; +$module = 'programplanTask'; +$searchConfig = $execution->buildTaskSearchFormTest($executionID, $productID, $executions, $queryID, $actionURL, $module, true); +r(isset($searchConfig['queryID'])) && p() && e(0); // module 为 programplanTask,缓存查询参数,查询参数中 queryID 为空。 +r(isset($searchConfig['actionURL'])) && p() && e(0); // module 为 programplanTask,缓存查询参数,查询参数中 actionURL 为空。 +r(isset($searchConfig['fields']['project'])) && p() && e(1); // module 为 programplanTask,缓存查询参数,查询参数中有 project 字段。 +r($searchConfig) && p('module') && e('task'); // module 为 programplanTask,缓存查询参数,打印 module 的值。 +r($searchConfig['params']['execution']['values']) && p('6,7,8') && e('0,0,0'); // module 为 programplanTask,缓存查询参数,打印所属执行列表。 + +$searchConfig = $execution->buildTaskSearchFormTest($executionID, $productID, $executions, $queryID, $actionURL, $module, false); +r(isset($searchConfig['queryID'])) && p() && e(1); // module 为 programplanTask,不缓存查询参数,查询参数中 queryID 有值。 +r(isset($searchConfig['actionURL'])) && p() && e(1); // module 为 programplanTask,不缓存查询参数,查询参数中 actionURL 有值。 +r(isset($searchConfig['fields']['project'])) && p() && e(0); // module 为 programplanTask,不缓存查询参数,查询参数中没有 project 字段。 +r($searchConfig) && p('module') && e('programplanTask'); // module 为 programplanTask,不缓存查询参数,打印 module 的值。 +r($searchConfig) && p('queryID') && e('1'); // module 为 programplanTask,不缓存查询参数,打印 queryID 的值。 +r($searchConfig) && p('actionURL') && e('/programplan-browse-2-0-gantt-id_asc-0-bysearch-myQueryID.html'); // module 为 programplanTask,不缓存查询参数,打印 actionURL 的值。 +r($searchConfig['params']['execution']['values']) && p('6,7,8') && e('/阶段1,/阶段2,/阶段3'); // module 为 programplanTask,不缓存查询参数,打印所属执行列表。 + +/** + * 测试为执行任务列表页面构造搜索参数功能。 + */ +$executionID = 3; +$executions = [3 => '迭代1', 4 => '迭代2', 5 => '迭代3']; +$actionURL = '/execution-task-3-bySearch-myQueryID.html'; +$module = 'task'; +$searchConfig = $execution->buildTaskSearchFormTest($executionID, $productID, $executions, $queryID, $actionURL, $module, true); +r(isset($searchConfig['queryID'])) && p() && e(0); // module 为 task,缓存查询参数,查询参数中 queryID 为空。 +r(isset($searchConfig['actionURL'])) && p() && e(0); // module 为 task,缓存查询参数,查询参数中 actionURL 为空。 +r(isset($searchConfig['onMenuBar'])) && p() && e(0); // module 为 task,缓存查询参数,查询参数中 onMenuBar 为空。 +r($searchConfig['params']['project']['values']) && p('1,2,all') && e('0,0,0'); // module 为 task,缓存查询参数,打印所属项目列表。 +r($searchConfig['params']['execution']['values']) && p(',3,all') && e('0,0,0'); // module 为 task,缓存查询参数,打印所属执行列表。 + +$searchConfig = $execution->buildTaskSearchFormTest($executionID, $productID, $executions, $queryID, $actionURL, $module, false); +r(isset($searchConfig['queryID'])) && p() && e(1); // module 为 task,不缓存查询参数,查询参数中 queryID 有值。 +r(isset($searchConfig['actionURL'])) && p() && e(1); // module 为 task,不缓存查询参数,查询参数中 actionURL 有值。 +r(isset($searchConfig['onMenuBar'])) && p() && e(1); // module 为 task,不缓存查询参数,查询参数中 onMenuBar 有值。 +r($searchConfig) && p('module') && e('task'); // module 为 task,不缓存查询参数,打印 module 的值。 +r($searchConfig) && p('queryID') && e('1'); // module 为 task,不缓存查询参数,打印 queryID 的值。 +r($searchConfig) && p('actionURL') && e('/execution-task-3-bySearch-myQueryID.html'); // module 为 task,不缓存查询参数,打印 actionURL 的值。 +r($searchConfig['params']['project']['values']) && p('1,2,all') && e('项目1,项目2,所有项目'); // module 为 task,不缓存查询参数,打印所属项目列表。 +r($searchConfig['params']['execution']['values']) && p(',3,all') && e('~~,迭代1,所有执行'); // module 为 task,不缓存查询参数,打印所属执行列表。 \ No newline at end of file diff --git a/module/my/control.php b/module/my/control.php index a3de5067b3..dc565f531d 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -434,7 +434,7 @@ class my extends control $tasks = $this->myZen->buildTaskData($tasks); $actionURL = $this->createLink('my', $this->app->rawMethod, "mode=task&browseType=bySearch&queryID=myQueryID"); - $this->my->buildTaskSearchForm($queryID, $actionURL); + $this->my->buildTaskSearchForm($queryID, $actionURL, $this->app->rawMethod . 'Task'); $this->myZen->showWorkCount($recTotal, $recPerPage, $pageID); diff --git a/module/my/model.php b/module/my/model.php index f6fd70beec..ea4e5b76b9 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -448,38 +448,47 @@ class myModel extends model * * @param int $queryID * @param string $actionURL + * @param string $module + * @param bool $cacheSearchFunc 是否缓存构造搜索参数的方法。默认缓存可以提高性能,构造搜索表单时再加载真实值。 * @access public * @return void */ - public function buildTaskSearchForm(int $queryID, string $actionURL): void + public function buildTaskSearchForm(int $queryID, string $actionURL, string $module, bool $cacheSearchFunc = true) { - $rawMethod = $this->app->rawMethod; $this->loadModel('execution'); - - $this->config->execution->search['module'] = $rawMethod . 'Task'; - $this->config->execution->search['actionURL'] = $actionURL; - $this->config->execution->search['queryID'] = $queryID; - - if($rawMethod == 'work') + $searchConfig = $this->config->execution->search; + if($cacheSearchFunc) { - unset($this->config->execution->search['fields']['closedReason']); - unset($this->config->execution->search['fields']['closedBy']); - unset($this->config->execution->search['fields']['canceledBy']); - unset($this->config->execution->search['fields']['closedDate']); - unset($this->config->execution->search['fields']['canceledDate']); - unset($this->config->execution->search['params']['status']['values']['cancel']); - unset($this->config->execution->search['params']['status']['values']['closed']); + $this->cacheSearchFunc($module, __METHOD__, func_get_args()); + return $searchConfig; + } + + $searchConfig['module'] = $module; + $searchConfig['actionURL'] = $actionURL; + $searchConfig['queryID'] = $queryID; + + if($module == 'workTask') + { + unset($searchConfig['fields']['closedReason']); + unset($searchConfig['fields']['closedBy']); + unset($searchConfig['fields']['canceledBy']); + unset($searchConfig['fields']['closedDate']); + unset($searchConfig['fields']['canceledDate']); + unset($searchConfig['params']['status']['values']['cancel']); + unset($searchConfig['params']['status']['values']['closed']); } $projects = $this->loadModel('project')->getPairsByProgram(); - $this->config->execution->search['params']['project']['values'] = $projects + array('all' => $this->lang->project->allProjects); + $searchConfig['params']['project']['values'] = $projects + array('all' => $this->lang->project->allProjects); $executions = $this->execution->getPairs(0, 'all', 'multiple'); - $this->config->execution->search['params']['execution']['values'] = $executions + array('all' => $this->lang->execution->allExecutions); + $searchConfig['params']['execution']['values'] = $executions + array('all' => $this->lang->execution->allExecutions); - $this->config->execution->search['params']['module']['values'] = $this->loadModel('tree')->getAllModulePairs(); + $searchConfig['params']['module']['values'] = $this->loadModel('tree')->getAllModulePairs(); - $this->loadModel('search')->setSearchParams($this->config->execution->search); + $this->loadModel('search')->setSearchParams($searchConfig); + + return $searchConfig; } /** diff --git a/module/my/test/lib/my.unittest.class.php b/module/my/test/lib/my.unittest.class.php index 1b90a66a47..bf2a307729 100644 --- a/module/my/test/lib/my.unittest.class.php +++ b/module/my/test/lib/my.unittest.class.php @@ -269,16 +269,14 @@ class myTest * * @param int $queryID * @param string $actionURL + * @param string $module + * @param bool $cacheSearchFunc * @access public * @return array */ - public function buildTaskSearchFormTest(int $queryID, string $actionURL): array + public function buildTaskSearchFormTest(int $queryID, string $actionURL, string $module, bool $cacheSearchFunc): array { - $this->objectModel->buildTaskSearchForm($queryID, $actionURL); - - if(dao::isError()) return dao::getError(); - global $tester; - return $tester->config->execution->search; + return $this->objectModel->buildTaskSearchForm($queryID, $actionURL, $module, $cacheSearchFunc); } /** diff --git a/module/my/test/model/buildtasksearchform.php b/module/my/test/model/buildtasksearchform.php index 9c4105c0e1..c2680f0085 100755 --- a/module/my/test/model/buildtasksearchform.php +++ b/module/my/test/model/buildtasksearchform.php @@ -4,7 +4,18 @@ declare(strict_types=1); include dirname(__FILE__, 5) . '/test/lib/init.php'; include dirname(__FILE__, 2) . '/lib/my.unittest.class.php'; -zenData('user')->gen('1'); +zenData('user')->gen(1); + +$execution = zenData('project'); +$execution->id->range('1-5'); +$execution->name->range('项目1,项目2,迭代1,迭代2,迭代3'); +$execution->type->range('project{2},sprint,stage,kanban'); +$execution->path->range('1,2,`1,3`,`1,4`,`2,5`')->prefix(',')->postfix(','); +$execution->gen(5); + +$module = zenData('module'); +$module->name->range('1,2,3,4,5')->prefix('模块'); +$module->gen(5); su('admin'); @@ -14,22 +25,163 @@ title=测试 myModel->buildTaskSearchForm(); timeout=0 cid=1 -- 测试获取queryID 1 actionURL actionURL1 的搜索表单 - - 属性module @Task - - 属性queryID @0 - - 属性actionURL @actionURL1 -- 测试获取queryID 0 actionURL actionURL2 的搜索表单 - - 属性module @Task - - 属性queryID @1 - - 属性actionURL @actionURL2 +- module 为 workTask,缓存查询参数,查询参数中 queryID 为空。 @0 +- module 为 workTask,缓存查询参数,查询参数中 actionURL 为空。 @0 +- module 为 workTask,缓存查询参数,查询字段中 closedReason 不为空。 @1 +- module 为 workTask,缓存查询参数,查询字段中 closedBy 不为空。 @1 +- module 为 workTask,缓存查询参数,查询字段中 closedDate 不为空。 @1 +- module 为 workTask,缓存查询参数,查询字段中 canceledBy 不为空。 @1 +- module 为 workTask,缓存查询参数,查询字段中 canceledDate 不为空。 @1 +- module 为 workTask,缓存查询参数,打印 module 的值。属性module @task +- module 为 workTask,缓存查询参数,打印所属项目列表。 + - 属性1 @0 + - 属性2 @0 + - 属性all @0 +- module 为 workTask,缓存查询参数,打印所属执行列表。 + - 属性3 @0 + - 属性4 @0 + - 属性5 @0 + - 属性all @0 +- module 为 workTask,缓存查询参数,打印所属模块列表。 + - @0 + - 属性2 @0 + - 属性5 @0 +- module 为 workTask,不缓存查询参数,查询参数中 queryID 不为空。 @1 +- module 为 workTask,不缓存查询参数,查询参数中 actionURL 不为空。 @1 +- module 为 workTask,不缓存查询参数,查询字段中 closedReason 为空。 @0 +- module 为 workTask,不缓存查询参数,查询字段中 closedBy 为空。 @0 +- module 为 workTask,不缓存查询参数,查询字段中 closedDate 为空。 @0 +- module 为 workTask,不缓存查询参数,查询字段中 canceledBy 为空。 @0 +- module 为 workTask,不缓存查询参数,查询字段中 canceledDate 为空。 @0 +- module 为 workTask,不缓存查询参数,打印 module 的值。属性module @workTask +- module 为 workTask,不缓存查询参数,打印 queryID 的值。属性queryID @1 +- module 为 workTask,不缓存查询参数,打印 actionURL 的值。属性actionURL @/my-work-task.html +- module 为 workTask,不缓存查询参数,打印所属项目列表。 + - 属性1 @项目1 + - 属性2 @项目2 + - 属性all @所有项目 +- module 为 workTask,不缓存查询参数,打印所属执行列表。 + - 属性3 @/迭代1 + - 属性4 @/迭代2 + - 属性5 @/迭代3 + - 属性all @所有执行 +- module 为 workTask,不缓存查询参数,打印所属模块列表。 + - @/ + - 属性2 @/模块2 + - 属性5 @/模块5 +- module 为 contributeTask,缓存查询参数,查询参数中 queryID 为空。 @0 +- module 为 contributeTask,缓存查询参数,查询参数中 actionURL 为空。 @0 +- module 为 contributeTask,缓存查询参数,查询字段中 closedReason 不为空。 @1 +- module 为 contributeTask,缓存查询参数,查询字段中 closedBy 不为空。 @1 +- module 为 contributeTask,缓存查询参数,查询字段中 closedDate 不为空。 @1 +- module 为 contributeTask,缓存查询参数,查询字段中 canceledBy 不为空。 @1 +- module 为 contributeTask,缓存查询参数,查询字段中 canceledDate 不为空。 @1 +- module 为 contributeTask,缓存查询参数,打印 module 的值。属性module @task +- module 为 contributeTask,缓存查询参数,打印所属项目列表。 + - 属性1 @0 + - 属性2 @0 + - 属性all @0 +- module 为 contributeTask,缓存查询参数,打印所属执行列表。 + - 属性3 @0 + - 属性4 @0 + - 属性5 @0 + - 属性all @0 +- module 为 contributeTask,缓存查询参数,打印所属模块列表。 + - @0 + - 属性2 @0 + - 属性5 @0 +- 不缓存查询参数,module 为 contributeTask,查询参数中 module 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,查询参数中 queryID 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,查询参数中 actionURL 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,查询字段中 closedReason 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,查询字段中 closedBy 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,查询字段中 closedDate 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,查询字段中 canceledBy 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,查询字段中 canceledDate 不为空。 @1 +- 不缓存查询参数,module 为 contributeTask,打印 module 的值。属性module @contributeTask +- 不缓存查询参数,module 为 contributeTask,打印 queryID 的值。属性queryID @1 +- 不缓存查询参数,module 为 contributeTask,打印 actionURL 的值。属性actionURL @/my-contribute-task.html +- 不缓存查询参数,module 为 contributeTask,打印所属项目列表。 + - 属性1 @项目1 + - 属性2 @项目2 + - 属性all @所有项目 +- 不缓存查询参数,module 为 contributeTask,打印所属执行列表。 + - 属性3 @/迭代1 + - 属性4 @/迭代2 + - 属性5 @/迭代3 + - 属性all @所有执行 +- 不缓存查询参数,module 为 contributeTask,打印所属模块列表。 + - @/ + - 属性2 @/模块2 + - 属性5 @/模块5 */ $my = new myTest(); -$queryID = array(0, 1); -$actionURL = array('actionURL1', 'actionURL2'); -$config1 = $my->buildTaskSearchFormTest($queryID[0], $actionURL[0]); -$config2 = $my->buildTaskSearchFormTest($queryID[1], $actionURL[1]); -r($config1) && p('module,queryID,actionURL') && e('Task,0,actionURL1'); // 测试获取queryID 1 actionURL actionURL1 的搜索表单 -r($config2) && p('module,queryID,actionURL') && e('Task,1,actionURL2'); // 测试获取queryID 0 actionURL actionURL2 的搜索表单 \ No newline at end of file +$queryID = 1; +$module = 'workTask'; +$actionURL = "/my-work-task.html"; +$searchConfig = $my->buildTaskSearchFormTest($queryID, $actionURL, $module, true); +r(isset($searchConfig['queryID'])) && p() && e(0); // module 为 workTask,缓存查询参数,查询参数中 queryID 为空。 +r(isset($searchConfig['actionURL'])) && p() && e(0); // module 为 workTask,缓存查询参数,查询参数中 actionURL 为空。 +r(isset($searchConfig['fields']['closedReason'])) && p() && e(1); // module 为 workTask,缓存查询参数,查询字段中 closedReason 不为空。 +r(isset($searchConfig['fields']['closedBy'])) && p() && e(1); // module 为 workTask,缓存查询参数,查询字段中 closedBy 不为空。 +r(isset($searchConfig['fields']['closedDate'])) && p() && e(1); // module 为 workTask,缓存查询参数,查询字段中 closedDate 不为空。 +r(isset($searchConfig['fields']['canceledBy'])) && p() && e(1); // module 为 workTask,缓存查询参数,查询字段中 canceledBy 不为空。 +r(isset($searchConfig['fields']['canceledDate'])) && p() && e(1); // module 为 workTask,缓存查询参数,查询字段中 canceledDate 不为空。 + +r($searchConfig) && p('module') && e('task'); // module 为 workTask,缓存查询参数,打印 module 的值。 +r($searchConfig['params']['project']['values']) && p('1,2,all') && e('0,0,0'); // module 为 workTask,缓存查询参数,打印所属项目列表。 +r($searchConfig['params']['execution']['values']) && p('3,4,5,all') && e('0,0,0,0'); // module 为 workTask,缓存查询参数,打印所属执行列表。 +r($searchConfig['params']['module']['values']) && p('0,2,5') && e('0,0,0'); // module 为 workTask,缓存查询参数,打印所属模块列表。 + +$searchConfig = $my->buildTaskSearchFormTest($queryID, $actionURL, $module, false); +r(isset($searchConfig['queryID'])) && p() && e(1); // module 为 workTask,不缓存查询参数,查询参数中 queryID 不为空。 +r(isset($searchConfig['actionURL'])) && p() && e(1); // module 为 workTask,不缓存查询参数,查询参数中 actionURL 不为空。 +r(isset($searchConfig['fields']['closedReason'])) && p() && e(0); // module 为 workTask,不缓存查询参数,查询字段中 closedReason 为空。 +r(isset($searchConfig['fields']['closedBy'])) && p() && e(0); // module 为 workTask,不缓存查询参数,查询字段中 closedBy 为空。 +r(isset($searchConfig['fields']['closedDate'])) && p() && e(0); // module 为 workTask,不缓存查询参数,查询字段中 closedDate 为空。 +r(isset($searchConfig['fields']['canceledBy'])) && p() && e(0); // module 为 workTask,不缓存查询参数,查询字段中 canceledBy 为空。 +r(isset($searchConfig['fields']['canceledDate'])) && p() && e(0); // module 为 workTask,不缓存查询参数,查询字段中 canceledDate 为空。 + +r($searchConfig) && p('module') && e('workTask'); // module 为 workTask,不缓存查询参数,打印 module 的值。 +r($searchConfig) && p('queryID') && e('1'); // module 为 workTask,不缓存查询参数,打印 queryID 的值。 +r($searchConfig) && p('actionURL') && e('/my-work-task.html'); // module 为 workTask,不缓存查询参数,打印 actionURL 的值。 +r($searchConfig['params']['project']['values']) && p('1,2,all') && e('项目1,项目2,所有项目'); // module 为 workTask,不缓存查询参数,打印所属项目列表。 +r($searchConfig['params']['execution']['values']) && p('3,4,5,all') && e('/迭代1,/迭代2,/迭代3,所有执行'); // module 为 workTask,不缓存查询参数,打印所属执行列表。 +r($searchConfig['params']['module']['values']) && p('0,2,5') && e('/,/模块2,/模块5'); // module 为 workTask,不缓存查询参数,打印所属模块列表。 + +$queryID = 1; +$module = 'contributeTask'; +$actionURL = "/my-contribute-task.html"; +$searchConfig = $my->buildTaskSearchFormTest($queryID, $actionURL, $module, true); +r(isset($searchConfig['queryID'])) && p() && e(0); // module 为 contributeTask,缓存查询参数,查询参数中 queryID 为空。 +r(isset($searchConfig['actionURL'])) && p() && e(0); // module 为 contributeTask,缓存查询参数,查询参数中 actionURL 为空。 +r(isset($searchConfig['fields']['closedReason'])) && p() && e(1); // module 为 contributeTask,缓存查询参数,查询字段中 closedReason 不为空。 +r(isset($searchConfig['fields']['closedBy'])) && p() && e(1); // module 为 contributeTask,缓存查询参数,查询字段中 closedBy 不为空。 +r(isset($searchConfig['fields']['closedDate'])) && p() && e(1); // module 为 contributeTask,缓存查询参数,查询字段中 closedDate 不为空。 +r(isset($searchConfig['fields']['canceledBy'])) && p() && e(1); // module 为 contributeTask,缓存查询参数,查询字段中 canceledBy 不为空。 +r(isset($searchConfig['fields']['canceledDate'])) && p() && e(1); // module 为 contributeTask,缓存查询参数,查询字段中 canceledDate 不为空。 + +r($searchConfig) && p('module') && e('task'); // module 为 contributeTask,缓存查询参数,打印 module 的值。 +r($searchConfig['params']['project']['values']) && p('1,2,all') && e('0,0,0'); // module 为 contributeTask,缓存查询参数,打印所属项目列表。 +r($searchConfig['params']['execution']['values']) && p('3,4,5,all') && e('0,0,0,0'); // module 为 contributeTask,缓存查询参数,打印所属执行列表。 +r($searchConfig['params']['module']['values']) && p('0,2,5') && e('0,0,0'); // module 为 contributeTask,缓存查询参数,打印所属模块列表。 + +$searchConfig = $my->buildTaskSearchFormTest($queryID, $actionURL, $module, false); +r(isset($searchConfig['module'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询参数中 module 不为空。 +r(isset($searchConfig['queryID'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询参数中 queryID 不为空。 +r(isset($searchConfig['actionURL'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询参数中 actionURL 不为空。 +r(isset($searchConfig['fields']['closedReason'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询字段中 closedReason 不为空。 +r(isset($searchConfig['fields']['closedBy'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询字段中 closedBy 不为空。 +r(isset($searchConfig['fields']['closedDate'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询字段中 closedDate 不为空。 +r(isset($searchConfig['fields']['canceledBy'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询字段中 canceledBy 不为空。 +r(isset($searchConfig['fields']['canceledDate'])) && p() && e(1); // 不缓存查询参数,module 为 contributeTask,查询字段中 canceledDate 不为空。 + +r($searchConfig) && p('module') && e('contributeTask'); // 不缓存查询参数,module 为 contributeTask,打印 module 的值。 +r($searchConfig) && p('queryID') && e('1'); // 不缓存查询参数,module 为 contributeTask,打印 queryID 的值。 +r($searchConfig) && p('actionURL') && e('/my-contribute-task.html'); // 不缓存查询参数,module 为 contributeTask,打印 actionURL 的值。 +r($searchConfig['params']['project']['values']) && p('1,2,all') && e('项目1,项目2,所有项目'); // 不缓存查询参数,module 为 contributeTask,打印所属项目列表。 +r($searchConfig['params']['execution']['values']) && p('3,4,5,all') && e('/迭代1,/迭代2,/迭代3,所有执行'); // 不缓存查询参数,module 为 contributeTask,打印所属执行列表。 +r($searchConfig['params']['module']['values']) && p('0,2,5') && e('/,/模块2,/模块5'); // 不缓存查询参数,module 为 contributeTask,打印所属模块列表。 \ No newline at end of file diff --git a/module/programplan/zen.php b/module/programplan/zen.php index 48eb5e42c5..e89c9bd727 100644 --- a/module/programplan/zen.php +++ b/module/programplan/zen.php @@ -442,12 +442,8 @@ class programplanZen extends programplan if($hasSearch) { /* Build the search form. */ - $this->config->execution->search['module'] = 'projectTask'; - $actionURL = $this->createLink('programplan', 'browse', "projectID=$projectID&productID=$productID&type=$type&orderBy=$orderBy&baselineID=$baselineID&browseType=bysearch&queryID=myQueryID"); - unset($this->config->execution->search['fields']['project']); - $executions = $this->programplan->getPairs($projectID, $productID, 'all'); - $this->loadModel('execution')->buildTaskSearchForm($projectID, $executions, $queryID, $actionURL); + $this->loadModel('execution')->buildTaskSearchForm($projectID, $productID, $executions, $queryID, $actionURL, 'programplanTask'); } $this->view->title = $this->lang->programplan->browse; diff --git a/module/project/control.php b/module/project/control.php index 90812f98c2..aef9423d06 100755 --- a/module/project/control.php +++ b/module/project/control.php @@ -870,15 +870,10 @@ class project extends control if($this->cookie->showTask) { /* Build the search form. */ - $this->config->execution->search['module'] = 'projectTask'; - - $actionURL = $this->createLink('project', 'execution', "status=bysearch&projectID=$projectID&orderBy=$orderBy&productID=$productID&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID&queryID=myQueryID"); - unset($this->config->execution->search['fields']['project']); - unset($this->config->execution->search['fields']['module']); + $actionURL = $this->createLink('project', 'execution', "status=bysearch&projectID=$projectID&orderBy=$orderBy&productID=$productID&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID&queryID=myQueryID"); $executions = $this->execution->fetchExecutionList($projectID, 'all', $productID); $executions = $this->execution->getPairsByList(array_keys($executions)); - - $this->execution->buildTaskSearchForm($projectID, $executions, $queryID, $actionURL); + $this->execution->buildTaskSearchForm($projectID, $productID, $executions, $queryID, $actionURL, 'projectTask'); } $this->view->title = $this->lang->execution->allExecutions; diff --git a/module/search/control.php b/module/search/control.php index d52d3d9feb..86000bde2f 100644 --- a/module/search/control.php +++ b/module/search/control.php @@ -34,9 +34,9 @@ class search extends control $module = empty($module) ? $this->session->searchParams['module'] : $module; $searchParams = $module . 'searchParams'; $searchForm = $module . 'Form'; - - $fields = empty($fields) ? json_decode($_SESSION[$searchParams]['searchFields'], true) : $fields; - $params = empty($params) ? json_decode($_SESSION[$searchParams]['fieldParams'], true) : $params; + $searchConfig = $this->search->processSearchParams($module); + $fields = $searchConfig['fields'] ?? $fields; + $params = $searchConfig['params'] ?? $params; $_SESSION['searchParams']['module'] = $module; if(empty($_SESSION[$searchForm])) $this->search->initSession($module, $fields, $params); @@ -55,7 +55,7 @@ class search extends control $this->view->queryID = (empty($module) && empty($queryID)) ? $_SESSION[$searchParams]['queryID'] : $queryID; $this->view->style = !empty($_SESSION[$searchParams]['style']) ? $_SESSION[$searchParams]['style'] : 'full'; $this->view->onMenuBar = !empty($_SESSION[$searchParams]['onMenuBar']) ? $_SESSION[$searchParams]['onMenuBar'] : 'no'; - $this->view->formSession = $_SESSION[$module . 'Form']; + $this->view->formSession = $_SESSION[$searchForm]; $this->view->formName = $formName; if($module == 'program') $this->view->options = $this->searchZen->setOptions($fields, $this->view->fieldParams, $this->view->queries); @@ -82,9 +82,9 @@ class search extends control $module = empty($module) ? $this->session->searchParams['module'] : $module; $searchParams = $module . 'searchParams'; $searchForm = $module . 'Form'; - - $fields = empty($fields) ? json_decode($_SESSION[$searchParams]['searchFields'], true) : $fields; - $params = empty($params) ? json_decode($_SESSION[$searchParams]['fieldParams'], true) : $params; + $searchConfig = $this->search->processSearchParams($module); + $fields = $searchConfig['fields'] ?? $fields; + $params = $searchConfig['fields'] ?? $params; $_SESSION['searchParams']['module'] = $module; if(empty($_SESSION[$searchForm])) $this->search->initOldSession($module, $fields, $params); diff --git a/module/search/model.php b/module/search/model.php index 796032ccb0..4c1faf785b 100644 --- a/module/search/model.php +++ b/module/search/model.php @@ -13,6 +13,26 @@ session->$cacheKey['funcModel'] ?? ''; + $funcName = $this->session->$cacheKey['funcName'] ?? ''; + $funcArgs = $this->session->$cacheKey['funcArgs'] ?? []; + if(!$funcModel || !$funcName || !$funcArgs) return $this->session->{$module . 'searchParams'} ?? []; + + $funcArgs['cacheSearchFunc'] = $cacheSearchFunc; + return $this->loadModel($funcModel)->$funcName(...$funcArgs); + } /** * 设置搜索参数的session。 @@ -22,19 +42,23 @@ class searchModel extends model * @access public * @return void */ - public function setSearchParams(array $searchConfig): void + public function setSearchParams(array $searchConfig) { $module = $searchConfig['module']; if($this->config->edition != 'open') $searchConfig = $this->searchTao->processBuildinFields($module, $searchConfig); - $searchParams['module'] = $searchConfig['module']; - $searchParams['searchFields'] = json_encode($searchConfig['fields']); - $searchParams['fieldParams'] = json_encode($searchConfig['params']); - $searchParams['actionURL'] = $searchConfig['actionURL']; - $searchParams['style'] = zget($searchConfig, 'style', 'full'); - $searchParams['onMenuBar'] = zget($searchConfig, 'onMenuBar', 'no'); - $searchParams['queryID'] = isset($searchConfig['queryID']) ? $searchConfig['queryID'] : 0; + $searchParams['module'] = $module; + $searchParams['actionURL'] = $searchConfig['actionURL']; + $searchParams['style'] = zget($searchConfig, 'style', 'full'); + $searchParams['onMenuBar'] = zget($searchConfig, 'onMenuBar', 'no'); + $searchParams['queryID'] = isset($searchConfig['queryID']) ? $searchConfig['queryID'] : 0; + + if(empty($_SESSION[$module . 'SearchFunc'])) + { + $searchParams['searchFields'] = $searchConfig['fields']; + $searchParams['fieldParams'] = $searchConfig['params']; + } $this->session->set($module . 'searchParams', $searchParams); } @@ -96,9 +120,9 @@ class searchModel extends model { /* Init vars. */ $module = $this->post->module; - $searchParams = $module . 'searchParams'; - $searchFields = json_decode($_SESSION[$searchParams]['searchFields']); - $fieldParams = json_decode($_SESSION[$searchParams]['fieldParams']); + $searchConfig = $this->processSearchParams($module, true); + $searchFields = $searchConfig['fields']; + $fieldParams = $searchConfig['params']; $groupItems = $this->config->search->groupItems; $groupAndOr = strtoupper($this->post->groupAndOr); if($groupAndOr != 'AND' && $groupAndOr != 'OR') $groupAndOr = 'AND'; @@ -122,12 +146,12 @@ class searchModel extends model $field = $this->post->$fieldName; $value = $this->post->$valueName; - $fieldControl = isset($fieldParams->$field) && isset($fieldParams->{$field}->control) ? $fieldParams->{$field}->control : ''; + $fieldControl = $fieldParams[$field]['control'] ?? ''; if(empty($field) || $value === '' || $value === false) continue; // false means no exist this post item. '' means no search data. ignore it. if(!preg_match('/^[a-zA-Z0-9]+$/', $field)) continue; // Fix sql injection. /* 如果是输入框,并且输入框的值为'0',或者 id 的值为'0',将值设置为zero。*/ - if(isset($fieldParams->$field) && $fieldControl == 'input' && $value === '0') $this->post->set($valueName, 'ZERO'); + if($fieldControl == 'input' && $value === '0') $this->post->set($valueName, 'ZERO'); if($field == 'id' && $value === '0') $this->post->set($valueName, 'ZERO'); /* set queryForm. */ @@ -169,8 +193,8 @@ class searchModel extends model $groupItems = $this->config->search->groupItems; $groupAndOr = strtoupper($this->post->groupAndOr); $module = $this->post->module; - $searchParams = $module . 'searchParams'; - $fieldParams = json_decode($_SESSION[$searchParams]['fieldParams']); + $searchConfig = $this->processSearchParams($module, true); + $fieldParams = $searchConfig['params']; $scoreNum = 0; if($groupAndOr != 'AND' and $groupAndOr != 'OR') $groupAndOr = 'AND'; @@ -190,13 +214,15 @@ class searchModel extends model /* Fix bug #2704. */ $field = $this->post->$fieldName; if(!preg_match('/^[a-zA-Z0-9]+$/', $field)) continue; // Fix sql injection. - if(isset($fieldParams->$field) and $fieldParams->$field->control == 'input' and $this->post->$valueName === '0') $this->post->set($valueName, 'ZERO'); + + $fieldControl = $fieldParams[$field]['control'] ?? ''; + if($fieldControl == 'input' and $this->post->$valueName === '0') $this->post->set($valueName, 'ZERO'); if($field == 'id' and $this->post->$valueName === '0') $this->post->set($valueName, 'ZERO'); /* Skip empty values. */ if($this->post->$valueName == false) continue; if($this->post->$valueName == 'ZERO') $this->post->$valueName = 0; // ZERO is special, stands to 0. - if(isset($fieldParams->$field) and $fieldParams->$field->control == 'select' and $this->post->$valueName === 'null') $this->post->set($valueName, ''); // Null is special, stands to empty if control is select. Fix bug #3279. + if($fieldControl == 'select' and $this->post->$valueName === 'null') $this->post->set($valueName, ''); // Null is special, stands to empty if control is select. Fix bug #3279. $scoreNum += 1; @@ -220,7 +246,7 @@ class searchModel extends model } else { - $condition = $fieldParams->$field->control == 'select' ? " LIKE CONCAT('%,', '{$value}', ',%')" : ' LIKE ' . $this->dbh->quote("%$value%"); + $condition = $fieldControl == 'select' ? " LIKE CONCAT('%,', '{$value}', ',%')" : ' LIKE ' . $this->dbh->quote("%$value%"); } } elseif($operator == "notinclude") @@ -232,7 +258,7 @@ class searchModel extends model } else { - $condition = $fieldParams->$field->control == 'select' ? " NOT LIKE CONCAT('%,', '{$value}', ',%')" : ' NOT LIKE ' . $this->dbh->quote("%$value%"); + $condition = $fieldControl == 'select' ? " NOT LIKE CONCAT('%,', '{$value}', ',%')" : ' NOT LIKE ' . $this->dbh->quote("%$value%"); } } elseif($operator == 'belong') diff --git a/module/search/tao.php b/module/search/tao.php index d4150d9db4..26324e9430 100644 --- a/module/search/tao.php +++ b/module/search/tao.php @@ -76,15 +76,14 @@ class searchTao extends searchModel * 初始化搜索表单,并且保存到 session。 * Init the search session for the first time search. * - * @param string $module - * @param object|array $fields - * @param object|array $fieldParams + * @param string $module + * @param array $fields + * @param array $fieldParams * @access public * @return array */ - public function initSession(string $module, object|array $fields, object|array $fieldParams): array + public function initSession(string $module, array $fields, array $fieldParams): array { - if(is_object($fields)) $fields = get_object_vars($fields); $formSessionName = $module . 'Form'; $queryForm = array(); @@ -143,7 +142,7 @@ class searchTao extends searchModel * 处理查询表单的相关数据。 * Process query form datas. * - * @param object $fieldParams + * @param array $fieldParams * @param string $field * @param string $andOrName * @param string $operatorName @@ -151,7 +150,7 @@ class searchTao extends searchModel * @access public * @return array */ - public function processQueryFormDatas(object $fieldParams, string $field, string $andOrName, string $operatorName, string $valueName): array + public function processQueryFormDatas(array $fieldParams, string $field, string $andOrName, string $operatorName, string $valueName): array { /* 设置分组之间的逻辑关系。*/ /* Set and or. */ @@ -167,7 +166,7 @@ class searchTao extends searchModel /* Skip empty values. */ $value = $this->post->$valueName; if($value == 'ZERO') $this->post->set($valueName, 0); // ZERO is special, stands to 0. - if(isset($fieldParams->$field) && $fieldParams->$field->control == 'select' && $value === 'null') $this->post->set($valueName, ''); // Null is special, stands to empty if control is select. + if(isset($fieldParams[$field]) && $fieldParams[$field]['control'] == 'select' && $value === 'null') $this->post->set($valueName, ''); // Null is special, stands to empty if control is select. $value = addcslashes(trim((string)$this->post->{$valueName}), '%'); return array($andOr, $operator, $value);