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:trunk[180]
This commit is contained in:
Romain Quetiez
2009-09-18 09:35:21 +00:00
parent 4ce9d9779a
commit 0454e7fa78
6 changed files with 53 additions and 30 deletions

View File

@@ -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;
}
}

View File

@@ -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)