From 637993e7eb5259c2471a5fcfa29fc8da705f9700 Mon Sep 17 00:00:00 2001 From: Romain Quetiez Date: Fri, 18 Sep 2009 09:35:21 +0000 Subject: [PATCH] Fixed bug on deletion: take the inheritance into account when checking for referencing objects (eg. a ticket linked to a PC was not seen) SVN:code[180] --- .../application/ui.linkswidget.class.inc.php | 7 ++++- trunk/core/dbobject.class.php | 23 ++++++++++++++ trunk/core/metamodel.class.php | 17 +++++++++-- trunk/pages/UI.php | 30 +++++-------------- trunk/pages/advanced_search.php | 2 +- trunk/pages/schema.php | 4 +-- 6 files changed, 53 insertions(+), 30 deletions(-) diff --git a/trunk/application/ui.linkswidget.class.inc.php b/trunk/application/ui.linkswidget.class.inc.php index 074207ff2..e95277411 100644 --- a/trunk/application/ui.linkswidget.class.inc.php +++ b/trunk/application/ui.linkswidget.class.inc.php @@ -63,6 +63,11 @@ class UILinksWidget } $sJSON = '['.implode(',', $aCurrentValues).']'; } + else + { +//echo "JSON VA IECH
\n"; + } +//echo "JASON: $sJSON
\n";; // Many values (or even a unknown list) display an autocomplete if ( (count($aAllowedValues) == 0) || (count($aAllowedValues) > 50) ) @@ -269,7 +274,7 @@ EOF; $sHTML = "
\n"; $sHTML .= "
\n"; - $sHTML .= "

$sLinkedClass attributes

\n"; + $sHTML .= "

".MetaModel::GetName($sLinkedClass)." attributes

\n"; $sHTML .= "
\n"; $index = 0; $aAttrsMap = array(); diff --git a/trunk/core/dbobject.class.php b/trunk/core/dbobject.class.php index c74652755..66f0772ad 100644 --- a/trunk/core/dbobject.class.php +++ b/trunk/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; + } } diff --git a/trunk/core/metamodel.class.php b/trunk/core/metamodel.class.php index 6299b46a3..1d5ab7bf9 100644 --- a/trunk/core/metamodel.class.php +++ b/trunk/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) diff --git a/trunk/pages/UI.php b/trunk/pages/UI.php index a1b758aab..c4c3140b9 100644 --- a/trunk/pages/UI.php +++ b/trunk/pages/UI.php @@ -504,30 +504,14 @@ switch($operation) } else { - // 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++; - } - } - } + $aDependentObjects = $oObj->GetReferencingObjects(); // Ask for a confirmation, or cancel (back to the object details) // + $iTotalThreat = 0; + foreach ($aDependentObjects as $sRemoteClass => $aPotentialDeletes) + { + $iTotalThreat += count($aPotentialDeletes); + } 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("\n"); $oP->add("\n"); $oP->add("\n"); diff --git a/trunk/pages/advanced_search.php b/trunk/pages/advanced_search.php index fa29c2c88..80ec35657 100644 --- a/trunk/pages/advanced_search.php +++ b/trunk/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); diff --git a/trunk/pages/schema.php b/trunk/pages/schema.php index e985d1908..9827de69a 100644 --- a/trunk/pages/schema.php +++ b/trunk/pages/schema.php @@ -59,7 +59,7 @@ function DisplayReferencingClasses($oPage, $sClass) $oPage->add("
    \n"); foreach ($aRefs as $sRemoteClass => $aRemoteKeys) { - foreach ($aRemoteKeys as $sExtKeyAttCode) + foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef) { $oPage->add("
  • ".MakeClassHLink($sRemoteClass)." by $sExtKeyAttCode
  • \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("
  • $sClass| <=".MakeClassHLink($sRemoteClass)."::$sExtKeyAttCode$sVisited
  • \n");