diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index 2e62f4d6c..ca7b35523 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -1435,17 +1435,21 @@ class MenuBlock extends DisplayBlock if ((count($aStates) > 0) && (($iLimit == 0) || ($oSet->Count() < $iLimit))) { // Life cycle actions may be available... if all objects are in the same state - $oSet->Rewind(); - $aStates = array(); - while($oObj = $oSet->Fetch()) + // + // Group by + $oGroupByExp = new FieldExpression(MetaModel::GetStateAttributeCode($sClass), $this->m_oFilter->GetClassAlias()); + $aGroupBy = array('__state__' => $oGroupByExp); + $aQueryParams = array(); + if (isset($aExtraParams['query_params'])) { - $aStates[$oObj->GetState()] = $oObj->GetState(); + $aQueryParams = $aExtraParams['query_params']; } - $oSet->Rewind(); - if (count($aStates) == 1) + $sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy); + $aRes = CMDBSource::QueryToArray($sSql); + if (count($aRes) == 1) { // All objects are in the same state... - $sState = array_pop($aStates); + $sState = $aRes[0]['__state__']; $aTransitions = Metamodel::EnumTransitions($sClass, $sState); if (count($aTransitions)) { @@ -1453,8 +1457,11 @@ class MenuBlock extends DisplayBlock $aStimuli = Metamodel::EnumStimuli($sClass); foreach($aTransitions as $sStimulusCode => $aTransitionDef) { - $oChecker = new StimulusChecker($this->m_oFilter, $sState, $sStimulusCode); - $iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? $oChecker->IsAllowed() : UR_ALLOWED_NO; + $oSet->Rewind(); + // As soon as the user rights implementation will browse the object set, + // then we might consider using OptimizeColumnLoad() here + $iActionAllowed = UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSet); + $iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? $iActionAllowed : UR_ALLOWED_NO; switch($iActionAllowed) { case UR_ALLOWED_YES: