예제 #1
0
/**
 * Helper to generate a Graphviz code for displaying the life cycle of a class
 * @param string $sClass The class to display
 * @return string The Graph description in Graphviz/Dot syntax   
 */
function GraphvizLifecycle($sClass)
{
    $sDotFileContent = "";
    $sStateAttCode = MetaModel::GetStateAttributeCode($sClass);
    if (empty($sStateAttCode)) {
        //$oPage->p("no lifecycle for this class");
    } else {
        $aStates = MetaModel::EnumStates($sClass);
        $aStimuli = MetaModel::EnumStimuli($sClass);
        $sDotFileContent .= "digraph finite_state_machine {\r\n\tgraph [bgcolor = \"transparent\"];\r\n\trankdir=LR;\r\n\tsize=\"12,12\"\r\n\tnode [ fontname=Verdana style=filled fillcolor=\"#ffffff\" ];\r\n\tedge [ fontname=Verdana ];\r\n";
        $aStatesLinks = array();
        foreach ($aStates as $sStateCode => $aStateDef) {
            $aStatesLinks[$sStateCode] = array('in' => 0, 'out' => 0);
        }
        foreach ($aStates as $sStateCode => $aStateDef) {
            $sStateLabel = MetaModel::GetStateLabel($sClass, $sStateCode);
            $sStateDescription = MetaModel::GetStateDescription($sClass, $sStateCode);
            foreach (MetaModel::EnumTransitions($sClass, $sStateCode) as $sStimulusCode => $aTransitionDef) {
                $aStatesLinks[$sStateCode]['out']++;
                $aStatesLinks[$aTransitionDef['target_state']]['in']++;
                $sStimulusLabel = $aStimuli[$sStimulusCode]->GetLabel();
                $sTargetStateLabel = MetaModel::GetStateLabel($sClass, $aTransitionDef['target_state']);
                $sDotFileContent .= "\t{$sStateCode} -> {$aTransitionDef['target_state']} [ label=\"" . GraphvizEscape($sStimulusLabel) . "\"];\n";
            }
        }
        foreach ($aStates as $sStateCode => $aStateDef) {
            if ($aStatesLinks[$sStateCode]['out'] > 0 || $aStatesLinks[$sStateCode]['in'] > 0) {
                // Show only reachable states
                $sStateLabel = str_replace(' ', '\\n', MetaModel::GetStateLabel($sClass, $sStateCode));
                if ($aStatesLinks[$sStateCode]['in'] == 0 || $aStatesLinks[$sStateCode]['out'] == 0) {
                    // End or Start state, make it look different
                    $sDotFileContent .= "\t{$sStateCode} [ shape=doublecircle,label=\"" . GraphvizEscape($sStateLabel) . "\"];\n";
                } else {
                    $sDotFileContent .= "\t{$sStateCode} [ shape=circle,label=\"" . GraphvizEscape($sStateLabel) . "\"];\n";
                }
            }
        }
        $sDotFileContent .= "}\n";
    }
    return $sDotFileContent;
}
    public function DisplayModifyForm(WebPage $oPage, $aExtraParams = array())
    {
        $sOwnershipToken = null;
        $iKey = $this->GetKey();
        $sClass = get_class($this);
        if ($iKey > 0) {
            // The concurrent access lock makes sense only for already existing objects
            $LockEnabled = MetaModel::GetConfig()->Get('concurrent_lock_enabled');
            if ($LockEnabled) {
                $sOwnershipToken = utils::ReadPostedParam('ownership_token', null, false, 'raw_data');
                if ($sOwnershipToken !== null) {
                    // We're probably inside something like "apply_modify" where the validation failed and we must prompt the user again to edit the object
                    // let's extend our lock
                    $aLockInfo = iTopOwnershipLock::ExtendLock($sClass, $iKey, $sOwnershipToken);
                    $sOwnershipDate = $aLockInfo['acquired'];
                } else {
                    $aLockInfo = iTopOwnershipLock::AcquireLock($sClass, $iKey);
                    if ($aLockInfo['success']) {
                        $sOwnershipToken = $aLockInfo['token'];
                        $sOwnershipDate = $aLockInfo['acquired'];
                    } else {
                        $oOwner = $aLockInfo['lock']->GetOwner();
                        // If the object is locked by the current user, it's worth trying again, since
                        // the lock may be released by 'onunload' which is called AFTER loading the current page.
                        //$bTryAgain = $oOwner->GetKey() == UserRights::GetUserId();
                        self::ReloadAndDisplay($oPage, $this, array('operation' => 'modify'));
                        return;
                    }
                }
            }
        }
        if (isset($aExtraParams['wizard_container']) && $aExtraParams['wizard_container']) {
            $sClassLabel = MetaModel::GetName($sClass);
            $oPage->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $this->GetRawName(), $sClassLabel));
            // Set title will take care of the encoding
            $oPage->add("<div class=\"page_header\">\n");
            $oPage->add("<h1>" . $this->GetIcon() . "&nbsp;" . Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $this->GetName()) . "</h1>\n");
            $oPage->add("</div>\n");
            $oPage->add("<div class=\"wizContainer\">\n");
        }
        self::$iGlobalFormId++;
        $this->aFieldsMap = array();
        $sPrefix = '';
        if (isset($aExtraParams['formPrefix'])) {
            $sPrefix = $aExtraParams['formPrefix'];
        }
        $aFieldsComments = isset($aExtraParams['fieldsComments']) ? $aExtraParams['fieldsComments'] : array();
        $this->m_iFormId = $sPrefix . self::$iGlobalFormId;
        $oAppContext = new ApplicationContext();
        $sStateAttCode = MetaModel::GetStateAttributeCode($sClass);
        $aDetails = array();
        $aFieldsMap = array();
        if (!isset($aExtraParams['action'])) {
            $sFormAction = utils::GetAbsoluteUrlAppRoot() . 'pages/' . $this->GetUIPage();
            // No parameter in the URL, the only parameter will be the ones passed through the form
        } else {
            $sFormAction = $aExtraParams['action'];
        }
        // Custom label for the apply button ?
        if (isset($aExtraParams['custom_button'])) {
            $sApplyButton = $aExtraParams['custom_button'];
        } else {
            if ($iKey > 0) {
                $sApplyButton = Dict::S('UI:Button:Apply');
            } else {
                $sApplyButton = Dict::S('UI:Button:Create');
            }
        }
        // Custom operation for the form ?
        if (isset($aExtraParams['custom_operation'])) {
            $sOperation = $aExtraParams['custom_operation'];
        } else {
            if ($iKey > 0) {
                $sOperation = 'apply_modify';
            } else {
                $sOperation = 'apply_new';
            }
        }
        if ($iKey > 0) {
            // The object already exists in the database, it's a modification
            $sButtons = "<input id=\"{$sPrefix}_id\" type=\"hidden\" name=\"id\" value=\"{$iKey}\">\n";
            $sButtons .= "<input type=\"hidden\" name=\"operation\" value=\"{$sOperation}\">\n";
            $sButtons .= "<button type=\"button\" class=\"action cancel\"><span>" . Dict::S('UI:Button:Cancel') . "</span></button>&nbsp;&nbsp;&nbsp;&nbsp;\n";
            $sButtons .= "<button type=\"submit\" class=\"action\"><span>{$sApplyButton}</span></button>\n";
        } else {
            // The object does not exist in the database it's a creation
            $sButtons = "<input type=\"hidden\" name=\"operation\" value=\"{$sOperation}\">\n";
            $sButtons .= "<button type=\"button\" class=\"action cancel\">" . Dict::S('UI:Button:Cancel') . "</button>&nbsp;&nbsp;&nbsp;&nbsp;\n";
            $sButtons .= "<button type=\"submit\" class=\"action\"><span>{$sApplyButton}</span></button>\n";
        }
        $aTransitions = $this->EnumTransitions();
        if (!isset($aExtraParams['custom_operation']) && count($aTransitions)) {
            // transitions are displayed only for the standard new/modify actions, not for modify_all or any other case...
            $oSetToCheckRights = DBObjectSet::FromObject($this);
            $aStimuli = Metamodel::EnumStimuli($sClass);
            foreach ($aTransitions as $sStimulusCode => $aTransitionDef) {
                $iActionAllowed = get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction' ? UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSetToCheckRights) : UR_ALLOWED_NO;
                switch ($iActionAllowed) {
                    case UR_ALLOWED_YES:
                        $sButtons .= "<button type=\"submit\" name=\"next_action\" value=\"{$sStimulusCode}\" class=\"action\"><span>" . $aStimuli[$sStimulusCode]->GetLabel() . "</span></button>\n";
                        break;
                    default:
                        // Do nothing
                }
            }
        }
        $sButtonsPosition = MetaModel::GetConfig()->Get('buttons_position');
        $iTransactionId = isset($aExtraParams['transaction_id']) ? $aExtraParams['transaction_id'] : utils::GetNewTransactionId();
        $oPage->SetTransactionId($iTransactionId);
        $oPage->add("<form action=\"{$sFormAction}\" id=\"form_{$this->m_iFormId}\" enctype=\"multipart/form-data\" method=\"post\" onSubmit=\"return OnSubmit('form_{$this->m_iFormId}');\">\n");
        $sStatesSelection = '';
        if (!isset($aExtraParams['custom_operation']) && $this->IsNew()) {
            $aInitialStates = MetaModel::EnumInitialStates($sClass);
            //$aInitialStates = array('new' => 'foo', 'closed' => 'bar');
            if (count($aInitialStates) > 1) {
                $sStatesSelection = Dict::Format('UI:Create_Class_InState', MetaModel::GetName($sClass)) . '<select name="obj_state" class="state_select_' . $this->m_iFormId . '">';
                foreach ($aInitialStates as $sStateCode => $sStateData) {
                    $sSelected = '';
                    if ($sStateCode == $this->GetState()) {
                        $sSelected = ' selected';
                    }
                    $sStatesSelection .= '<option value="' . $sStateCode . '"' . $sSelected . '>' . MetaModel::GetStateLabel($sClass, $sStateCode) . '</option>';
                }
                $sStatesSelection .= '</select>';
                $oPage->add_ready_script("\$('.state_select_{$this->m_iFormId}').change( function() { oWizardHelper{$sPrefix}.ReloadObjectCreationForm('form_{$this->m_iFormId}', \$(this).val()); } );");
            }
        }
        $sConfirmationMessage = addslashes(Dict::S('UI:NavigateAwayConfirmationMessage'));
        $sJSToken = json_encode($sOwnershipToken);
        $oPage->add_ready_script(<<<EOF
\t\$(window).unload(function() { return OnUnload('{$iTransactionId}', '{$sClass}', {$iKey}, {$sJSToken}) } );
\twindow.onbeforeunload = function() {
\t\tif (!window.bInSubmit && !window.bInCancel)
\t\t{
\t\t\treturn '{$sConfirmationMessage}';\t
\t\t}
\t\t// return nothing ! safer for IE
\t};
EOF
);
        if ($sButtonsPosition != 'bottom') {
            // top or both, display the buttons here
            $oPage->p($sStatesSelection);
            $oPage->add($sButtons);
        }
        $oPage->AddTabContainer(OBJECT_PROPERTIES_TAB, $sPrefix);
        $oPage->SetCurrentTabContainer(OBJECT_PROPERTIES_TAB);
        $oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
        $aFieldsMap = $this->DisplayBareProperties($oPage, true, $sPrefix, $aExtraParams);
        if ($iKey > 0) {
            $aFieldsMap['id'] = $sPrefix . '_id';
        }
        // Now display the relations, one tab per relation
        if (!isset($aExtraParams['noRelations'])) {
            $this->DisplayBareRelations($oPage, true);
            // Edit mode, will fill $this->aFieldsMap
            $aFieldsMap = array_merge($aFieldsMap, $this->aFieldsMap);
        }
        $oPage->SetCurrentTab('');
        $oPage->add("<input type=\"hidden\" name=\"class\" value=\"{$sClass}\">\n");
        $oPage->add("<input type=\"hidden\" name=\"transaction_id\" value=\"{$iTransactionId}\">\n");
        foreach ($aExtraParams as $sName => $value) {
            if (is_scalar($value)) {
                $oPage->add("<input type=\"hidden\" name=\"{$sName}\" value=\"{$value}\">\n");
            }
        }
        if ($sOwnershipToken !== null) {
            $oPage->add("<input type=\"hidden\" name=\"ownership_token\" value=\"" . htmlentities($sOwnershipToken, ENT_QUOTES, 'UTF-8') . "\">\n");
        }
        $oPage->add($oAppContext->GetForForm());
        if ($sButtonsPosition != 'top') {
            // bottom or both: display the buttons here
            $oPage->p($sStatesSelection);
            $oPage->add($sButtons);
        }
        // Hook the cancel button via jQuery so that it can be unhooked easily as well if needed
        $sDefaultUrl = utils::GetAbsoluteUrlAppRoot() . 'pages/UI.php?operation=cancel&' . $oAppContext->GetForLink();
        $oPage->add_ready_script("\$('#form_{$this->m_iFormId} button.cancel').click( function() { BackToDetails('{$sClass}', {$iKey}, '{$sDefaultUrl}', {$sJSToken})} );");
        $oPage->add("</form>\n");
        if (isset($aExtraParams['wizard_container']) && $aExtraParams['wizard_container']) {
            $oPage->add("</div>\n");
        }
        $iFieldsCount = count($aFieldsMap);
        $sJsonFieldsMap = json_encode($aFieldsMap);
        $sState = $this->GetState();
        $sSessionStorageKey = $sClass . '_' . $iKey;
        $oPage->add_script(<<<EOF
\t\tsessionStorage.removeItem('{$sSessionStorageKey}');
\t\t
\t\t// Create the object once at the beginning of the page...
\t\tvar oWizardHelper{$sPrefix} = new WizardHelper('{$sClass}', '{$sPrefix}', '{$sState}');
\t\toWizardHelper{$sPrefix}.SetFieldsMap({$sJsonFieldsMap});
\t\toWizardHelper{$sPrefix}.SetFieldsCount({$iFieldsCount});
EOF
);
        $oPage->add_ready_script(<<<EOF
\t\toWizardHelper{$sPrefix}.UpdateWizard();
\t\t// Starts the validation when the page is ready
\t\tCheckFields('form_{$this->m_iFormId}', false);

EOF
);
        if ($sOwnershipToken !== null) {
            $this->GetOwnershipJSHandler($oPage, $sOwnershipToken);
        } else {
            // Probably a new object (or no concurrent lock), let's add a watchdog so that the session is kept open while editing
            $iInterval = MetaModel::GetConfig()->Get('concurrent_lock_expiration_delay') * 1000 / 2;
            if ($iInterval > 0) {
                $iInterval = max(MIN_WATCHDOG_INTERVAL * 1000, $iInterval);
                // Minimum interval for the watchdog is MIN_WATCHDOG_INTERVAL
                $oPage->add_ready_script(<<<EOF
\t\t\t\twindow.setInterval(function() {
\t\t\t\t\t\$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'watchdog'});
\t\t\t\t}, {$iInterval});
EOF
);
            }
        }
    }
예제 #3
0
 public function GetStateLabel()
 {
     $sStateAttCode = MetaModel::GetStateAttributeCode(get_class($this));
     if (empty($sStateAttCode)) {
         return '';
     } else {
         $sStateValue = $this->Get($sStateAttCode);
         return MetaModel::GetStateLabel(get_class($this), $sStateValue);
     }
 }
    public function DisplayModifyForm(WebPage $oPage, $aExtraParams = array())
    {
        self::$iGlobalFormId++;
        $this->aFieldsMap = array();
        $sPrefix = '';
        if (isset($aExtraParams['formPrefix'])) {
            $sPrefix = $aExtraParams['formPrefix'];
        }
        $aFieldsComments = isset($aExtraParams['fieldsComments']) ? $aExtraParams['fieldsComments'] : array();
        $this->m_iFormId = $sPrefix . self::$iGlobalFormId;
        $sClass = get_class($this);
        $oAppContext = new ApplicationContext();
        $sStateAttCode = MetaModel::GetStateAttributeCode($sClass);
        $iKey = $this->GetKey();
        $aDetails = array();
        $aFieldsMap = array();
        if (!isset($aExtraParams['action'])) {
            $sFormAction = $_SERVER['SCRIPT_NAME'];
            // No parameter in the URL, the only parameter will be the ones passed through the form
        } else {
            $sFormAction = $aExtraParams['action'];
        }
        // Custom label for the apply button ?
        if (isset($aExtraParams['custom_button'])) {
            $sApplyButton = $aExtraParams['custom_button'];
        } else {
            if ($iKey > 0) {
                $sApplyButton = Dict::S('UI:Button:Apply');
            } else {
                $sApplyButton = Dict::S('UI:Button:Create');
            }
        }
        // Custom operation for the form ?
        if (isset($aExtraParams['custom_operation'])) {
            $sOperation = $aExtraParams['custom_operation'];
        } else {
            if ($iKey > 0) {
                $sOperation = 'apply_modify';
            } else {
                $sOperation = 'apply_new';
            }
        }
        if ($iKey > 0) {
            // The object already exists in the database, it's a modification
            $sButtons = "<input id=\"{$sPrefix}_id\" type=\"hidden\" name=\"id\" value=\"{$iKey}\">\n";
            $sButtons .= "<input type=\"hidden\" name=\"operation\" value=\"{$sOperation}\">\n";
            $sButtons .= "<button type=\"button\" class=\"action cancel\"><span>" . Dict::S('UI:Button:Cancel') . "</span></button>&nbsp;&nbsp;&nbsp;&nbsp;\n";
            $sButtons .= "<button type=\"submit\" class=\"action\"><span>{$sApplyButton}</span></button>\n";
        } else {
            // The object does not exist in the database it's a creation
            $sButtons = "<input type=\"hidden\" name=\"operation\" value=\"{$sOperation}\">\n";
            $sButtons .= "<button type=\"button\" class=\"action cancel\">" . Dict::S('UI:Button:Cancel') . "</button>&nbsp;&nbsp;&nbsp;&nbsp;\n";
            $sButtons .= "<button type=\"submit\" class=\"action\"><span>{$sApplyButton}</span></button>\n";
        }
        $aTransitions = $this->EnumTransitions();
        if (!isset($aExtraParams['custom_operation']) && count($aTransitions)) {
            // transitions are displayed only for the standard new/modify actions, not for modify_all or any other case...
            $oSetToCheckRights = DBObjectSet::FromObject($this);
            $aStimuli = Metamodel::EnumStimuli($sClass);
            foreach ($aTransitions as $sStimulusCode => $aTransitionDef) {
                $iActionAllowed = get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction' ? UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSetToCheckRights) : UR_ALLOWED_NO;
                switch ($iActionAllowed) {
                    case UR_ALLOWED_YES:
                        $sButtons .= "<button type=\"submit\" name=\"next_action\" value=\"{$sStimulusCode}\" class=\"action\"><span>" . $aStimuli[$sStimulusCode]->GetLabel() . "</span></button>\n";
                        break;
                    default:
                        // Do nothing
                }
            }
        }
        $sButtonsPosition = MetaModel::GetConfig()->Get('buttons_position');
        $iTransactionId = isset($aExtraParams['transaction_id']) ? $aExtraParams['transaction_id'] : utils::GetNewTransactionId();
        $oPage->SetTransactionId($iTransactionId);
        $oPage->add("<form action=\"{$sFormAction}\" id=\"form_{$this->m_iFormId}\" enctype=\"multipart/form-data\" method=\"post\" onSubmit=\"return OnSubmit('form_{$this->m_iFormId}');\">\n");
        $sStatesSelection = '';
        if (!isset($aExtraParams['custom_operation']) && $this->IsNew()) {
            $aInitialStates = MetaModel::EnumInitialStates($sClass);
            //$aInitialStates = array('new' => 'foo', 'closed' => 'bar');
            if (count($aInitialStates) > 1) {
                $sStatesSelection = Dict::Format('UI:Create_Class_InState', MetaModel::GetName($sClass)) . '<select name="obj_state" class="state_select_' . $this->m_iFormId . '">';
                foreach ($aInitialStates as $sStateCode => $sStateData) {
                    $sSelected = '';
                    if ($sStateCode == $this->GetState()) {
                        $sSelected = ' selected';
                    }
                    $sStatesSelection .= '<option value="' . $sStateCode . '"' . $sSelected . '>' . MetaModel::GetStateLabel($sClass, $sStateCode) . '</option>';
                }
                $sStatesSelection .= '</select>';
                $oPage->add_ready_script("\$('.state_select_{$this->m_iFormId}').change( function() { oWizardHelper{$sPrefix}.ReloadObjectCreationForm('form_{$this->m_iFormId}', \$(this).val()); } );");
            }
        }
        $sConfirmationMessage = addslashes(Dict::S('UI:NavigateAwayConfirmationMessage'));
        $oPage->add_ready_script(<<<EOF
\t\$(window).unload(function() { return OnUnload('{$iTransactionId}') } );
\twindow.onbeforeunload = function() {
\t\tif (!window.bInSubmit && !window.bInCancel)
\t\t{
\t\t\treturn '{$sConfirmationMessage}';\t
\t\t}
\t\t// return nothing ! safer for IE
\t};
EOF
);
        if ($sButtonsPosition != 'bottom') {
            // top or both, display the buttons here
            $oPage->p($sStatesSelection);
            $oPage->add($sButtons);
        }
        $oPage->AddTabContainer(OBJECT_PROPERTIES_TAB, $sPrefix);
        $oPage->SetCurrentTabContainer(OBJECT_PROPERTIES_TAB);
        $oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
        $aFieldsMap = $this->DisplayBareProperties($oPage, true, $sPrefix, $aExtraParams);
        if ($iKey > 0) {
            $aFieldsMap['id'] = $sPrefix . '_id';
        }
        // Now display the relations, one tab per relation
        if (!isset($aExtraParams['noRelations'])) {
            $this->DisplayBareRelations($oPage, true);
            // Edit mode, will fill $this->aFieldsMap
            $aFieldsMap = array_merge($aFieldsMap, $this->aFieldsMap);
        }
        $oPage->SetCurrentTab('');
        $oPage->add("<input type=\"hidden\" name=\"class\" value=\"{$sClass}\">\n");
        $oPage->add("<input type=\"hidden\" name=\"transaction_id\" value=\"{$iTransactionId}\">\n");
        foreach ($aExtraParams as $sName => $value) {
            if (is_scalar($value)) {
                $oPage->add("<input type=\"hidden\" name=\"{$sName}\" value=\"{$value}\">\n");
            }
        }
        $oPage->add($oAppContext->GetForForm());
        if ($sButtonsPosition != 'top') {
            // bottom or both: display the buttons here
            $oPage->p($sStatesSelection);
            $oPage->add($sButtons);
        }
        // Hook the cancel button via jQuery so that it can be unhooked easily as well if needed
        $sDefaultUrl = utils::GetAbsoluteUrlAppRoot() . 'pages/UI.php?operation=cancel&' . $oAppContext->GetForLink();
        $oPage->add_ready_script("\$('#form_{$this->m_iFormId} button.cancel').click( function() { BackToDetails('{$sClass}', {$iKey}, '{$sDefaultUrl}')} );");
        $oPage->add("</form>\n");
        $iFieldsCount = count($aFieldsMap);
        $sJsonFieldsMap = json_encode($aFieldsMap);
        $sState = $this->GetState();
        $oPage->add_script(<<<EOF
\t\t// Create the object once at the beginning of the page...
\t\tvar oWizardHelper{$sPrefix} = new WizardHelper('{$sClass}', '{$sPrefix}', '{$sState}');
\t\toWizardHelper{$sPrefix}.SetFieldsMap({$sJsonFieldsMap});
\t\toWizardHelper{$sPrefix}.SetFieldsCount({$iFieldsCount});
EOF
);
        $oPage->add_ready_script(<<<EOF
\t\toWizardHelper{$sPrefix}.UpdateWizard();
\t\t// Starts the validation when the page is ready
\t\tCheckFields('form_{$this->m_iFormId}', false);

EOF
);
    }
예제 #5
0
 public static function MakeDictionaryTemplate($sModules = '', $sOutputFilter = 'NotInDictionary')
 {
     $sRes = '';
     $sRes .= "// Dictionnay conventions\n";
     $sRes .= htmlentities("// Class:<class_name>\n", ENT_QUOTES, 'UTF-8');
     $sRes .= htmlentities("// Class:<class_name>+\n", ENT_QUOTES, 'UTF-8');
     $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>\n", ENT_QUOTES, 'UTF-8');
     $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>+\n", ENT_QUOTES, 'UTF-8');
     $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>/Value:<value>\n", ENT_QUOTES, 'UTF-8');
     $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+\n", ENT_QUOTES, 'UTF-8');
     $sRes .= htmlentities("// Class:<class_name>/Stimulus:<stimulus_code>\n", ENT_QUOTES, 'UTF-8');
     $sRes .= htmlentities("// Class:<class_name>/Stimulus:<stimulus_code>+\n", ENT_QUOTES, 'UTF-8');
     $sRes .= "\n";
     // Note: I did not use EnumCategories(), because a given class maybe found in several categories
     // Need to invent the "module", to characterize the origins of a class
     if (strlen($sModules) == 0) {
         $aModules = array('bizmodel', 'core/cmdb', 'gui', 'application', 'addon/userrights');
     } else {
         $aModules = explode(', ', $sModules);
     }
     $sRes .= "//////////////////////////////////////////////////////////////////////\n";
     $sRes .= "// Note: The classes have been grouped by categories: " . implode(', ', $aModules) . "\n";
     $sRes .= "//////////////////////////////////////////////////////////////////////\n";
     foreach ($aModules as $sCategory) {
         $sRes .= "//////////////////////////////////////////////////////////////////////\n";
         $sRes .= "// Classes in '<em>{$sCategory}</em>'\n";
         $sRes .= "//////////////////////////////////////////////////////////////////////\n";
         $sRes .= "//\n";
         $sRes .= "\n";
         foreach (self::GetClasses($sCategory) as $sClass) {
             if (!self::HasTable($sClass)) {
                 continue;
             }
             $bNotInDico = false;
             $sClassRes = "//\n";
             $sClassRes .= "// Class: {$sClass}\n";
             $sClassRes .= "//\n";
             $sClassRes .= "\n";
             $sClassRes .= "Dict::Add('EN US', 'English', 'English', array(\n";
             $sClassRes .= self::MakeDictEntry("Class:{$sClass}", self::GetName_Obsolete($sClass), $sClass, $bNotInDico);
             $sClassRes .= self::MakeDictEntry("Class:{$sClass}+", self::GetClassDescription_Obsolete($sClass), '', $bNotInDico);
             foreach (self::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
                 // Skip this attribute if not originaly defined in this class
                 if (self::$m_aAttribOrigins[$sClass][$sAttCode] != $sClass) {
                     continue;
                 }
                 $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}", $oAttDef->GetLabel_Obsolete(), $sAttCode, $bNotInDico);
                 $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}+", $oAttDef->GetDescription_Obsolete(), '', $bNotInDico);
                 if ($oAttDef instanceof AttributeEnum) {
                     if (self::GetStateAttributeCode($sClass) == $sAttCode) {
                         foreach (self::EnumStates($sClass) as $sStateCode => $aStateData) {
                             if (array_key_exists('label', $aStateData)) {
                                 $sValue = $aStateData['label'];
                             } else {
                                 $sValue = MetaModel::GetStateLabel($sClass, $sStateCode);
                             }
                             if (array_key_exists('description', $aStateData)) {
                                 $sValuePlus = $aStateData['description'];
                             } else {
                                 $sValuePlus = MetaModel::GetStateDescription($sClass, $sStateCode);
                             }
                             $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sStateCode}", $sValue, '', $bNotInDico);
                             $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sStateCode}+", $sValuePlus, '', $bNotInDico);
                         }
                     } else {
                         foreach ($oAttDef->GetAllowedValues() as $sKey => $value) {
                             $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sKey}", $value, '', $bNotInDico);
                             $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sKey}+", $value, '', $bNotInDico);
                         }
                     }
                 }
             }
             foreach (self::EnumStimuli($sClass) as $sStimulusCode => $oStimulus) {
                 $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Stimulus:{$sStimulusCode}", $oStimulus->GetLabel_Obsolete(), '', $bNotInDico);
                 $sClassRes .= self::MakeDictEntry("Class:{$sClass}/Stimulus:{$sStimulusCode}+", $oStimulus->GetDescription_Obsolete(), '', $bNotInDico);
             }
             $sClassRes .= "));\n";
             $sClassRes .= "\n";
             if ($bNotInDico || $sOutputFilter != 'NotInDictionary') {
                 $sRes .= $sClassRes;
             }
         }
     }
     return $sRes;
 }
예제 #6
0
/**
 * Helper for the lifecycle details of a given class
 */
function DisplayLifecycle($oPage, $sClass)
{
    $sStateAttCode = MetaModel::GetStateAttributeCode($sClass);
    if (empty($sStateAttCode)) {
        $oPage->p(Dict::S('UI:Schema:NoLifeCyle'));
    } else {
        $aStates = MetaModel::EnumStates($sClass);
        $aStimuli = MetaModel::EnumStimuli($sClass);
        $oPage->add("<img src=\"" . utils::GetAbsoluteUrlAppRoot() . "pages/graphviz.php?class={$sClass}\">\n");
        $oPage->add("<h3>" . Dict::S('UI:Schema:LifeCycleTransitions') . "</h3>\n");
        $oPage->add("<ul>\n");
        foreach ($aStates as $sStateCode => $aStateDef) {
            $sStateLabel = MetaModel::GetStateLabel($sClass, $sStateCode);
            $sStateDescription = MetaModel::GetStateDescription($sClass, $sStateCode);
            $oPage->add("<li title=\"code: {$sStateCode}\">{$sStateLabel} <span style=\"color:grey;\">({$sStateCode}) {$sStateDescription}</span></li>\n");
            $oPage->add("<ul>\n");
            foreach (MetaModel::EnumTransitions($sClass, $sStateCode) as $sStimulusCode => $aTransitionDef) {
                $sStimulusLabel = $aStimuli[$sStimulusCode]->GetLabel();
                $sTargetStateLabel = MetaModel::GetStateLabel($sClass, $aTransitionDef['target_state']);
                if (count($aTransitionDef['actions']) > 0) {
                    $sActions = " <em>(" . implode(', ', $aTransitionDef['actions']) . ")</em>";
                } else {
                    $sActions = "";
                }
                $oPage->add("<li><span style=\"color:red;font-weight=bold;\">{$sStimulusLabel}</span> =&gt; {$sTargetStateLabel} {$sActions}</li>\n");
            }
            $oPage->add("</ul>\n");
        }
        $oPage->add("</ul>\n");
        $oPage->add("<h3>" . Dict::S('UI:Schema:LifeCyleAttributeOptions') . "</h3>\n");
        $oPage->add("<ul>\n");
        foreach ($aStates as $sStateCode => $aStateDef) {
            $sStateLabel = MetaModel::GetStateLabel($sClass, $sStateCode);
            $sStateDescription = MetaModel::GetStateDescription($sClass, $sStateCode);
            $oPage->add("<li title=\"code: {$sStateCode}\">{$sStateLabel} <span style=\"color:grey;\">({$sStateCode}) {$sStateDescription}</span></li>\n");
            if (count($aStates[$sStateCode]['attribute_list']) > 0) {
                $oPage->add("<ul>\n");
                foreach ($aStates[$sStateCode]['attribute_list'] as $sAttCode => $iOptions) {
                    $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
                    $sAttLabel = $oAttDef->GetLabel();
                    $aOptions = array();
                    if ($iOptions & OPT_ATT_HIDDEN) {
                        $aOptions[] = Dict::S('UI:Schema:LifeCycleHiddenAttribute');
                    }
                    if ($iOptions & OPT_ATT_READONLY) {
                        $aOptions[] = Dict::S('UI:Schema:LifeCycleReadOnlyAttribute');
                    }
                    if ($iOptions & OPT_ATT_MANDATORY) {
                        $aOptions[] = Dict::S('UI:Schema:LifeCycleMandatoryAttribute');
                    }
                    if ($iOptions & OPT_ATT_MUSTCHANGE) {
                        $aOptions[] = Dict::S('UI:Schema:LifeCycleAttributeMustChange');
                    }
                    if ($iOptions & OPT_ATT_MUSTPROMPT) {
                        $aOptions[] = Dict::S('UI:Schema:LifeCycleAttributeMustPrompt');
                    }
                    if (count($aOptions)) {
                        $sOptions = implode(', ', $aOptions);
                    } else {
                        $sOptions = "";
                    }
                    $oPage->add("<li><span style=\"color:purple;font-weight=bold;\">{$sAttLabel}</span> {$sOptions}</li>\n");
                }
                $oPage->add("</ul>\n");
            } else {
                $oPage->p("<em>" . Dict::S('UI:Schema:LifeCycleEmptyList') . "</em>");
            }
        }
        $oPage->add("</ul>\n");
    }
}
예제 #7
0
function MakeDictionaryTemplate($sModules = '', $sLanguage = 'EN US')
{
    $sRes = '';
    Dict::SetDefaultLanguage($sLanguage);
    $aAvailableLanguages = Dict::GetLanguages();
    $sDesc = $aAvailableLanguages[$sLanguage]['description'];
    $sLocalizedDesc = $aAvailableLanguages[$sLanguage]['localized_description'];
    $sRes .= "// Dictionary conventions\n";
    $sRes .= htmlentities("// Class:<class_name>\n", ENT_QUOTES, 'UTF-8');
    $sRes .= htmlentities("// Class:<class_name>+\n", ENT_QUOTES, 'UTF-8');
    $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>\n", ENT_QUOTES, 'UTF-8');
    $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>+\n", ENT_QUOTES, 'UTF-8');
    $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>/Value:<value>\n", ENT_QUOTES, 'UTF-8');
    $sRes .= htmlentities("// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+\n", ENT_QUOTES, 'UTF-8');
    $sRes .= htmlentities("// Class:<class_name>/Stimulus:<stimulus_code>\n", ENT_QUOTES, 'UTF-8');
    $sRes .= htmlentities("// Class:<class_name>/Stimulus:<stimulus_code>+\n", ENT_QUOTES, 'UTF-8');
    $sRes .= "\n";
    // Note: I did not use EnumCategories(), because a given class maybe found in several categories
    // Need to invent the "module", to characterize the origins of a class
    if (strlen($sModules) == 0) {
        $aModules = array('bizmodel', 'core/cmdb', 'gui', 'application', 'addon/userrights', 'monitoring');
    } else {
        $aModules = explode(', ', $sModules);
    }
    $sRes .= "//////////////////////////////////////////////////////////////////////\n";
    $sRes .= "// Note: The classes have been grouped by categories: " . implode(', ', $aModules) . "\n";
    $sRes .= "//////////////////////////////////////////////////////////////////////\n";
    foreach ($aModules as $sCategory) {
        $sRes .= "//////////////////////////////////////////////////////////////////////\n";
        $sRes .= "// Classes in '{$sCategory}'\n";
        $sRes .= "//////////////////////////////////////////////////////////////////////\n";
        $sRes .= "//\n";
        $sRes .= "\n";
        foreach (MetaModel::GetClasses($sCategory) as $sClass) {
            if (!MetaModel::HasTable($sClass)) {
                continue;
            }
            $bNotInDico = false;
            $bNotImportant = true;
            $sClassRes = "//\n";
            $sClassRes .= "// Class: {$sClass}\n";
            $sClassRes .= "//\n";
            $sClassRes .= "\n";
            $sClassRes .= "Dict::Add('{$sLanguage}', '{$sDesc}', '{$sLocalizedDesc}', array(\n";
            $sClassRes .= MakeDictEntry("Class:{$sClass}", MetaModel::GetName_Obsolete($sClass), $sClass, $bNotInDico);
            $sClassRes .= MakeDictEntry("Class:{$sClass}+", MetaModel::GetClassDescription_Obsolete($sClass), '', $bNotImportant);
            foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
                if ($sAttCode == 'friendlyname') {
                    continue;
                }
                // Skip this attribute if not originaly defined in this class
                if (MetaModel::GetAttributeOrigin($sClass, $sAttCode) != $sClass) {
                    continue;
                }
                $sClassRes .= MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}", $oAttDef->GetLabel_Obsolete(), $sAttCode, $bNotInDico);
                $sClassRes .= MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}+", $oAttDef->GetDescription_Obsolete(), '', $bNotImportant);
                if ($oAttDef instanceof AttributeEnum) {
                    if (MetaModel::GetStateAttributeCode($sClass) == $sAttCode) {
                        foreach (MetaModel::EnumStates($sClass) as $sStateCode => $aStateData) {
                            if (array_key_exists('label', $aStateData)) {
                                $sValue = $aStateData['label'];
                            } else {
                                $sValue = MetaModel::GetStateLabel($sClass, $sStateCode);
                            }
                            if (array_key_exists('description', $aStateData)) {
                                $sValuePlus = $aStateData['description'];
                            } else {
                                $sValuePlus = MetaModel::GetStateDescription($sClass, $sStateCode);
                            }
                            $sClassRes .= MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sStateCode}", $sValue, '', $bNotInDico);
                            $sClassRes .= MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sStateCode}+", $sValuePlus, '', $bNotImportant);
                        }
                    } else {
                        foreach ($oAttDef->GetAllowedValues() as $sKey => $value) {
                            $sClassRes .= MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sKey}", $value, '', $bNotInDico);
                            $sClassRes .= MakeDictEntry("Class:{$sClass}/Attribute:{$sAttCode}/Value:{$sKey}+", $value, '', $bNotImportant);
                        }
                    }
                }
            }
            foreach (MetaModel::EnumStimuli($sClass) as $sStimulusCode => $oStimulus) {
                $sClassRes .= MakeDictEntry("Class:{$sClass}/Stimulus:{$sStimulusCode}", $oStimulus->GetLabel_Obsolete(), '', $bNotInDico);
                $sClassRes .= MakeDictEntry("Class:{$sClass}/Stimulus:{$sStimulusCode}+", $oStimulus->GetDescription_Obsolete(), '', $bNotImportant);
            }
            $sClassRes .= "));\n";
            $sClassRes .= "\n";
            $sRes .= $sClassRes;
        }
    }
    return $sRes;
}