diff --git a/module/testtask/config/form.php b/module/testtask/config/form.php index cfcc9c9a88..a20d0479c4 100644 --- a/module/testtask/config/form.php +++ b/module/testtask/config/form.php @@ -17,3 +17,19 @@ $config->testtask->form->create['name'] = array('required' => true, 'type $config->testtask->form->create['pri'] = array('required' => false, 'type' => 'int', 'default' => 3); $config->testtask->form->create['desc'] = array('required' => false, 'type' => 'string', 'default' => '', 'control' => 'editor'); $config->testtask->form->create['mailto'] = array('required' => false, 'type' => 'array', 'default' => array(''), 'filter' => 'join'); + +$config->testtask->form->edit = array(); +$config->testtask->form->edit['product'] = array('required' => true, 'type' => 'int', 'default' => ''); +$config->testtask->form->edit['execution'] = array('required' => false, 'type' => 'int', 'default' => 0); +$config->testtask->form->edit['build'] = array('required' => true, 'type' => 'string', 'default' => ''); +$config->testtask->form->edit['type'] = array('required' => false, 'type' => 'array', 'default' => array(), 'filter' => 'join'); +$config->testtask->form->edit['owner'] = array('required' => false, 'type' => 'string', 'default' => ''); +$config->testtask->form->edit['begin'] = array('required' => true, 'type' => 'date', 'default' => ''); +$config->testtask->form->edit['end'] = array('required' => true, 'type' => 'date', 'default' => ''); +$config->testtask->form->edit['status'] = array('required' => true, 'type' => 'string', 'default' => 'wait'); +$config->testtask->form->edit['testreport'] = array('required' => false, 'type' => 'int', 'default' => '0'); +$config->testtask->form->edit['name'] = array('required' => true, 'type' => 'string', 'default' => 0); +$config->testtask->form->edit['pri'] = array('required' => false, 'type' => 'int', 'default' => 3); +$config->testtask->form->edit['desc'] = array('required' => false, 'type' => 'string', 'default' => '', 'control' => 'editor'); +$config->testtask->form->edit['mailto'] = array('required' => false, 'type' => 'array', 'default' => array(), 'filter' => 'join'); +$config->testtask->form->edit['deleteFiles'] = array('required' => false, 'type' => 'array', 'default' => array(), 'filter' => 'join'); diff --git a/module/testtask/control.php b/module/testtask/control.php index 8f2c22eaf8..95b7af72cc 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -709,89 +709,52 @@ class testtask extends control } /** + * 编辑一个测试单。 * Edit a test task. * * @param int $taskID * @access public * @return void */ - public function edit($taskID) + public function edit(int $taskID) { - /* Get task info. */ - $task = $this->testtask->getByID($taskID); - $productID = $this->loadModel('product')->saveState($task->product, $this->products); - if(!empty($_POST)) { - $changes = $this->testtask->update($taskID); + $oldTask = $this->testtask->getByID($taskID); + $task = $this->testtaskZen->buildTaskForEdit($taskID, $oldTask->product); + $this->testtaskZen->checkTaskForEdit($task); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - if($changes or $this->post->comment) + + $changes = $this->testtask->update($task, $oldTask); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + if($changes || $this->post->comment) { $actionID = $this->loadModel('action')->create('testtask', $taskID, 'edited', $this->post->comment); $this->action->logHistory($actionID, $changes); } $message = $this->executeHooks($taskID); - if($message) $this->lang->saveSuccess = $message; - - $link = isonlybody() ? 'parent' : $this->session->testtaskList; - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $link)); + return $this->send(array('result' => 'success', 'message' => $message ? $message : $this->lang->saveSuccess, 'load' => $this->session->testtaskList, 'closeModal' => true)); } - $this->loadModel('project'); + /* Get task info. */ + $task = $this->testtask->getByID($taskID); + $productID = $this->loadModel('product')->saveState($task->product, $this->products); - /* Set menu. */ - if($this->app->tab == 'project') - { - $this->project->setMenu($task->project); - } - elseif($this->app->tab == 'execution') - { - $this->loadModel('execution')->setMenu($task->execution); - } - else - { - $this->loadModel('qa')->setMenu($this->products, $productID, $task->branch, $taskID); - } - - if(!isset($this->products[$productID])) + if(!isset($this->products[$productID]) && $productID) { $product = $this->product->getByID($productID); $this->products[$productID] = $product->name; } - /* Create testtask from testtask of test.*/ - $productID = $productID ? $productID : key($this->products); - $projectID = $this->lang->navGroup->testtask == 'qa' ? 0 : $this->session->project; - $executions = empty($productID) ? array() : $this->product->getExecutionPairsByProduct($productID, 0, 'id_desc', $projectID); - $executionID = $task->execution; - if($executionID) - { - $execution = $this->loadModel('execution')->getById($executionID); - if(!isset($executions[$executionID])) - { - $executions[$executionID] = $execution->name; - if(empty($execution->multiple)) - { - $project = $this->loadModel('project')->getById($execution->project); - $executions[$executionID] = $project->name . "({$this->lang->project->disableExecution})"; - } - } - $builds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'noempty,notrunk,withexecution', $executionID, 'execution', $task->build, false); - } - else - { - $builds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'noempty,notrunk,withexecution', $task->project, 'project', $task->build, false); - } + /* 设置菜单。 */ + /* Set menu. */ + $this->testtaskZen->setMenu($productID, $task->branch, $task->project, $task->execution, $taskID); - $this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->testtask->edit; - $this->view->task = $task; - $this->view->project = $this->project->getByID($projectID); - $this->view->executions = $executions; - $this->view->builds = empty($productID) ? array() : $builds; - $this->view->testreports = $this->loadModel('testreport')->getPairs($task->product, $task->testreport); - $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed', $task->owner); - $this->view->contactLists = $this->user->getContactLists($this->app->user->account, 'withnote'); + /* 展示相关变量。 */ + /* Show the variables associated. */ + $this->testtaskZen->assignForEdit($task, $productID); $this->display(); } diff --git a/module/testtask/model.php b/module/testtask/model.php index 0ac14f70aa..d0f7dce87e 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -744,36 +744,22 @@ class testtaskModel extends model } /** + * 更新测试单。 * Update a test task. * - * @param int $taskID + * @param object $task * @access public - * @return void + * @return array|bool */ - public function update($taskID) + public function update(object $task, object $oldTask): array|bool { - $oldTask = $this->getByID($taskID); - $task = fixer::input('post') - ->add('id', $taskID) - ->add('product', $oldTask->product) - ->setDefault('type', '') - ->setDefault('mailto', '') - ->setDefault('deleteFiles', array()) - ->stripTags($this->config->testtask->editor->edit['id'], $this->config->allowedTags) - ->join('mailto', ',') - ->join('type', ',') - ->remove('files,labels,uid,comment,contactListMenu') - ->get(); - $task = $this->loadModel('file')->processImgURL($task, $this->config->testtask->editor->edit['id'], $this->post->uid); - $this->dao->update(TABLE_TESTTASK)->data($task, 'deleteFiles') ->autoCheck() ->batchcheck($this->config->testtask->edit->requiredFields, 'notempty') ->checkIF($task->end != '', 'end', 'ge', $task->begin) ->checkFlow() - ->where('id')->eq($taskID) + ->where('id')->eq($task->id) ->exec(); - if(dao::isError()) return false; $this->file->processFile4Object('testtask', $oldTask, $task); diff --git a/module/testtask/zen.php b/module/testtask/zen.php index ef647fead7..c4f3e374ac 100644 --- a/module/testtask/zen.php +++ b/module/testtask/zen.php @@ -1,6 +1,117 @@ app->tab == 'project') + { + $this->loadModel('project')->setMenu($projectID); + } + elseif($this->app->tab == 'execution') + { + $this->loadModel('execution')->setMenu($executionID); + } + else + { + $this->testtask->setMenu($this->products, $productID, $branch, $taskID); + } + } + + /** + * 构建编辑的测试单数据。 + * Build task for editing. + * + * @param int $taskID + * @param int $productID + * @access protected + * @return object + */ + protected function buildTaskForEdit(int $taskID, int $productID): object + { + $task = form::data($this->config->testtask->form->edit) + ->add('id', $taskID) + ->add('product', $productID) + ->stripTags($this->config->testtask->editor->edit['id'], $this->config->allowedTags) + ->get(); + + $task = $this->loadModel('file')->processImgURL($task, $this->config->testtask->editor->edit['id'], $this->post->uid); + return $task; + } + + /** + * 检查编辑的测试单数据是否符合要求。 + * Check task for editing. + * + * @param object $task + * @access protected + * @return void + */ + protected function checkTaskForEdit(object $task): bool + { + $requiredErrors = array(); + /* Check required fields of editing task . */ + foreach(explode(',', $this->config->testtask->edit->requiredFields) as $requiredField) + { + if(!isset($task->{$requiredField}) || strlen(trim($task->{$requiredField})) == 0) $requiredErrors[$requiredField][] = sprintf($this->lang->error->notempty, isset($this->lang->testtask->{$requiredField}) ? $this->lang->testtask->$requiredField : $requiredField); + } + if(!empty($requiredErrors)) dao::$errors = $requiredErrors; + + if($task->end && $task->begin > $task->end) dao::$errors['end'][] = sprintf($this->lang->error->ge, $this->lang->testtask->end, $this->lang->testtask->begin); + + return !dao::isError(); + } + + /** + * Assign variables for editing test task. + * + * @param object $task + * @param int $productID + * @access protected + * @return void + */ + protected function assignForEdit(object $task, int $productID): void + { + /* Create testtask from testtask of test.*/ + $this->loadModel('project'); + $productID = $productID ? $productID : key($this->products); + $projectID = $this->lang->navGroup->testtask == 'qa' ? 0 : $this->session->project; + $executionID = $task->execution; + $executions = empty($productID) ? array() : $this->product->getExecutionPairsByProduct($productID, 0, 'id_desc', $projectID); + if($executionID && !isset($executions[$executionID])) + { + $execution = $this->loadModel('execution')->getById($executionID); + $executions[$executionID] = $execution->name; + if(empty($execution->multiple)) + { + $project = $this->project->getById($execution->project); + $executions[$executionID] = "{$project->name}({$this->lang->project->disableExecution})"; + } + } + + $this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->testtask->edit; + $this->view->task = $task; + $this->view->project = $this->project->getByID($projectID); + $this->view->executions = $executions; + $this->view->builds = empty($productID) ? array() : $this->loadModel('build')->getBuildPairs($productID, 'all', 'noempty,notrunk,withexecution', $executionID ? $executionID : $task->project, $executionID ? 'execution' : 'project', $task->build, false); + $this->view->testreports = $this->loadModel('testreport')->getPairs($task->product, $task->testreport); + $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed', $task->owner); + $this->view->contactLists = $this->user->getContactLists($this->app->user->account, 'withnote'); + } + /** * 根据不同情况获取不同的产品列表,大多用于1.5级导航。 * Get products.