Sfoglia il codice sorgente

Improve the UI on object deletion: added a confirmation form and do check the dependencies so as to preserve the DB integrity

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@146 a333f486-631f-4898-b8df-5754b55c2be0
romainq 15 anni fa
parent
commit
17883e9308
2 ha cambiato i file con 75 aggiunte e 10 eliminazioni
  1. 3 1
      core/metamodel.class.php
  2. 72 9
      pages/UI.php

+ 3 - 1
core/metamodel.class.php

@@ -2681,7 +2681,7 @@ abstract class MetaModel
 		}
 		return $aResult;
 	}
-	public static function EnumReferencingClasses($sClass, $bSkipLinkingClasses = false)
+	public static function EnumReferencingClasses($sClass, $bSkipLinkingClasses = false, $bInnerJoinsOnly = false)
 	{
 		self::_check_subclass($sClass);	
 
@@ -2699,6 +2699,8 @@ abstract class MetaModel
 				if (self::$m_aAttribOrigins[$sSomeClass][$sAttCode] != $sSomeClass) continue;
 				if ($oAttDef->IsExternalKey() && ($oAttDef->GetTargetClass() == $sClass))
 				{
+					if ($bInnerJoinsOnly && $oAttDef->IsNullAllowed()) continue;
+					// Ok, I want this one
 					$aExtKeys[] = $sAttCode;
 				}
 			}

+ 72 - 9
pages/UI.php

@@ -469,25 +469,88 @@ switch($operation)
 	break;
 	
 	case 'delete':
+	case 'delete_confirmed':
 	$sClass = utils::ReadParam('class', '');
 	$sClassLabel = MetaModel::GetName($sClass);
 	$id = utils::ReadParam('id', '');
 	$oObj = $oContext->GetObject($sClass, $id);
 	$sName = $oObj->GetName();
-	$oMyChange = MetaModel::NewObject("CMDBChange");
-	$oMyChange->Set("date", time());
-	if (UserRights::GetUser() != UserRights::GetRealUser())
+	if ($operation == 'delete_confirmed')
 	{
-		$sUserString = UserRights::GetRealUser()." on behalf of ".UserRights::GetUser();
+		$oMyChange = MetaModel::NewObject("CMDBChange");
+		$oMyChange->Set("date", time());
+		if (UserRights::GetUser() != UserRights::GetRealUser())
+		{
+			$sUserString = UserRights::GetRealUser()." on behalf of ".UserRights::GetUser();
+		}
+		else
+		{
+			$sUserString = UserRights::GetUser();
+		}
+		$oMyChange->Set("userinfo", $sUserString);
+		$oMyChange->DBInsert();
+		$oObj->DBDeleteTracked($oMyChange);
+		$oP->add("<h1>".$sName." - $sClassLabel deleted</h1>\n");
 	}
 	else
 	{
-		$sUserString = UserRights::GetUser();
+		// Evaluate the consequences onto the DB integrity
+		//
+		$aDependentObjects = array();
+		$iTotalThreat = 0;
+		$aRererencingMe = MetaModel::EnumReferencingClasses($sClass, false /*include N-N links*/, true /*inner joins*/);
+		foreach($aRererencingMe as $sRemoteClass => $aExtKeys)
+		{
+			foreach($aExtKeys as $sExtKeyAttCode)
+			{
+				//$oAttDef = MetaModel::GetAttributeDef($sClass, $sExtKeyAttCode);
+
+				$oSearch = new DBObjectSearch($sRemoteClass);
+				$oSearch->AddCondition($sExtKeyAttCode, $id);
+				$oSet = new CMDBObjectSet($oSearch);
+				//if ($oSet->Count() > 0)
+				while ($oDependentObj = $oSet->fetch())
+				{
+					$aDependentObjects[$sRemoteClass][] = $oDependentObj;
+					$iTotalThreat++;
+				}
+			}
+		}
+		// Ask for a confirmation, or cancel (back to the object details)
+		//
+		if ($iTotalThreat > 0)
+		{
+			$oP->p("Warning: $iTotalThreat object(s) are pointing to the object that you would like to delete");
+			
+			foreach ($aDependentObjects as $sRemoteClass => $aPotentialDeletes)
+			{
+				$oP->add("<p>".MetaModel::GetName($sRemoteClass)."\n");
+				$oP->add("<ul>\n");
+				foreach ($aPotentialDeletes as $oDependentObj)
+				{
+					$oP->add("<li>".$oDependentObj->GetHyperLink()."</li>");
+				}
+				$oP->add("</ul>\n");
+			}
+			$oP->p("You have to delete those objects prior to deleting ".$oObj->GetHyperLink());
+			$oP->add("<form method=\"post\">\n");
+			$oP->add("<input DISABLED type=\"submit\" name=\"\" value=\" Delete! \">\n");
+			$oP->add("<input type=\"button\" onclick=\"window.history.back();\" value=\" Cancel \">\n");
+			$oP->add("</form>\n");
+		}
+		else
+		{
+			$oP->p("Please confirm that you want to delete this object");
+			$oP->add("<form method=\"post\">\n");
+			$oP->add("<input type=\"hidden\" name=\"menu\" value=\"$iActiveNodeId\">\n");
+			$oP->add("<input type=\"hidden\" name=\"operation\" value=\"delete_confirmed\">\n");
+			$oP->add("<input type=\"hidden\" name=\"class\" value=\"$sClass\">\n");
+			$oP->add("<input type=\"hidden\" name=\"id\" value=\"$id\">\n");
+			$oP->add("<input type=\"submit\" name=\"\" value=\" Delete! \">\n");
+			$oP->add("<input type=\"button\" onclick=\"window.history.back();\" value=\" Cancel \">\n");
+			$oP->add("</form>\n");
+		}
 	}
-	$oMyChange->Set("userinfo", $sUserString);
-	$oMyChange->DBInsert();
-	$oObj->DBDeleteTracked($oMyChange);
-	$oP->add("<h1>".$sName." - $sClassLabel deleted</h1>\n");
 	break;
 	
 	case 'apply_new':