tag that can be rendered synchronously * or as a piece of Javascript/JQuery/Ajax that will get its content from another page (ajax.render.php). * The list of cmdbObjects to be displayed into the block is defined by a filter * Right now the type of display is either: list, count, bare_details, details, csv, modify or search * - list produces a table listing the objects * - count produces a paragraphs with a sentence saying 'cont' objects found * - bare_details displays just the details of the attributes of the object (best if only one) * - details display the full details of each object found using its template (best if only one) * - csv displays a textarea with the CSV export of the list of objects * - modify displays the form to modify an object (best if only one) * - search displays a search form with the criteria of the filter set */ class DisplayBlock { const TAG_BLOCK = 'itopblock'; protected $m_oFilter; protected $m_sStyle; protected $m_bAsynchronous; protected $m_aParams; protected $m_oSet; public function __construct(DBObjectSearch $oFilter, $sStyle = 'list', $bAsynchronous = false, $aParams = array(), $oSet = null) { $this->m_oFilter = $oFilter; $this->m_sStyle = $sStyle; $this->m_bAsynchronous = $bAsynchronous; $this->m_aParams = $aParams; $this->m_oSet = $oSet; } /** * Constructs a DisplayBlock object from a DBObjectSet already in memory * @param $oSet DBObjectSet * @return DisplayBlock The DisplayBlock object, or null if the creation failed */ public static function FromObjectSet(DBObjectSet $oSet, $sStyle, $aParams = array()) { $oDummyFilter = new DBObjectSearch($oSet->GetClass()); $oBlock = new DisplayBlock($oDummyFilter, $sStyle, false, $aParams, $oSet); // DisplayBlocks built this way are synchronous return $oBlock; } /** * Constructs a DisplayBlock object from an XML template * @param $sTemplate string The XML template * @return DisplayBlock The DisplayBlock object, or null if the template is invalid */ public static function FromTemplate($sTemplate) { $iStartPos = stripos($sTemplate, '<'.self::TAG_BLOCK.' ',0); $iEndPos = stripos($sTemplate, '', $iStartPos); $iEndTag = stripos($sTemplate, '>', $iStartPos); $aParams = array(); if (($iStartPos === false) || ($iEndPos === false)) return null; // invalid template $sITopBlock = substr($sTemplate,$iStartPos, $iEndPos-$iStartPos+strlen('')); $sITopData = substr($sTemplate, 1+$iEndTag, $iEndPos - $iEndTag - 1); $sITopTag = substr($sTemplate, $iStartPos + strlen('<'.self::TAG_BLOCK), $iEndTag - $iStartPos - strlen('<'.self::TAG_BLOCK)); $aMatches = array(); $sBlockClass = "DisplayBlock"; $bAsynchronous = false; $sBlockType = 'list'; $sEncoding = 'text/serialize'; if (preg_match('/ type="(.*)"/U',$sITopTag, $aMatches)) { $sBlockType = strtolower($aMatches[1]); } if (preg_match('/ asynchronous="(.*)"/U',$sITopTag, $aMatches)) { $bAsynchronous = (strtolower($aMatches[1]) == 'true'); } if (preg_match('/ blockclass="(.*)"/U',$sITopTag, $aMatches)) { $sBlockClass = $aMatches[1]; } if (preg_match('/ objectclass="(.*)"/U',$sITopTag, $aMatches)) { $sObjectClass = $aMatches[1]; } if (preg_match('/ encoding="(.*)"/U',$sITopTag, $aMatches)) { $sEncoding = strtolower($aMatches[1]); } if (preg_match('/ link_attr="(.*)"/U',$sITopTag, $aMatches)) { // The list to display is a list of links to the specified object $aParams['link_attr'] = $aMatches[1]; // Name of the Ext. Key that makes this linkage } if (preg_match('/ target_attr="(.*)"/U',$sITopTag, $aMatches)) { // The list to display is a list of links to the specified object $aParams['target_attr'] = $aMatches[1]; // Name of the Ext. Key that make this linkage } if (preg_match('/ object_id="(.*)"/U',$sITopTag, $aMatches)) { // The list to display is a list of links to the specified object $aParams['object_id'] = $aMatches[1]; // Id of the object to be linked to } // Parameters contains a list of extra parameters for the block // the syntax is param_name1:value1;param_name2:value2;... if (preg_match('/ parameters="(.*)"/U',$sITopTag, $aMatches)) { $sParameters = $aMatches[1]; $aPairs = explode(';', $sParameters); foreach($aPairs as $sPair) { if (preg_match('/(.*)\:(.*)/',$sPair, $aMatches)) { $aParams[trim($aMatches[1])] = trim($aMatches[2]); } } } if (!empty($aParams['link_attr'])) { // Check that all mandatory parameters are present: if(empty($aParams['object_id'])) { // if 'links' mode is requested the d of the object to link to must be specified throw new ApplicationException("Parameter object_id is mandatory when link_attr is specified. Check the definition of the display template."); } if(empty($aParams['target_attr'])) { // if 'links' mode is requested the id of the object to link to must be specified throw new ApplicationException("Parameter target_attr is mandatory when link_attr is specified. Check the definition of the display template."); } } switch($sEncoding) { case 'text/serialize': $oFilter = CMDBSearchFilter::unserialize($sITopData); break; case 'text/sibusql': $oFilter = CMDBSearchFilter::FromSibusQL($sITopData); break; case 'text/oql': $oFilter = CMDBSearchFilter::FromOQL($sITopData); break; } return new $sBlockClass($oFilter, $sBlockType, $bAsynchronous, $aParams); } public function Display(web_page $oPage, $sId, $aExtraParams = array()) { $oPage->add($this->GetDisplay($oPage, $sId, $aExtraParams)); /* $aExtraParams = array_merge($aExtraParams, $this->m_aParams); $aExtraParams['block_id'] = $sId; if (!$this->m_bAsynchronous) { // render now $oPage->add("
\n"); $this->RenderContent($oPage, $aExtraParams); $oPage->add("
\n"); } else { // render it as an Ajax (asynchronous) call $sFilter = $this->m_oFilter->serialize(); $oPage->add("
\n"); $oPage->p(" Loading..."); $oPage->add("
\n"); $oPage->add(' '); // TO DO: add support for $aExtraParams in asynchronous/Ajax mode } */ } public function GetDisplay(web_page $oPage, $sId, $aExtraParams = array()) { $sHtml = ''; $aExtraParams = array_merge($aExtraParams, $this->m_aParams); $aExtraParams['block_id'] = $sId; if (!$this->m_bAsynchronous) { // render now $sHtml .= "
\n"; $sHtml .= $this->GetRenderContent($oPage, $aExtraParams); $sHtml .= "
\n"; } else { // render it as an Ajax (asynchronous) call $sFilter = $this->m_oFilter->serialize(); $sExtraParams = addslashes(str_replace('"', "'", json_encode($aExtraParams))); // JSON encode, change the style of the quotes and escape them $sHtml .= "
\n"; $sHtml .= $oPage->GetP(" Loading..."); $sHtml .= "
\n"; $sHtml .= ' '; // TO DO: add support for $aExtraParams in asynchronous/Ajax mode } return $sHtml; } public function RenderContent(web_page $oPage, $aExtraParams = array()) { $oPage->add($this->GetRenderContent($oPage, $aExtraParams)); } public function GetRenderContent(web_page $oPage, $aExtraParams = array()) { $sHtml = ''; // Add the extra params into the filter if they make sense for such a filter $bDoSearch = utils::ReadParam('dosearch', false); if ($this->m_oSet == null) { if ($this->m_sStyle != 'links') { $aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($this->m_oFilter->GetClass())); foreach($aFilterCodes as $sFilterCode) { $sExternalFilterValue = utils::ReadParam($sFilterCode, ''); if (isset($aExtraParams[$sFilterCode])) { $this->m_oFilter->AddCondition($sFilterCode, $aExtraParams[$sFilterCode]); // Use the default 'loose' operator } else if ($bDoSearch && $sExternalFilterValue != "") { $this->m_oFilter->AddCondition($sFilterCode, $sExternalFilterValue); // Use the default 'loose' operator } } } $this->m_oSet = new CMDBObjectSet($this->m_oFilter); } switch($this->m_sStyle) { case 'count': if (isset($aExtraParams['group_by'])) { $sGroupByField = $aExtraParams['group_by']; $aGroupBy = array(); while($oObj = $this->m_oSet->Fetch()) { $sValue = $oObj->Get($sGroupByField); $aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1; } $sFilter = urlencode($this->m_oFilter->serialize()); $aData = array(); $oAppContext = new ApplicationContext(); $sParams = $oAppContext->GetForLink(); foreach($aGroupBy as $sValue => $iCount) { $aData[] = array ( 'group' => $sValue, 'value' => "$iCount"); // TO DO: add the context information } $sHtml .= $oPage->GetTable(array('group' => array('label' => MetaModel::GetLabel($this->m_oFilter->GetClass(), $sGroupByField), 'description' => ''), 'value' => array('label'=>'Count', 'description' => 'Number of elements')), $aData); } else { // Simply count the number of elements in the set $iCount = $oSet->Count(); $sHtml .= $oPage->GetP("$iCount objects matching the criteria."); } break; case 'list': if ( ($this->m_oSet->Count()> 0) && (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) ) { $sHtml .= cmdbAbstractObject::GetDisplaySet($oPage, $this->m_oSet, $aExtraParams); } else { $sHtml .= $oPage->GetP("No object to display."); $sClass = $this->m_oFilter->GetClass(); $bDisplayMenu = isset($this->m_aParams['menu']) ? $this->m_aParams['menu'] == true : true; if ($bDisplayMenu) { if (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY) == UR_ALLOWED_YES) { $oAppContext = new ApplicationContext(); $sParams = $oAppContext->GetForLink(); // 1:n links, populate the target object as a default value when creating a new linked object if (isset($aExtraParams['target_attr'])) { $aExtraParams['default'][$aExtraParams['target_attr']] = $aExtraParams['object_id']; } $sDefault = ''; if (!empty($aExtraParams['default'])) { foreach($aExtraParams['default'] as $sKey => $sValue) { $sDefault.= "&default[$sKey]=$sValue"; } } $sHtml .= $oPage->GetP("Click here to create a new ".Metamodel::GetName($sClass)."\n"); } } } break; case 'links': //$bDashboardMode = isset($aExtraParams['dashboard']) ? ($aExtraParams['dashboard'] == 'true') : false; //$bSelectMode = isset($aExtraParams['select']) ? ($aExtraParams['select'] == 'true') : false; if ( ($this->m_oSet->Count()> 0) && (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) ) { //$sLinkage = isset($aExtraParams['linkage']) ? $aExtraParams['linkage'] : ''; $sHtml .= cmdbAbstractObject::GetDisplaySet($oPage, $this->m_oSet, $aExtraParams); } else { $sClass = $this->m_oFilter->GetClass(); $oAttDef = MetaModel::GetAttributeDef($sClass, $this->m_aParams['target_attr']); $sTargetClass = $oAttDef->GetTargetClass(); $sHtml .= $oPage->GetP("No ".MetaModel::GetName($sTargetClass)." to display."); $bDisplayMenu = isset($this->m_aParams['menu']) ? $this->m_aParams['menu'] == true : true; if ($bDisplayMenu) { if (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY) == UR_ALLOWED_YES) { $oAppContext = new ApplicationContext(); $sParams = $oAppContext->GetForLink(); $sHtml .= $oPage->GetP("Click here to add new ".Metamodel::GetName($sTargetClass)."s\n"); } } } break; case 'details': if (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) { while($oObj = $this->m_oSet->Fetch()) { $sHtml .= $oObj->GetDetails($oPage); // Still used ??? } } break; case 'bare_details': if (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) { while($oObj = $this->m_oSet->Fetch()) { $sHtml .= $oObj->GetBareDetails($oPage); } } break; case 'csv': if (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES) { $sHtml .= "\n"; } break; case 'modify': if (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_MODIFY, $this->m_oSet) == UR_ALLOWED_YES) { while($oObj = $this->m_oSet->Fetch()) { $sHtml .= $oObj->GetModifyForm($oPage); } } break; case 'search': $iSearchSectionId = 1; $sStyle = (isset($aExtraParams['open']) && ($aExtraParams['open'] == 'true')) ? 'SearchDrawer' : 'SearchDrawer DrawerClosed'; $sHtml .= "
\n"; $oPage->add_ready_script("\$(\"#LnkSearch_$iSearchSectionId\").click(function() {\$(\"#Search_$iSearchSectionId\").slideToggle('normal'); $(\"#LnkSearch_$iSearchSectionId\").toggleClass('open');});"); $sHtml .= cmdbAbstractObject::GetSearchForm($oPage, $this->m_oSet, $aExtraParams); $sHtml .= "
\n"; $sHtml .= "
\n"; $sHtml .= "
Search
\n"; break; case 'pie_chart': $sGroupBy = isset($aExtraParams['group_by']) ? $aExtraParams['group_by'] : ''; $sFilter = $this->m_oFilter->ToOQL(); $sHtml .= " "; break; case 'pie_chart_ajax': if (isset($aExtraParams['group_by'])) { $sGroupByField = $aExtraParams['group_by']; $aGroupBy = array(); while($oObj = $this->m_oSet->Fetch()) { $sValue = $oObj->Get($sGroupByField); $aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1; } $sFilter = urlencode($this->m_oFilter->serialize()); $aData = array(); $sHtml .= "\n"; $sHtml .= "3d pie\n"; $sHtml .= "\n"; $sHtml .= "\n"; $sHtml .= "\n"; foreach($aGroupBy as $sValue => $void) { $sHtml .= "$sValue\n"; } $sHtml .= "\n"; $sHtml .= "\n"; $sHtml .= "\n"; foreach($aGroupBy as $void => $iCount) { $sHtml .= "$iCount\n"; } $sHtml .= "\n"; $sHtml .= "\n"; $sHtml .= " ||||||||||||||||||||||||||||||||||||||||||||||| ddaa41 88dd11 4e62dd ff8811 4d4d4d 5a4b6e 1188ff "; $sHtml .= "\n"; } else { // Simply count the number of elements in the set $iCount = $oSet->Count(); $sHtml .= "\n\n"; } break; case 'open_flash_chart': static $iChartCounter = 0; $sChartType = isset($aExtraParams['chart_type']) ? $aExtraParams['chart_type'] : 'pie'; $sTitle = isset($aExtraParams['chart_title']) ? $aExtraParams['chart_title'] : ''; $sGroupBy = isset($aExtraParams['group_by']) ? $aExtraParams['group_by'] : ''; $sFilter = $this->m_oFilter->ToOQL(); $sHtml .= "\n"; $sHtml .= "
If the chart does not display, install Flash
\n"; $iChartCounter++; break; case 'open_flash_chart_ajax': include './php-ofc-library/open-flash-chart.php'; $sChartType = isset($aExtraParams['chart_type']) ? $aExtraParams['chart_type'] : 'pie'; $oChart = new open_flash_chart(); switch($sChartType) { case 'bars': $oChartElement = new bar_glass(); if (isset($aExtraParams['group_by'])) { $sGroupByField = $aExtraParams['group_by']; $aGroupBy = array(); while($oObj = $this->m_oSet->Fetch()) { $sValue = $oObj->Get($sGroupByField); $aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1; } $sFilter = urlencode($this->m_oFilter->serialize()); $aData = array(); $aLabels = array(); foreach($aGroupBy as $sValue => $iValue) { $aData[] = $iValue; $aLabels[] = $sValue; } $maxValue = max($aData); $oYAxis = new y_axis(); $aMagicValues = array(1,2,5,10); $iMultiplier = 1; $index = 0; $iTop = $aMagicValues[$index % count($aMagicValues)]*$iMultiplier; while($maxValue > $iTop) { $index++; $iTop = $aMagicValues[$index % count($aMagicValues)]*$iMultiplier; if (($index % count($aMagicValues)) == 0) { $iMultiplier = $iMultiplier * 10; } } //echo "oYAxis->set_range(0, $iTop, $iMultiplier);\n"; $oYAxis->set_range(0, $iTop, $iMultiplier); $oChart->set_y_axis( $oYAxis ); $oChartElement->set_values( $aData ); $oXAxis = new x_axis(); $oXLabels = new x_axis_labels(); // set them vertical $oXLabels->set_vertical(); // set the label text $oXLabels->set_labels($aLabels); // Add the X Axis Labels to the X Axis $oXAxis->set_labels( $oXLabels ); $oChart->set_x_axis( $oXAxis ); } break; case 'pie': default: $oChartElement = new pie(); $oChartElement->set_start_angle( 35 ); $oChartElement->set_animate( true ); $oChartElement->set_tooltip( '#label# - #val# (#percent#)' ); if (isset($aExtraParams['group_by'])) { $sGroupByField = $aExtraParams['group_by']; $aGroupBy = array(); while($oObj = $this->m_oSet->Fetch()) { $sValue = $oObj->Get($sGroupByField); $aGroupBy[$sValue] = isset($aGroupBy[$sValue]) ? $aGroupBy[$sValue]+1 : 1; } $sFilter = urlencode($this->m_oFilter->serialize()); $aData = array(); foreach($aGroupBy as $sValue => $iValue) { $aData[] = new pie_value($iValue, $sValue); } $oChartElement->set_values( $aData ); $oChart->x_axis = null; } } if (isset($aExtraParams['chart_title'])) //@@ BUG: not passed via ajax !!! { $oTitle = new title( $aExtraParams['chart_title'] ); $oChart->set_title( $oTitle ); } $oChart->set_bg_colour('#FFFFFF'); $oChart->add_element( $oChartElement ); $sHtml = $oChart->toPrettyString(); break; default: // Unsupported style, do nothing. $sHtml .= "Error: unsupported style of block: ".$this->m_sStyle; } return $sHtml; } } /** * Helper class to manage 'blocks' of HTML pieces that are parts of a page and contain some list of cmdb objects * * Each block is actually rendered as a
tag that can be rendered synchronously * or as a piece of Javascript/JQuery/Ajax that will get its content from another page (ajax.render.php). * The list of cmdbObjects to be displayed into the block is defined by a filter * Right now the type of display is either: list, count or details * - list produces a table listing the objects * - count produces a paragraphs with a sentence saying 'cont' objects found * - details display (as table) the details of each object found (best if only one) */ class HistoryBlock extends DisplayBlock { public function GetRenderContent(web_page $oPage, $aExtraParams = array()) { $sHtml = ''; // Add the extra params into the filter if they make sense for such a filter $aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($this->m_oFilter->GetClass())); foreach($aFilterCodes as $sFilterCode) { if (isset($aExtraParams[$sFilterCode])) { $this->m_oFilter->AddCondition($sFilterCode, $aExtraParams[$sFilterCode]); // Use the default 'loose' operator } } $oSet = new CMDBObjectSet($this->m_oFilter, array('date'=>false)); $sHtml .= "\n"; switch($this->m_sStyle) { case 'toggle': // First the latest change that the user is allowed to see do { $oLatestChangeOp = $oSet->Fetch(); } while(is_object($oLatestChangeOp) && ($oLatestChangeOp->GetDescription() == '')); if (is_object($oLatestChangeOp)) { global $oContext; // User Context.. should be statis instead of global... // There is one change in the list... only when the object has been created ! $sDate = $oLatestChangeOp->GetAsHTML('date'); $oChange = $oContext->GetObject('CMDBChange', $oLatestChangeOp->Get('change')); $sUserInfo = $oChange->GetAsHTML('userinfo'); $oSet->Rewind(); // Reset the pointer to the beginning of the set $sHtml .= $oPage->GetStartCollapsibleSection("Last modified on $sDate by $sUserInfo."); //$sHtml .= cmdbAbstractObject::GetDisplaySet($oPage, $oSet); $aChanges = array(); while($oChangeOp = $oSet->Fetch()) { $sChangeDescription = $oChangeOp->GetDescription(); if ($sChangeDescription != '') { // The change is visible for the current user $changeId = $oChangeOp->Get('change'); $aChanges[$changeId]['date'] = $oChangeOp->Get('date'); $aChanges[$changeId]['userinfo'] = $oChangeOp->Get('userinfo'); if (!isset($aChanges[$changeId]['log'])) { $aChanges[$changeId]['log'] = array(); } $aChanges[$changeId]['log'][] = $sChangeDescription; } } $aAttribs = array('date' => array('label' => 'Date', 'description' => 'Date of the change'), 'userinfo' => array('label' => 'User', 'description' => 'User who made the change'), 'log' => array('label' => 'Changes', 'description' => 'Changes made to the object'), ); $aValues = array(); foreach($aChanges as $aChange) { $aValues[] = array('date' => $aChange['date'], 'userinfo' => $aChange['userinfo'], 'log' => ""); } $sHtml .= $oPage->GetTable($aAttribs, $aValues); $sHtml .= $oPage->GetEndCollapsibleSection(); } break; default: $sHtml .= parent::GetRenderContent($oPage, $aExtraParams); } return $sHtml; } } class MenuBlock extends DisplayBlock { public function GetRenderContent(web_page $oPage, $aExtraParams = array()) { $sHtml = ''; $oAppContext = new ApplicationContext(); $sContext = $oAppContext->GetForLink(); $sClass = $this->m_oFilter->GetClass(); $oSet = new CMDBObjectSet($this->m_oFilter); $sFilter = $this->m_oFilter->serialize(); $aActions = array(); $sUIPage = cmdbAbstractObject::ComputeUIPage($sClass); // 1:n links, populate the target object as a default value when creating a new linked object if (isset($aExtraParams['target_attr'])) { $aExtraParams['default'][$aExtraParams['target_attr']] = $aExtraParams['object_id']; } $sDefault = ''; if (!empty($aExtraParams['default'])) { foreach($aExtraParams['default'] as $sKey => $sValue) { $sDefault.= "&default[$sKey]=$sValue"; } } switch($oSet->Count()) { case 0: // No object in the set, the only possible action is "new" $bIsModifyAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY); if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'New', 'url' => "../page/$sUIPage?operation=new&class=$sClass&$sContext{$sDefault}"); } break; case 1: $oObj = $oSet->Fetch(); $id = $oObj->GetKey(); $bIsModifyAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY, $oSet); $bIsDeleteAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_DELETE, $oSet); $bIsBulkModifyAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_BULK_MODIFY, $oSet); $bIsBulkDeleteAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_BULK_DELETE, $oSet); // Just one object in the set, possible actions are "new / clone / modify and delete" if (isset($aExtraParams['link_attr'])) { $id = $aExtraParams['object_id']; $sTargetAttr = $aExtraParams['target_attr']; $oAttDef = MetaModel::GetAttributeDef($sClass, $sTargetAttr); $sTargetClass = $oAttDef->GetTargetClass(); if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'Add...', 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&addObjects=true&$sContext"); } if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'Manage...', 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&sContext"); } //if ($bIsDeleteAllowed) { $aActions[] = array ('label' => 'Remove All', 'url' => "#"); } } else { $sUrl = self::GetAbsoluteUrl(); $aActions[] = array ('label' => 'eMail', 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("$sUrl?operation=search&filter=$sFilter&$sContext")); $aActions[] = array ('label' => 'CSV Export', 'url' => "../pages/$sUIPage?operation=search&filter=$sFilter&format=csv&$sContext"); //$aActions[] = array ('label' => 'Bookmark...', 'url' => "../pages/ajax.render.php?operation=create&class=$sClass&filter=$sFilter", 'class' => 'jqmTrigger'); if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'New...', 'url' => "../pages/$sUIPage?operation=new&class=$sClass&$sContext{$sDefault}"); } //if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'Clone...', 'url' => "../pages/$sUIPage?operation=clone&class=$sClass&id=$id&$sContext"); } if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'Modify...', 'url' => "../pages/$sUIPage?operation=modify&class=$sClass&id=$id&$sContext"); } if ($bIsDeleteAllowed) { $aActions[] = array ('label' => 'Delete...', 'url' => "../pages/$sUIPage?operation=delete&class=$sClass&id=$id&$sContext"); } } $aTransitions = $oObj->EnumTransitions(); $aStimuli = Metamodel::EnumStimuli($sClass); foreach($aTransitions as $sStimulusCode => $aTransitionDef) { $iActionAllowed = UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSet); switch($iActionAllowed) { case UR_ALLOWED_YES: $aActions[] = array('label' => $aStimuli[$sStimulusCode]->Get('label'), 'url' => "../pages/UI.php?operation=stimulus&stimulus=$sStimulusCode&class=$sClass&id=$id&$sContext"); break; case UR_ALLOWED_DEPENDS: $aActions[] = array('label' => $aStimuli[$sStimulusCode]->Get('label').' (*)', 'url' => "../pages/UI.php?operation=stimulus&stimulus=$sStimulusCode&class=$sClass&id=$id&$sContext"); break; default: // Do nothing } } //print_r($aTransitions); break; default: // Check rights // New / Modify $bIsModifyAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY, $oSet); $bIsBulkModifyAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_BULK_MODIFY, $oSet); $bIsBulkDeleteAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_BULK_DELETE, $oSet); if (isset($aExtraParams['link_attr'])) { $id = $aExtraParams['object_id']; $sTargetAttr = $aExtraParams['target_attr']; $oAttDef = MetaModel::GetAttributeDef($sClass, $sTargetAttr); $sTargetClass = $oAttDef->GetTargetClass(); $bIsDeleteAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_DELETE, $oSet); if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'Add...', 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&addObjects=true&$sContext"); } //if ($bIsBulkModifyAllowed) { $aActions[] = array ('label' => 'Add...', 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&linkage=".$aExtraParams['linkage']."&id=$id&addObjects=true&$sContext"); } if ($bIsBulkModifyAllowed) { $aActions[] = array ('label' => 'Manage...', 'url' => "../pages/$sUIPage?operation=modify_links&class=$sClass&link_attr=".$aExtraParams['link_attr']."&target_class=$sTargetClass&id=$id&sContext"); } //if ($bIsBulkDeleteAllowed) { $aActions[] = array ('label' => 'Remove All...', 'url' => "#"); } } else { // many objects in the set, possible actions are: new / modify all / delete all $sUrl = self::GetAbsoluteUrl(); $aActions[] = array ('label' => 'eMail', 'url' => "mailto:?subject=".$oSet->GetFilter()->__DescribeHTML()."&body=".urlencode("$sUrl?operation=search&filter=$sFilter&$sContext")); $aActions[] = array ('label' => 'CSV Export', 'url' => "../pages/$sUIPage?operation=search&filter=$sFilter&format=csv&$sContext"); //$aActions[] = array ('label' => 'Bookmark...', 'url' => "../pages/ajax.render.php?operation=create&class=$sClass&filter=$sFilter", 'class' => 'jqmTrigger'); if ($bIsModifyAllowed) { $aActions[] = array ('label' => 'New...', 'url' => "../pages/$sUIPage?operation=new&class=$sClass&$sContext{$sDefault}"); } //if ($bIsBulkModifyAllowed) { $aActions[] = array ('label' => 'Modify All...', 'url' => "../pages/$sUIPage?operation=modify_all&filter=$sFilter&$sContext"); } //if ($bIsBulkDeleteAllowed) { $aActions[] = array ('label' => 'Delete All...', 'url' => "../pages/$sUIPage?operation=delete_all&filter=$sFilter&$sContext"); } } } $sHtml .= "
\n"; $oPage->add_ready_script("$(\"ul.jd_menu\").jdMenu();\n"); return $sHtml; } static public function GetAbsoluteUrl() { // Build an absolute URL to this page on this server/port $sServerName = $_SERVER['SERVER_NAME']; $sProtocol = isset($_SERVER['HTTPS']) ? 'https' : 'http'; if ($sProtocol == 'http') { $sPort = ($_SERVER['SERVER_PORT'] == 80) ? '' : ':'.$_SERVER['SERVER_PORT']; } else { $sPort = ($_SERVER['SERVER_PORT'] == 443) ? '' : ':'.$_SERVER['SERVER_PORT']; } // $_SERVER['REQUEST_URI'] is empty when running on IIS // Let's use Ivan Tcholakov's fix (found on www.dokeos.com) if (!empty($_SERVER['REQUEST_URI'])) { $sPath = $_SERVER['REQUEST_URI']; } else { $sPath = $_SERVER['SCRIPT_NAME']; if (!empty($_SERVER['QUERY_STRING'])) { $sPath .= '?'.$_SERVER['QUERY_STRING']; } $_SERVER['REQUEST_URI'] = $sPath; } $sPath = $_SERVER['REQUEST_URI']; $sUrl = "$sProtocol://{$sServerName}{$sPort}{$sPath}"; return $sUrl; } } ?>