diff --git a/framework/control.class.php b/framework/control.class.php
index c9330217ac..94b60bd982 100644
--- a/framework/control.class.php
+++ b/framework/control.class.php
@@ -235,9 +235,8 @@ class control extends baseControl
{
if(!isset($this->config->bizVersion)) return false;
- $flow = $this->loadModel('workflow')->getByModule($this->moduleName);
- $action = $this->loadModel('workflowaction')->getByModuleAndAction($this->moduleName, $this->methodName);
- if($flow && $action) $this->loadModel('workflowhook')->execute($flow, $action, $objectID);
+ $moduleName = $this->moduleName;
+ return $this->$moduleName->executeHooks($objectID);
}
/**
diff --git a/framework/model.class.php b/framework/model.class.php
index 5132163f4c..050296b78b 100644
--- a/framework/model.class.php
+++ b/framework/model.class.php
@@ -65,4 +65,53 @@ class model extends baseModel
return $this->loadModel('workflowfield')->processSubStatus($module, $record);
}
+
+ /**
+ * Get flow extend fields.
+ *
+ * @access public
+ * @return array
+ */
+ public function getFlowExtendFields()
+ {
+ if(!isset($this->config->bizVersion)) return array();
+
+ return $this->loadModel('flow')->getExtendFields($this->app->getModuleName(), $this->app->getMethodName());
+ }
+
+ /**
+ * Check flow rule.
+ *
+ * @param object $field
+ * @param string $value
+ * @access public
+ * @return bool|string
+ */
+ public function checkFlowRule($field, $value)
+ {
+ if(!isset($this->config->bizVersion)) return false;
+
+ return $this->loadModel('flow')->checkRule($field, $value);
+ }
+
+ /**
+ * Execute Hooks
+ *
+ * @param int $objectID
+ * @access public
+ * @return void
+ */
+ public function executeHooks($objectID)
+ {
+ if(!isset($this->config->bizVersion)) return false;
+
+ $moduleName = $this->app->getModuleName();
+ $methodName = $this->app->getMethodName();
+
+ $action = $this->loadModel('workflowaction')->getByModuleAndAction($moduleName, $methodName);
+ if($action and $action->extensionType == 'none') return false;
+
+ $flow = $this->loadModel('workflow')->getByModule($moduleName);
+ if($flow && $action) $this->loadModel('workflowhook')->execute($flow, $action, $objectID);
+ }
}
diff --git a/module/bug/model.php b/module/bug/model.php
index 036926f5b4..4a48b6a936 100644
--- a/module/bug/model.php
+++ b/module/bug/model.php
@@ -221,6 +221,7 @@ class bugModel extends model
}
if(isset($data->uploadImage)) $this->loadModel('file');
+ $extendFields = $this->getFlowExtendFields();
$bugs = array();
foreach($data->title as $i => $title)
{
@@ -251,6 +252,13 @@ class bugModel extends model
$bug->assignedDate = $now;
}
+ foreach($extendFields as $extendField)
+ {
+ $bug->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $bug->{$extendField->field});
+ if($message) die(js::alert($message));
+ }
+
foreach(explode(',', $this->config->bug->create->requiredFields) as $field)
{
$field = trim($field);
@@ -294,6 +302,9 @@ class bugModel extends model
if(dao::isError()) die(js::error(dao::getError()));
$bugID = $this->dao->lastInsertID();
+
+ $this->executeHooks($bugID);
+
$this->loadModel('score')->create('bug', 'create', $bugID);
if(!empty($data->uploadImage[$i]) and !empty($file))
{
@@ -719,6 +730,7 @@ class bugModel extends model
}
/* Initialize bugs from the post data.*/
+ $extendFields = $this->getFlowExtendFields();
$oldBugs = $bugIDList ? $this->getByList($bugIDList) : array();
foreach($bugIDList as $bugID)
{
@@ -758,6 +770,13 @@ class bugModel extends model
$bug->assignedDate = $now;
}
+ foreach($extendFields as $extendField)
+ {
+ $bug->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $bug->{$extendField->field});
+ if($message) die(js::alert($message));
+ }
+
$bugs[$bugID] = $bug;
unset($bug);
}
@@ -778,6 +797,9 @@ class bugModel extends model
if(!dao::isError())
{
if(!empty($bug->resolvedBy)) $this->loadModel('score')->create('bug', 'resolve', $bugID);
+
+ $this->executeHooks($bugID);
+
$allChanges[$bugID] = common::createChanges($oldBug, $bug);
}
else
diff --git a/module/bug/view/batchcreate.html.php b/module/bug/view/batchcreate.html.php
index dad99c7c28..1f3cb383e7 100644
--- a/module/bug/view/batchcreate.html.php
+++ b/module/bug/view/batchcreate.html.php
@@ -60,6 +60,10 @@
'>bug->os;?> |
'>bug->browser;?> |
'>bug->keywords;?> |
+ bug->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -110,6 +114,7 @@
' style='overflow:visible'> bug->osList, $os, "class='form-control chosen'");?> |
' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> |
'> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[$i]") . "";?>
@@ -152,6 +157,7 @@
' style='overflow:visible'> bug->osList, $os, "class='form-control chosen'");?> |
' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> |
'> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[$i]") . "";?>
@@ -197,6 +203,7 @@
' style='overflow:visible'> bug->osList, $os, "class='form-control chosen'");?> |
' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> |
'> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[%s]") . "";?>
diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php
index 2597baf598..8395417e8f 100644
--- a/module/bug/view/batchedit.html.php
+++ b/module/bug/view/batchedit.html.php
@@ -64,6 +64,10 @@
'>bug->keywords;?> |
'>bug->resolvedByAB;?> |
'>bug->resolutionAB;?> |
+ bug->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -128,6 +132,7 @@
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $bug, $extendField->field . "[{$bugID}]") . "";?>
diff --git a/module/story/model.php b/module/story/model.php
index faca71febf..26692d7d76 100644
--- a/module/story/model.php
+++ b/module/story/model.php
@@ -301,8 +301,9 @@ class storyModel extends model
if(isset($stories->uploadImage)) $this->loadModel('file');
- $forceReview = $this->checkForceReview();
- $data = array();
+ $extendFields = $this->getFlowExtendFields();
+ $forceReview = $this->checkForceReview();
+ $data = array();
foreach($stories->title as $i => $title)
{
if(empty($title)) continue;
@@ -323,6 +324,13 @@ class storyModel extends model
$story->openedDate = $now;
$story->version = 1;
+ foreach($extendFields as $extendField)
+ {
+ $story->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $story->{$extendField->field});
+ if($message) die(js::alert($message));
+ }
+
foreach(explode(',', $this->config->story->create->requiredFields) as $field)
{
$field = trim($field);
@@ -364,7 +372,7 @@ class storyModel extends model
unset($file['realpath']);
if(!is_dir($this->file->savePath)) mkdir($this->file->savePath, 0777, true);
- if(rename($realPath, $this->file->savePath . $this->file->getSaveName($file['pathname'])))
+ if($realPath and rename($realPath, $this->file->savePath . $this->file->getSaveName($file['pathname'])))
{
$file['addedBy'] = $this->app->user->account;
$file['addedDate'] = $now;
@@ -387,6 +395,8 @@ class storyModel extends model
$this->dao->insert(TABLE_STORYSPEC)->data($specData)->exec();
+ $this->executeHooks($storyID);
+
$actionID = $this->action->create('story', $storyID, 'Opened', '');
if(!dao::isError()) $this->loadModel('score')->create('story', 'create',$storyID);
$mails[$i] = new stdclass();
@@ -796,6 +806,7 @@ class storyModel extends model
if(isset($data->closedReasons[$storyID])) $prev['closedReason'] = $data->closedReasons[$storyID];
}
+ $extendFields = $this->getFlowExtendFields();
foreach($storyIdList as $storyID)
{
$oldStory = $oldStories[$storyID];
@@ -830,6 +841,13 @@ class storyModel extends model
if($story->closedBy != false or $story->closedReason != false) $story->status = 'closed';
if($story->closedReason != false and $story->closedBy == false) $story->closedBy = $this->app->user->account;
+ foreach($extendFields as $extendField)
+ {
+ $story->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $story->{$extendField->field});
+ if($message) die(js::alert($message));
+ }
+
$stories[$storyID] = $story;
}
@@ -857,6 +875,8 @@ class storyModel extends model
if(!dao::isError())
{
+ $this->executeHooks($storyID);
+
$this->setStage($storyID);
if($story->closedReason == 'done') $this->loadModel('score')->create('story', 'close');
$allChanges[$storyID] = common::createChanges($oldStory, $story);
diff --git a/module/story/view/batchcreate.html.php b/module/story/view/batchcreate.html.php
index 7b16d7bd21..8d16660518 100644
--- a/module/story/view/batchcreate.html.php
+++ b/module/story/view/batchcreate.html.php
@@ -56,6 +56,10 @@
'>story->estimate;?> |
'>story->needReview;?> |
'>story->keywords;?> |
+ story->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -88,6 +92,7 @@
'> |
'>story->reviewList, $needReview, "class='form-control'");?> |
'> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . '[$id]') . "";?>
diff --git a/module/story/view/batchedit.html.php b/module/story/view/batchedit.html.php
index 909e59b349..d70c46cbf1 100644
--- a/module/story/view/batchedit.html.php
+++ b/module/story/view/batchedit.html.php
@@ -53,6 +53,10 @@ foreach(explode(',', $showFields) as $field)
'>story->closedBy;?> |
'> story->closedReason;?> |
'>story->keywords;?> |
+ story->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -143,6 +147,7 @@ foreach(explode(',', $showFields) as $field)
>closedReason, 'class="form-control" disabled="disabled"');?> |
>keywords, 'class="form-control"');?> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $story, $extendField->field . "[{$storyID}]") . "";?>
diff --git a/module/task/model.php b/module/task/model.php
index 0b5db09bf3..616078dd71 100644
--- a/module/task/model.php
+++ b/module/task/model.php
@@ -246,7 +246,8 @@ class taskModel extends model
$assignedTo = '';
/* Get task data. */
- $data = array();
+ $extendFields = $this->getFlowExtendFields();
+ $data = array();
foreach($tasks->name as $i => $name)
{
$story = !isset($tasks->story[$i]) || $tasks->story[$i] == 'ditto' ? $story : $tasks->story[$i];
@@ -278,6 +279,17 @@ class taskModel extends model
if($assignedTo) $data[$i]->assignedDate = $now;
if(strpos($this->config->task->create->requiredFields, 'estStarted') !== false and empty($tasks->estStarted[$i])) $data[$i]->estStarted = '';
if(strpos($this->config->task->create->requiredFields, 'deadline') !== false and empty($tasks->deadline[$i])) $data[$i]->deadline = '';
+
+ foreach($extendFields as $extendField)
+ {
+ $data[$i]->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $data[$i]->{$extendField->field});
+ if($message)
+ {
+ dao::$errors['message'][] = sprintf($message);
+ return false;
+ }
+ }
}
/* Fix bug #1525*/
@@ -289,7 +301,6 @@ class taskModel extends model
/* check data. */
foreach($data as $i => $task)
{
-
if($task->deadline != '0000-00-00' and $task->deadline < $task->estStarted)
{
dao::$errors['message'][] = $this->lang->task->error->deadlineSmall;
@@ -327,6 +338,9 @@ class taskModel extends model
$taskID = $this->dao->lastInsertID();
$childTasks .= $taskID . ',';
if($story) $this->story->setStage($task->story);
+
+ $this->executeHooks($taskID);
+
$actionID = $this->action->create('task', $taskID, 'Opened', '');
if(!dao::isError()) $this->loadModel('score')->create('task', 'create', $taskID);
@@ -905,7 +919,8 @@ class taskModel extends model
}
/* Initialize tasks from the post data.*/
- $oldTasks = $taskIDList ? $this->getByList($taskIDList) : array();
+ $extendFields = $this->getFlowExtendFields();
+ $oldTasks = $taskIDList ? $this->getByList($taskIDList) : array();
foreach($taskIDList as $taskID)
{
$oldTask = $oldTasks[$taskID];
@@ -934,6 +949,13 @@ class taskModel extends model
$task->lastEditedDate = $now;
$task->consumed = $oldTask->consumed;
+ foreach($extendFields as $extendField)
+ {
+ $task->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $task->{$extendField->field});
+ if($message) die(js::alert($message));
+ }
+
if($data->consumeds[$taskID])
{
if($data->consumeds[$taskID] < 0)
diff --git a/module/task/view/batchcreate.html.php b/module/task/view/batchcreate.html.php
index ee225a0991..d00d30eecd 100644
--- a/module/task/view/batchcreate.html.php
+++ b/module/task/view/batchcreate.html.php
@@ -70,6 +70,10 @@
'>task->deadline;?> |
'>task->desc;?> |
'>task->pri;?> |
+ task->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -132,6 +136,7 @@
> |
> |
>task->priList, $pri, 'class=form-control');?> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[$i]") . "";?>
@@ -184,6 +189,7 @@
> |
> |
>task->priList, $pri, 'class=form-control');?> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[%s]") . "";?>
diff --git a/module/task/view/batchedit.html.php b/module/task/view/batchedit.html.php
index 87cfa0f69a..bcbbfb7e5e 100755
--- a/module/task/view/batchedit.html.php
+++ b/module/task/view/batchedit.html.php
@@ -66,6 +66,10 @@
'>task->canceledBy;?> |
'>task->closedBy;?> |
'>task->closedReason;?> |
+ task->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -111,6 +115,7 @@
' style='overflow:visible'>canceledBy, "class='form-control chosen'");?> |
' style='overflow:visible'>closedBy, "class='form-control chosen'");?> |
>task->reasonList, $tasks[$taskID]->closedReason, 'class=form-control');?> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $tasks[$taskID], $extendField->field . "[{$taskID}]") . "";?>
diff --git a/module/testcase/model.php b/module/testcase/model.php
index c884791ac3..24d3f89657 100644
--- a/module/testcase/model.php
+++ b/module/testcase/model.php
@@ -272,6 +272,7 @@ class testcaseModel extends model
}
$this->loadModel('story');
+ $extendFields = $this->getFlowExtendFields();
$storyVersions = array();
$forceNotReview = $this->forceNotReview();
$data = array();
@@ -304,6 +305,13 @@ class testcaseModel extends model
$storyVersions[$caseStory] = $data[$i]->storyVersion;
}
+ foreach($extendFields as $extendField)
+ {
+ $data[$i]->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $data[$i]->{$extendField->field});
+ if($message) die(js::alert($message));
+ }
+
foreach(explode(',', $this->config->testcase->create->requiredFields) as $field)
{
$field = trim($field);
@@ -324,7 +332,10 @@ class testcaseModel extends model
die(js::reload('parent'));
}
- $caseID = $this->dao->lastInsertID();
+ $caseID = $this->dao->lastInsertID();
+
+ $this->executeHooks($caseID);
+
$this->loadModel('score')->create('testcase', 'create', $caseID);
$actionID = $this->loadModel('action')->create('case', $caseID, 'Opened');
}
@@ -840,6 +851,7 @@ class testcaseModel extends model
}
/* Initialize cases from the post data.*/
+ $extendFields = $this->getFlowExtendFields();
foreach($caseIDList as $caseID)
{
$case = new stdclass();
@@ -857,6 +869,13 @@ class testcaseModel extends model
$case->type = $data->types[$caseID];
$case->stage = empty($data->stages[$caseID]) ? '' : implode(',', $data->stages[$caseID]);
+ foreach($extendFields as $extendField)
+ {
+ $case->{$extendField->field} = htmlspecialchars($this->post->{$extendField->field}[$i]);
+ $message = $this->checkFlowRule($extendField, $case->{$extendField->field});
+ if($message) die(js::alert($message));
+ }
+
$cases[$caseID] = $case;
unset($case);
}
@@ -873,6 +892,8 @@ class testcaseModel extends model
if(!dao::isError())
{
+ $this->executeHooks($caseID);
+
unset($oldCase->steps);
$allChanges[$caseID] = common::createChanges($oldCase, $case);
}
diff --git a/module/testcase/view/batchcreate.html.php b/module/testcase/view/batchcreate.html.php
index 357ead4016..05f0f85b68 100644
--- a/module/testcase/view/batchcreate.html.php
+++ b/module/testcase/view/batchcreate.html.php
@@ -64,6 +64,10 @@
'>testcase->keywords;?> |
'>testcase->stage;?> |
'>testcase->review;?> |
+ testcase->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -99,6 +103,7 @@
'> |
' style='overflow:visible'>testcase->stageList, '', "class='form-control chosen' multiple");?> |
'>testcase->reviewList, $needReview, "class='form-control'");?> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[$i]") . "";?>
@@ -139,6 +144,7 @@
'> |
' style='overflow:visible'>testcase->stageList, '', "class='form-control chosen' multiple");?> |
'>testcase->reviewList, $needReview, "class='form-control chosen'");?> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[%s]") . "";?>
diff --git a/module/testcase/view/batchedit.html.php b/module/testcase/view/batchedit.html.php
index b75af1ea52..2a5deb3d9e 100644
--- a/module/testcase/view/batchedit.html.php
+++ b/module/testcase/view/batchedit.html.php
@@ -57,6 +57,10 @@
'>testcase->precondition;?> |
'>testcase->keywords;?> |
'>testcase->stage;?> |
+ testcase->getFlowExtendFields();
+ foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ ?>
@@ -109,6 +113,7 @@
'>precondition, "rows='1' class='form-control autosize'")?> |
'> keywords, "class='form-control'");?> |
' style='overflow:visible'>testcase->stageList, $cases[$caseID]->stage, "class='form-control chosen' multiple data-placeholder='{$lang->testcase->stage}'");?> |
+ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $cases[$caseID], $extendField->field . "[{$caseID}]") . "";?>