diff --git a/module/bug/control.php b/module/bug/control.php
index 811b487e8f..197db31e5e 100755
--- a/module/bug/control.php
+++ b/module/bug/control.php
@@ -670,7 +670,6 @@ class bug extends control
/* Assign. */
$this->view->title = $this->lang->bug->linkBugs . "BUG #$bug->id $bug->title {$this->lang->dash} " . $this->products[$bug->product];
- $this->view->bug = $bug;
$this->view->bugs2Link = $this->bug->getBugs2Link($bugID, $bySearch, $excludeBugs, $queryID, $pager);
$this->view->users = $this->user->getPairs('noletter');
$this->view->pager = $pager;
@@ -702,23 +701,29 @@ class bug extends control
$bugs = $this->bugZen->checkBugsForBatchCreate($bugs, $productID);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
- /* Batch create bugs. */
- $actions = $this->bug->batchCreate($bugs, $productID, $output, $this->post->uploadImage, $this->session->bugImagesFile);
-
- helper::setcookie('bugModule', 0, 0);
-
- /* Remove upload image file and session. */
- if(!empty($this->post->uploadImage) and !empty($this->session->bugImagesFile))
+ $uploadImages = $this->post->uploadImage;
+ $bugImagesFiles = $this->session->bugImagesFile;
+ $bugIDList = array();
+ $message = '';
+ foreach($bugs as $index => $bug)
{
- $classFile = $this->app->loadClass('zfile');
- $file = current($_SESSION['bugImagesFile']);
- $realPath = dirname($file['realpath']);
- if(is_dir($realPath)) $classFile->removeDir($realPath);
- unset($_SESSION['bugImagesFile']);
- }
+ $uploadImage = !empty($uploadImages[$index]) ? $uploadImages[$index] : '';
- $response = $this->bugZen->responseAfterBatchCreate($productID, $branch, $executionID, $actions ? $actions : array());
- return $this->send($response);
+ $file = $this->bugZen->processImageForBatchCreate($bug, $uploadImage, $bugImagesFiles);
+
+ $bug->id = $this->bug->create($bug);
+
+ /* Processing other operations after batch creation. */
+ $this->bugZen->afterBatchCreate($bug, $output, $uploadImage, $file);
+ $message = $this->executeHooks($bug->id);
+
+ $bugIDList[] = $bug->id;
+ }
+ if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
+ $this->loadModel('score')->create('ajax', 'batchCreate');
+
+ if(!$message) $message = $this->lang->saveSuccess;
+ return $this->bugZen->responseAfterBatchCreate($productID, $branch, $executionID, $bugIDList, $message);
}
/* Get product, then set menu. */
diff --git a/module/bug/model.php b/module/bug/model.php
index 02200b4075..e6c9d26765 100644
--- a/module/bug/model.php
+++ b/module/bug/model.php
@@ -56,9 +56,9 @@ class bugModel extends model
*/
public function create(object $bug, string $action = 'Opened'): int|false
{
- $this->dao->insert(TABLE_BUG)->data($bug)
+ $this->dao->insert(TABLE_BUG)->data($bug, 'laneID')
->autoCheck()
- ->checkIF($bug->notifyEmail, 'notifyEmail', 'email')
+ ->checkIF(!empty($bug->notifyEmail), 'notifyEmail', 'email')
->batchCheck($this->config->bug->create->requiredFields, 'notempty')
->checkFlow()
->exec();
@@ -69,58 +69,17 @@ class bugModel extends model
$this->loadModel('action')->create('bug', $bugID, $action);
- return $bugID;
- }
-
- /**
- * 批量创建bug
- * Batch create bugs.
- *
- * @param int $productID
- * @param array $extra
- * @param array|bool $extra
- * @access public
- * @return array
- */
- public function batchCreate(array $bugs, int $productID, array $output = array(), array|bool $uploadImages = false, array|bool $bugImagesFiles = false)
- {
- /* Load module and init vars. */
- $this->loadModel('action');
- if(!empty($uploadImages)) $this->loadModel('file');
-
- $actions = array();
- foreach($bugs as $index => $bug)
+ /* Add score for create. */
+ if(!empty($bug->case))
{
- /* Get lane id, remove laneID from bug. */
- $laneID = !empty($bug->laneID) ? $bug->laneID : zget($output, 'laneID', 0);
- unset($bug->laneID);
-
- $uploadImage = !empty($uploadImages[$index]) ? $uploadImages[$index] : '';
-
- $file = $this->processImageForBatchCreate($bug, $uploadImage, $bugImagesFiles);
-
- /* Create a bug. */
- $this->dao->insert(TABLE_BUG)->data($bug)
- ->autoCheck()
- ->batchCheck($this->config->bug->create->requiredFields, 'notempty')
- ->checkFlow()
- ->exec();
- if(dao::isError()) return false;
-
- $bug->id = $this->dao->lastInsertID();
-
- /* Processing other operations after batch creation. */
- $actions[$bug->id] = $this->afterBatchCreate($bug, $laneID, $output, $uploadImage, $file);
-
- if(dao::isError())
- {
- dao::$errors['message'][] = 'bug#' . ($index) . dao::getError(true);
- return false;
- }
+ $this->loadModel('score')->create('bug', 'createFormCase', $bug->case);
+ }
+ else
+ {
+ $this->loadModel('score')->create('bug', 'create', $bugID);
}
- if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchCreate');
- return $actions;
+ return $bugID;
}
/**
@@ -2698,91 +2657,6 @@ class bugModel extends model
return $index;
}
- /**
- * 批量创建bug前处理上传图片。
- * Before batch creating bugs, process the uploaded images.
- *
- * @param object $bug
- * @param string $uploadImage
- * @param array|bool $bugImagesFiles
- * @access protected
- * @return array|false
- */
- protected function processImageForBatchCreate(object $bug, string $uploadImage, array|bool $bugImagesFiles): array|false
- {
- /* When the bug is created by uploading an image, add the image to the step of the bug. */
- if(!empty($uploadImage))
- {
- $this->loadModel('file');
-
- $file = $bugImagesFiles[$uploadImage];
- $realPath = $file['realpath'];
-
- if(rename($realPath, $this->file->savePath . $this->file->getSaveName($file['pathname'])))
- {
- if(in_array($file['extension'], $this->config->file->imageExtensions))
- {
- $file['addedBy'] = $this->app->user->account;
- $file['addedDate'] = helper::now();
- $this->dao->insert(TABLE_FILE)->data($file, 'realpath')->exec();
-
- $fileID = $this->dao->lastInsertID();
- $bug->steps .= '
';
- }
- }
- else
- {
- unset($file);
- }
- }
-
- return !empty($file) ? $file : false;
- }
-
- /**
- * 批量创建bug后的其他处理。
- * Processing after batch creation of bug.
- *
- * @param object $bug
- * @param int $laneID
- * @param array $output
- * @param string $uploadImage
- * @param array|bool $file
- * @access protected
- * @return int|bool
- */
- protected function afterBatchCreate(object $bug, int $laneID, array $output, string $uploadImage, array|bool $file): int|bool
- {
- /* Record log. */
- $actionID = $this->loadModel('action')->create('bug', $bug->id, 'Opened');
-
- $this->loadModel('score')->create('bug', 'create', $bug->id);
-
- $this->executeHooks($bug->id);
-
- /* If bug has the execution, update kanban data. */
- if($bug->execution)
- {
- $columnID = $this->loadModel('kanban')->getColumnIDByLaneID($laneID, 'unconfirmed');
- if(empty($columnID)) $columnID = zget($output, 'columnID', 0);
-
- if(!empty($laneID) and !empty($columnID)) $this->kanban->addKanbanCell($bug->execution, $laneID, $columnID, 'bug', $bug->id);
- if(empty($laneID) or empty($columnID)) $this->kanban->updateLane($bug->execution, 'bug');
- }
-
- /* When the bug is created by uploading the image, add the image to the file of the bug. */
- if(!empty($uploadImage) and !empty($file))
- {
- $file['objectType'] = 'bug';
- $file['objectID'] = $bug->id;
- $file['addedBy'] = $this->app->user->account;
- $file['addedDate'] = helper::now();
- $this->dao->insert(TABLE_FILE)->data($file, 'realpath')->exec();
- unset($file);
- }
- return $actionID;
- }
-
/**
* 批量编辑 bug 后的其他处理。
* Processing after batch edit of bug.
diff --git a/module/bug/ui/linkbugs.html.php b/module/bug/ui/linkbugs.html.php
index 08e6337df9..4504a9640e 100644
--- a/module/bug/ui/linkbugs.html.php
+++ b/module/bug/ui/linkbugs.html.php
@@ -13,8 +13,8 @@ namespace zin;
foreach($bugs2Link as $bug)
{
$bug->productName = zget($products, $bug->product);
- $bug->openedBy = zget($users, $bug->openedBy);
- $bug->assignedTo = zget($users, $bug->assignedTo);
+ $bug->openedBy = zget($users, $bug->openedBy);
+ $bug->assignedTo = zget($users, $bug->assignedTo);
}
$cols = array_values($config->bug->linkBugs->dtable->fieldList);
diff --git a/module/bug/ui/view.html.php b/module/bug/ui/view.html.php
index 97b0138eff..9b4f1c819e 100644
--- a/module/bug/ui/view.html.php
+++ b/module/bug/ui/view.html.php
@@ -92,9 +92,12 @@ foreach($browserList as $browser)
}
$mailtoList = '';
-foreach(explode(',', str_replace(' ', '', $bug->mailto)) as $account)
+if(!empty($bug->mailto))
{
- $mailtoList .= ' ' . zget($users, $account);
+ foreach(explode(',', str_replace(' ', '', $bug->mailto)) as $account)
+ {
+ $mailtoList .= ' ' . zget($users, $account);
+ }
}
$linkBugs = array();
diff --git a/module/bug/zen.php b/module/bug/zen.php
index 4779ae45f2..75cfe29921 100644
--- a/module/bug/zen.php
+++ b/module/bug/zen.php
@@ -490,6 +490,88 @@ class bugZen extends bug
return $this->send(array('result' => 'success', 'message' => $message, 'closeModal' => true, 'load' => $this->createLink('bug', 'view', "bugID=$bugID")));
}
+ /**
+ * 批量创建bug前处理上传图片。
+ * Before batch creating bugs, process the uploaded images.
+ *
+ * @param object $bug
+ * @param string $uploadImage
+ * @param array|bool $bugImagesFiles
+ * @access protected
+ * @return array|false
+ */
+ protected function processImageForBatchCreate(object $bug, string $uploadImage, array|bool $bugImagesFiles): array|false
+ {
+ /* When the bug is created by uploading an image, add the image to the step of the bug. */
+ if(!empty($uploadImage))
+ {
+ $this->loadModel('file');
+
+ $file = $bugImagesFiles[$uploadImage];
+ $realPath = $file['realpath'];
+
+ if(rename($realPath, $this->file->savePath . $this->file->getSaveName($file['pathname'])))
+ {
+ if(in_array($file['extension'], $this->config->file->imageExtensions))
+ {
+ $file['addedBy'] = $this->app->user->account;
+ $file['addedDate'] = helper::now();
+ $this->dao->insert(TABLE_FILE)->data($file, 'realpath')->exec();
+
+ $fileID = $this->dao->lastInsertID();
+ $bug->steps .= '
';
+ }
+ }
+ else
+ {
+ unset($file);
+ }
+ }
+
+ return !empty($file) ? $file : false;
+ }
+
+ /**
+ * 批量创建bug后的其他处理。
+ * Processing after batch creation of bug.
+ *
+ * @param object $bug
+ * @param array $output
+ * @param string $uploadImage
+ * @param array|bool $file
+ * @access protected
+ * @return bool
+ */
+ protected function afterBatchCreate(object $bug, array $output, string $uploadImage, array|bool $file): bool
+ {
+ /* If bug has the execution, update kanban data. */
+ if($bug->execution)
+ {
+ /* Get lane id, remove laneID from bug. */
+ $laneID = !empty($bug->laneID) ? $bug->laneID : zget($output, 'laneID', 0);
+ unset($bug->laneID);
+
+ $columnID = $this->loadModel('kanban')->getColumnIDByLaneID($laneID, 'unconfirmed');
+ if(empty($columnID)) $columnID = zget($output, 'columnID', 0);
+
+ if(!empty($laneID) and !empty($columnID)) $this->kanban->addKanbanCell($bug->execution, $laneID, $columnID, 'bug', $bug->id);
+ if(empty($laneID) or empty($columnID)) $this->kanban->updateLane($bug->execution, 'bug');
+ }
+
+ /* When the bug is created by uploading the image, add the image to the file of the bug. */
+ if(!empty($uploadImage) and !empty($file))
+ {
+ $file['objectType'] = 'bug';
+ $file['objectID'] = $bug->id;
+ $file['addedBy'] = $this->app->user->account;
+ $file['addedDate'] = helper::now();
+ $this->dao->insert(TABLE_FILE)->data($file, 'realpath')->exec();
+ unset($file);
+ }
+
+ return !dao::isError();
+ }
+
/**
* 在弹窗中操作后的返回。
* Respond after operating in modal.
@@ -550,16 +632,6 @@ class bugZen extends bug
$bugID = $bug->id;
$todoID = isset($output['todoID']) ? $output['todoID'] : 0;
- /* Add score for create. */
- if(empty($bug->case))
- {
- $this->loadModel('score')->create('bug', 'create', $bugID);
- }
- else
- {
- $this->loadModel('score')->create('bug', 'createFormCase', $bug->case);
- }
-
if($todoID)
{
$this->dao->update(TABLE_TODO)->set('status')->eq('done')->where('id')->eq($todoID)->exec();
@@ -1522,31 +1594,40 @@ class bugZen extends bug
* 批量创建bug后返回响应。
* Response after batch create.
*
- * @param int $productID
- * @param string $branch
- * @param int $executionID
- * @param array $actions
+ * @param int $productID
+ * @param string $branch
+ * @param int $executionID
+ * @param array $bugIDList
+ * @param string $message
* @access protected
* @return void
*/
- protected function responseAfterBatchCreate(int $productID, string $branch, int $executionID, array $actions)
+ protected function responseAfterBatchCreate(int $productID, string $branch, int $executionID, array $bugIDList, string $message = '')
{
+ helper::setcookie('bugModule', '0', 0);
+
+ /* Remove upload image file and session. */
+ if(!empty($this->post->uploadImage) and !empty($this->session->bugImagesFile))
+ {
+ $classFile = $this->app->loadClass('zfile');
+ $file = current($_SESSION['bugImagesFile']);
+ $realPath = dirname($file['realpath']);
+ if(is_dir($realPath)) $classFile->removeDir($realPath);
+ unset($_SESSION['bugImagesFile']);
+ }
+
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
/* Return bug id list when call the API. */
- if($this->viewType == 'json')
- {
- $bugIDList = array_keys($actions);
- return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'idList' => $bugIDList);
- }
+ if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $message, 'idList' => $bugIDList));
/* Respond after updating in modal. */
- if(isonlybody() && $executionID) $this->responseInModal($executionID);
+ if(isonlybody() && $executionID) return $this->responseInModal($executionID);
/* If link from no head then reload. */
- if(isonlybody()) return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true);
+ if(isonlybody()) return $this->send(array('result' => 'success', 'message' => $message, 'closeModal' => true));
- return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $this->createLink('bug', 'browse', "productID={$productID}&branch={$branch}&browseType=unclosed¶m=0&orderBy=id_desc"));
+ return $this->send(array('result' => 'success', 'message' => $message, 'load' => $this->createLink('bug', 'browse', "productID={$productID}&branch={$branch}&browseType=unclosed¶m=0&orderBy=id_desc")));
}
/**