mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 07:24:13 +01:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
81
pages/UI.php
81
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':
|
||||
|
||||
Reference in New Issue
Block a user