Browse Source

#1134 Query returning a "null row": just make sure that the row gets displayed (still surprising... see ticket #1138 to follow up on the suppression of those ghost rows)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@3728 a333f486-631f-4898-b8df-5754b55c2be0
romainq 9 years ago
parent
commit
3cf8632166
1 changed files with 101 additions and 91 deletions
  1. 101 91
      application/displayblock.class.inc.php

+ 101 - 91
application/displayblock.class.inc.php

@@ -1379,7 +1379,7 @@ class MenuBlock extends DisplayBlock
 				$sDefault.= "&default[$sKey]=$sValue";
 			}
 		}
-		$bIsCreationAllowed =  (UserRights::IsActionAllowed($sClass, UR_ACTION_CREATE) == UR_ALLOWED_YES) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
+		$bIsCreationAllowed = (UserRights::IsActionAllowed($sClass, UR_ACTION_CREATE) == UR_ALLOWED_YES) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
 		switch($oSet->Count())
 		{
 			case 0:
@@ -1389,121 +1389,131 @@ class MenuBlock extends DisplayBlock
 			
 			case 1:
 			$oObj = $oSet->Fetch();
-			$id = $oObj->GetKey();
-			$bLocked = false;
-			if (MetaModel::GetConfig()->Get('concurrent_lock_enabled'))
+			if (is_null($oObj))
 			{
-				$aLockInfo = iTopOwnershipLock::IsLocked(get_class($oObj), $id);
-				if ($aLockInfo['locked'])
+				if (!isset($aExtraParams['link_attr']))
 				{
-					$bLocked = true;
-					//$this->AddMenuSeparator($aActions);
-					//$aActions['concurrent_lock_unlock'] = array ('label' => Dict::S('UI:Menu:ReleaseConcurrentLock'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=kill_lock&class=$sClass&id=$id{$sContext}");
+					if ($bIsCreationAllowed) { $aActions['UI:Menu:New'] = array ('label' => Dict::S('UI:Menu:New'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=new&class=$sClass{$sContext}{$sDefault}"); }
 				}
 			}
-			$bRawModifiedAllowed = (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY, $oSet) == UR_ALLOWED_YES) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
-			$bIsModifyAllowed = !$bLocked && $bRawModifiedAllowed;
-			$bIsDeleteAllowed = !$bLocked && UserRights::IsActionAllowed($sClass, UR_ACTION_DELETE, $oSet);
-			// Just one object in the set, possible actions are "new / clone / modify and delete"
-			if (!isset($aExtraParams['link_attr']))
+			else
 			{
-				if ($bIsModifyAllowed) { $aActions['UI:Menu:Modify'] = array ('label' => Dict::S('UI:Menu:Modify'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=modify&class=$sClass&id=$id{$sContext}#"); }
-				if ($bIsCreationAllowed) { $aActions['UI:Menu:New'] = array ('label' => Dict::S('UI:Menu:New'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=new&class=$sClass{$sContext}{$sDefault}"); }
-				if ($bIsDeleteAllowed) { $aActions['UI:Menu:Delete'] = array ('label' => Dict::S('UI:Menu:Delete'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=delete&class=$sClass&id=$id{$sContext}"); }
-				// Transitions / Stimuli
-				if (!$bLocked)
+				$id = $oObj->GetKey();
+				$bLocked = false;
+				if (MetaModel::GetConfig()->Get('concurrent_lock_enabled'))
 				{
-					$aTransitions = $oObj->EnumTransitions();
-					if (count($aTransitions))
+					$aLockInfo = iTopOwnershipLock::IsLocked(get_class($oObj), $id);
+					if ($aLockInfo['locked'])
 					{
-						$this->AddMenuSeparator($aActions);
-						$aStimuli = Metamodel::EnumStimuli(get_class($oObj));
-						foreach($aTransitions as $sStimulusCode => $aTransitionDef)
-						{
-							$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSet) : UR_ALLOWED_NO;
-							switch($iActionAllowed)
-							{
-								case UR_ALLOWED_YES:
-								$aActions[$sStimulusCode] = array('label' => $aStimuli[$sStimulusCode]->GetLabel(), 'url' => "{$sRootUrl}pages/UI.php?operation=stimulus&stimulus=$sStimulusCode&class=$sClass&id=$id{$sContext}");
-								break;
-								
-								default:
-								// Do nothing
-							}
-						}
+						$bLocked = true;
+						//$this->AddMenuSeparator($aActions);
+						//$aActions['concurrent_lock_unlock'] = array ('label' => Dict::S('UI:Menu:ReleaseConcurrentLock'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=kill_lock&class=$sClass&id=$id{$sContext}");
 					}
 				}
-				// Relations...
-				$aRelations = MetaModel::EnumRelationsEx($sClass);
-				if (count($aRelations))
+				$bRawModifiedAllowed = (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY, $oSet) == UR_ALLOWED_YES) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
+				$bIsModifyAllowed = !$bLocked && $bRawModifiedAllowed;
+				$bIsDeleteAllowed = !$bLocked && UserRights::IsActionAllowed($sClass, UR_ACTION_DELETE, $oSet);
+				// Just one object in the set, possible actions are "new / clone / modify and delete"
+				if (!isset($aExtraParams['link_attr']))
 				{
-					$this->AddMenuSeparator($aActions);
-					foreach($aRelations as $sRelationCode => $aRelationInfo)
+					if ($bIsModifyAllowed) { $aActions['UI:Menu:Modify'] = array ('label' => Dict::S('UI:Menu:Modify'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=modify&class=$sClass&id=$id{$sContext}#"); }
+					if ($bIsCreationAllowed) { $aActions['UI:Menu:New'] = array ('label' => Dict::S('UI:Menu:New'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=new&class=$sClass{$sContext}{$sDefault}"); }
+					if ($bIsDeleteAllowed) { $aActions['UI:Menu:Delete'] = array ('label' => Dict::S('UI:Menu:Delete'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=delete&class=$sClass&id=$id{$sContext}"); }
+					// Transitions / Stimuli
+					if (!$bLocked)
 					{
-						if (array_key_exists('down', $aRelationInfo))
-						{
-							$aActions[$sRelationCode.'_down'] = array ('label' => $aRelationInfo['down'], 'url' => "{$sRootUrl}pages/$sUIPage?operation=swf_navigator&relation=$sRelationCode&direction=down&class=$sClass&id=$id{$sContext}");
-						}
-						if (array_key_exists('up', $aRelationInfo))
+						$aTransitions = $oObj->EnumTransitions();
+						if (count($aTransitions))
 						{
-							$aActions[$sRelationCode.'_up'] = array ('label' => $aRelationInfo['up'], 'url' => "{$sRootUrl}pages/$sUIPage?operation=swf_navigator&relation=$sRelationCode&direction=up&class=$sClass&id=$id{$sContext}");
+							$this->AddMenuSeparator($aActions);
+							$aStimuli = Metamodel::EnumStimuli(get_class($oObj));
+							foreach($aTransitions as $sStimulusCode => $aTransitionDef)
+							{
+								$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSet) : UR_ALLOWED_NO;
+								switch($iActionAllowed)
+								{
+									case UR_ALLOWED_YES:
+									$aActions[$sStimulusCode] = array('label' => $aStimuli[$sStimulusCode]->GetLabel(), 'url' => "{$sRootUrl}pages/UI.php?operation=stimulus&stimulus=$sStimulusCode&class=$sClass&id=$id{$sContext}");
+									break;
+									
+									default:
+									// Do nothing
+								}
+							}
 						}
 					}
-				}
-				if ($bLocked && $bRawModifiedAllowed)
-				{
-					// Add a special menu to kill the lock, but only to allowed users who can also modify this object
-					$aAllowedProfiles = MetaModel::GetConfig()->Get('concurrent_lock_override_profiles');
-					$bCanKill = false;
-				
-					$oUser = UserRights::GetUserObject();
-					$aUserProfiles = array();
-					if (!is_null($oUser))
+					// Relations...
+					$aRelations = MetaModel::EnumRelationsEx($sClass);
+					if (count($aRelations))
 					{
-						$oProfileSet = $oUser->Get('profile_list');
-						while ($oProfile = $oProfileSet->Fetch())
+						$this->AddMenuSeparator($aActions);
+						foreach($aRelations as $sRelationCode => $aRelationInfo)
 						{
-							$aUserProfiles[$oProfile->Get('profile')] = true;
+							if (array_key_exists('down', $aRelationInfo))
+							{
+								$aActions[$sRelationCode.'_down'] = array ('label' => $aRelationInfo['down'], 'url' => "{$sRootUrl}pages/$sUIPage?operation=swf_navigator&relation=$sRelationCode&direction=down&class=$sClass&id=$id{$sContext}");
+							}
+							if (array_key_exists('up', $aRelationInfo))
+							{
+								$aActions[$sRelationCode.'_up'] = array ('label' => $aRelationInfo['up'], 'url' => "{$sRootUrl}pages/$sUIPage?operation=swf_navigator&relation=$sRelationCode&direction=up&class=$sClass&id=$id{$sContext}");
+							}
 						}
 					}
-	
-					foreach($aAllowedProfiles as $sProfile)
+					if ($bLocked && $bRawModifiedAllowed)
 					{
-						if (array_key_exists($sProfile, $aUserProfiles))
-						{	
-							$bCanKill = true;
-							break;
+						// Add a special menu to kill the lock, but only to allowed users who can also modify this object
+						$aAllowedProfiles = MetaModel::GetConfig()->Get('concurrent_lock_override_profiles');
+						$bCanKill = false;
+					
+						$oUser = UserRights::GetUserObject();
+						$aUserProfiles = array();
+						if (!is_null($oUser))
+						{
+							$oProfileSet = $oUser->Get('profile_list');
+							while ($oProfile = $oProfileSet->Fetch())
+							{
+								$aUserProfiles[$oProfile->Get('profile')] = true;
+							}
+						}
+		
+						foreach($aAllowedProfiles as $sProfile)
+						{
+							if (array_key_exists($sProfile, $aUserProfiles))
+							{	
+								$bCanKill = true;
+								break;
+							}
+						}
+						
+						if ($bCanKill)
+						{		
+							$this->AddMenuSeparator($aActions);
+							$aActions['concurrent_lock_unlock'] = array ('label' => Dict::S('UI:Menu:KillConcurrentLock'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=kill_lock&class=$sClass&id=$id{$sContext}");
 						}
 					}
-					
-					if ($bCanKill)
-					{		
-						$this->AddMenuSeparator($aActions);
-						$aActions['concurrent_lock_unlock'] = array ('label' => Dict::S('UI:Menu:KillConcurrentLock'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=kill_lock&class=$sClass&id=$id{$sContext}");
+					/*
+					$this->AddMenuSeparator($aActions);
+					// Static menus: Email this page & CSV Export
+					$sUrl = ApplicationContext::MakeObjectUrl($sClass, $id);
+					$aActions['UI:Menu:EMail'] = array ('label' => Dict::S('UI:Menu:EMail'), 'url' => "mailto:?subject=".urlencode($oObj->GetRawName())."&body=".urlencode($sUrl));
+					$aActions['UI:Menu:CSVExport'] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=search&filter=".urlencode($sFilter)."&format=csv{$sContext}");
+					// The style tells us whether the menu is displayed on a list of one object, or on the details of the given object 
+					if ($this->m_sStyle == 'list')
+					{
+						// Actions specific to the list
+						$sOQL = addslashes($sFilterDesc);
+						$aActions['UI:Menu:AddToDashboard'] = array ('label' => Dict::S('UI:Menu:AddToDashboard'), 'url' => "#", 'onclick' => "return DashletCreationDlg('$sOQL')");
 					}
+					*/
 				}
-				/*
 				$this->AddMenuSeparator($aActions);
-				// Static menus: Email this page & CSV Export
-				$sUrl = ApplicationContext::MakeObjectUrl($sClass, $id);
-				$aActions['UI:Menu:EMail'] = array ('label' => Dict::S('UI:Menu:EMail'), 'url' => "mailto:?subject=".urlencode($oObj->GetRawName())."&body=".urlencode($sUrl));
-				$aActions['UI:Menu:CSVExport'] = array ('label' => Dict::S('UI:Menu:CSVExport'), 'url' => "{$sRootUrl}pages/$sUIPage?operation=search&filter=".urlencode($sFilter)."&format=csv{$sContext}");
-				// The style tells us whether the menu is displayed on a list of one object, or on the details of the given object 
-				if ($this->m_sStyle == 'list')
+				foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
 				{
-					// Actions specific to the list
-					$sOQL = addslashes($sFilterDesc);
-					$aActions['UI:Menu:AddToDashboard'] = array ('label' => Dict::S('UI:Menu:AddToDashboard'), 'url' => "#", 'onclick' => "return DashletCreationDlg('$sOQL')");
-				}
-				*/
-			}
-			$this->AddMenuSeparator($aActions);
-			foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
-			{
-				$oSet->Rewind();
-				foreach($oExtensionInstance->EnumAllowedActions($oSet) as $sLabel => $sUrl)
-				{
-					$aActions[$sLabel] = array ('label' => $sLabel, 'url' => $sUrl);
+					$oSet->Rewind();
+					foreach($oExtensionInstance->EnumAllowedActions($oSet) as $sLabel => $sUrl)
+					{
+						$aActions[$sLabel] = array ('label' => $sLabel, 'url' => $sUrl);
+					}
 				}
 			}
 			break;