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

SVN:trunk[146]
This commit is contained in:
Romain Quetiez
2009-09-11 15:44:24 +00:00
parent dc0947f1e7
commit 455d9b23be
2 changed files with 75 additions and 10 deletions

View File

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

View File

@@ -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':