فهرست منبع

Fixed bug on deletion: take the inheritance into account when checking for referencing objects (eg. a ticket linked to a PC was not seen)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@180 a333f486-631f-4898-b8df-5754b55c2be0
romainq 15 سال پیش
والد
کامیت
64c18b692e
6فایلهای تغییر یافته به همراه51 افزوده شده و 28 حذف شده
  1. 6 1
      application/ui.linkswidget.class.inc.php
  2. 23 0
      core/dbobject.class.php
  3. 14 3
      core/metamodel.class.php
  4. 5 21
      pages/UI.php
  5. 1 1
      pages/advanced_search.php
  6. 2 2
      pages/schema.php

+ 6 - 1
application/ui.linkswidget.class.inc.php

@@ -63,6 +63,11 @@ class UILinksWidget
 			}
 			$sJSON = '['.implode(',', $aCurrentValues).']';
 		}
+		else
+		{
+//echo "JSON VA IECH<br/>\n";
+		}
+//echo "JASON: $sJSON<br/>\n";;
 
 		// Many values (or even a unknown list) display an autocomplete
 		if ( (count($aAllowedValues) == 0) || (count($aAllowedValues) > 50) )
@@ -269,7 +274,7 @@ EOF;
 		
 		$sHTML = "<div class=\"jqmWindow\" id=\"LinkDlg_$sId\">\n";
 		$sHTML .= "<div class=\"wizContainer\">\n";
-		$sHTML .= "<div class=\"page_header\"><h1 id=\"LinkObject_DlgTitle\">$sLinkedClass attributes</h1></div>\n";
+		$sHTML .= "<div class=\"page_header\"><h1 id=\"LinkObject_DlgTitle\">".MetaModel::GetName($sLinkedClass)." attributes</h1></div>\n";
 		$sHTML .= "<form>\n";
 		$index = 0;
 		$aAttrsMap = array();

+ 23 - 0
core/dbobject.class.php

@@ -847,6 +847,29 @@ abstract class DBObject
 		}
 		return $aResults;
 	}
+
+	public function GetReferencingObjects()
+	{
+		$aDependentObjects = array();
+		$aRererencingMe = MetaModel::EnumReferencingClasses(get_class($this));
+		foreach($aRererencingMe as $sRemoteClass => $aExtKeys)
+		{
+			foreach($aExtKeys as $sExtKeyAttCode => $oExtKeyAttDef)
+			{
+				//$oAttDef = MetaModel::GetAttributeDef($sClass, $sExtKeyAttCode);
+
+				$oSearch = new DBObjectSearch($sRemoteClass);
+				$oSearch->AddCondition($sExtKeyAttCode, $this->GetKey());
+				$oSet = new CMDBObjectSet($oSearch);
+				//if ($oSet->Count() > 0)
+				while ($oDependentObj = $oSet->fetch())
+				{
+					$aDependentObjects[$sRemoteClass][] = $oDependentObj;
+				}
+			}
+		}
+		return $aDependentObjects;
+	}
 }
 
 

+ 14 - 3
core/metamodel.class.php

@@ -317,6 +317,14 @@ abstract class MetaModel
 		$sRootClass = self::GetRootClass($sClass);
 		return (!self::HasFinalClassField($sRootClass));
 	}
+	final static public function IsParentClass($sParentClass, $sChildClass)
+	{
+		self::_check_subclass($sChildClass);
+		self::_check_subclass($sParentClass);
+		if (in_array($sParentClass, self::$m_aParentClasses[$sChildClass])) return true;
+		if ($sChildClass == $sParentClass) return true;
+		return false;
+	}
 	final static public function IsSameFamilyBranch($sClassA, $sClassB)
 	{
 		self::_check_subclass($sClassA);	
@@ -2703,7 +2711,10 @@ abstract class MetaModel
 	{
 		self::_check_subclass($sClass);	
 
-		$aLinksClasses = self::EnumLinksClasses();
+		if ($bSkipLinkingClasses)
+		{
+			$aLinksClasses = self::EnumLinksClasses();
+		}
 
 		// 1-N links (referencing my class), array of sClass => array of sAttcode
 		$aResult = array();
@@ -2715,11 +2726,11 @@ abstract class MetaModel
 			foreach ($aClassAttributes as $sAttCode=>$oAttDef)
 			{
 				if (self::$m_aAttribOrigins[$sSomeClass][$sAttCode] != $sSomeClass) continue;
-				if ($oAttDef->IsExternalKey() && ($oAttDef->GetTargetClass() == $sClass))
+				if ($oAttDef->IsExternalKey() && (self::IsParentClass($oAttDef->GetTargetClass(), $sClass)))
 				{
 					if ($bInnerJoinsOnly && $oAttDef->IsNullAllowed()) continue;
 					// Ok, I want this one
-					$aExtKeys[] = $sAttCode;
+					$aExtKeys[$sAttCode] = $oAttDef;
 				}
 			}
 			if (count($aExtKeys) != 0)

+ 5 - 21
pages/UI.php

@@ -504,30 +504,14 @@ switch($operation)
 	}
 	else
 	{
-		// Evaluate the consequences onto the DB integrity
+		$aDependentObjects = $oObj->GetReferencingObjects();
+		// Ask for a confirmation, or cancel (back to the object details)
 		//
-		$aDependentObjects = array();
 		$iTotalThreat = 0;
-		$aRererencingMe = MetaModel::EnumReferencingClasses($sClass, false /*include N-N links*/, true /*inner joins*/);
-		foreach($aRererencingMe as $sRemoteClass => $aExtKeys)
+		foreach ($aDependentObjects as $sRemoteClass => $aPotentialDeletes)
 		{
-			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++;
-				}
-			}
+			$iTotalThreat += count($aPotentialDeletes);
 		}
-		// 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");
@@ -550,7 +534,7 @@ switch($operation)
 		}
 		else
 		{
-			$oP->p("Please confirm that you want to delete this object");
+			$oP->p("Please confirm that you want to delete ".$oObj->GetHyperLink());
 			$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");

+ 1 - 1
pages/advanced_search.php

@@ -117,7 +117,7 @@ function Page2_ConfigFilters($oPage, $oFilter)
 	//
 	foreach (MetaModel::EnumReferencingClasses($sClass, true) as $sRemoteClass => $aRemoteKeys)
 	{
-		foreach ($aRemoteKeys as $sExtKeyAttCode)
+		foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef)
 		{
 			// Set its current values
 			$oSubFilter = $oFilter->GetCriteria_ReferencedBy($sRemoteClass, $sExtKeyAttCode);

+ 2 - 2
pages/schema.php

@@ -59,7 +59,7 @@ function DisplayReferencingClasses($oPage, $sClass)
 		$oPage->add("<ul>\n");
 		foreach ($aRefs as $sRemoteClass => $aRemoteKeys)
 		{
-			foreach ($aRemoteKeys as $sExtKeyAttCode)
+			foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef)
 			{
 				$oPage->add("<li>".MakeClassHLink($sRemoteClass)." by <em>$sExtKeyAttCode</em></li>\n");
 			}
@@ -117,7 +117,7 @@ function DisplayRelatedClassesBestInClass($oPage, $sClass, $iLevels = 20, &$aVis
 	}
 	foreach (MetaModel::EnumReferencingClasses($sClass) as $sRemoteClass => $aRemoteKeys)
 	{
-		foreach ($aRemoteKeys as $sExtKeyAttCode)
+		foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef)
 		{
 			$sVisited = (array_key_exists($sRemoteClass, $aVisitedClasses)) ? " ..." : "";
 			$oPage->add("<li>$sClass| &lt;=".MakeClassHLink($sRemoteClass)."::<em>$sExtKeyAttCode</em>$sVisited</li>\n");