소스 검색

- Don't activate triggers if the transition fails
- Reload the object, in case some custom action changed an external object

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@1660 a333f486-631f-4898-b8df-5754b55c2be0

dflaven 13 년 전
부모
커밋
12e8e4c0b5
1개의 변경된 파일16개의 추가작업 그리고 12개의 파일을 삭제
  1. 16 12
      core/dbobject.class.php

+ 16 - 12
core/dbobject.class.php

@@ -1607,19 +1607,23 @@ abstract class DBObject
 			if (!$bRet) $bSuccess = false;
 		}
 
-		// Change state triggers...
-		$sClass = get_class($this);
-		$sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
-		$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sPreviousState'"));
-		while ($oTrigger = $oSet->Fetch())
-		{
-			$oTrigger->DoActivate($this->ToArgs('this'));
-		}
-
-		$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sNewState'"));
-		while ($oTrigger = $oSet->Fetch())
+		if ($bSuccess)
 		{
-			$oTrigger->DoActivate($this->ToArgs('this'));
+			$this->Reload(); // in case an action modified something (like an object pointed to by an ext key)
+			// Change state triggers...
+			$sClass = get_class($this);
+			$sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
+			$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sPreviousState'"));
+			while ($oTrigger = $oSet->Fetch())
+			{
+				$oTrigger->DoActivate($this->ToArgs('this'));
+			}
+	
+			$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sNewState'"));
+			while ($oTrigger = $oSet->Fetch())
+			{
+				$oTrigger->DoActivate($this->ToArgs('this'));
+			}
 		}
 
 		return $bSuccess;