/** * iTop User Portal main page * * @copyright Copyright (C) 2010-2013 Combodo SARL * @license http://opensource.org/licenses/AGPL-3.0 */ require_once('../approot.inc.php'); require_once(APPROOT.'/application/application.inc.php'); require_once(APPROOT.'/application/nicewebpage.class.inc.php'); require_once(APPROOT.'/application/wizardhelper.class.inc.php'); /** * Displays the portal main menu * @param WebPage $oP The current web page * @return void */ function DisplayMainMenu(WebPage $oP) { $oP->AddMenuButton('showongoing', 'Portal:ShowOngoing', '../portal/index.php?operation=show_ongoing'); $oP->AddMenuButton('newrequest', 'Portal:CreateNewRequest', '../portal/index.php?operation=create_request'); $oP->AddMenuButton('showclosed', 'Portal:ShowClosed', '../portal/index.php?operation=show_closed'); if (UserRights::CanChangePassword()) { $oP->AddMenuButton('change_pwd', 'Portal:ChangeMyPassword', '../portal/index.php?loginop=change_pwd'); } } /** * Displays the current tickets * @param WebPage $oP The current web page * @return void */ function ShowOngoingTickets(WebPage $oP) { $oP->add("
\n"); $oP->add("

".Dict::S('Portal:OpenRequests')."

\n"); ListOpenRequests($oP); $oP->add("
\n"); $oP->add("
\n"); $oP->add("

".Dict::S('Portal:ResolvedRequests')."

\n"); ListResolvedRequests($oP); $oP->add("
\n"); } /** * Displays the closed tickets * @param WebPage $oP The current web page * @return void */ function ShowClosedTickets(WebPage $oP) { $oP->add("
\n"); //$oP->add("

".Dict::S('Portal:ListClosedTickets')."

\n"); ListClosedTickets($oP); $oP->add("
\n"); } /** * Displays the form to select a Service Category Id (among the valid ones for the specified user Organization) * @param WebPage $oP Web page for the form output * @param Organization $oUserOrg The organization of the current user * @return void */ function SelectServiceCategory($oP, $oUserOrg) { $aParameters = $oP->ReadAllParams(PORTAL_ALL_PARAMS.',template_id'); $oSearch = DBObjectSearch::FromOQL(PORTAL_SERVICECATEGORY_QUERY); $oSearch->AllowAllData(); // In case the user has the rights on his org only $oSet = new CMDBObjectSet($oSearch, array(), array('org_id' => $oUserOrg->GetKey())); if ($oSet->Count() == 1) { $oService = $oSet->Fetch(); $iSvcCategory = $oService->GetKey(); // Only one Category, skip this step in the wizard SelectServiceSubCategory($oP, $oUserOrg, $iSvcCategory); } else { $oP->add("
\n"); $oP->WizardFormStart('request_wizard', 1); $oP->add("

".Dict::S('Portal:SelectService')."

\n"); $oP->add("\n"); while($oService = $oSet->Fetch()) { $id = $oService->GetKey(); $sChecked = ""; if (isset($aParameters['service_id']) && ($id == $aParameters['service_id'])) { $sChecked = "checked"; } $oP->p(""); } $oP->add("

"); $oP->p("

".$oService->GetAsHTML('description')."

\n"); $oP->DumpHiddenParams($aParameters, array('service_id')); $oP->add(""); $oP->WizardFormButtons(BUTTON_NEXT | BUTTON_CANCEL); // NO back button since it's the first step of the Wizard $oP->WizardFormEnd(); $oP->WizardCheckSelectionOnSubmit(Dict::S('Portal:PleaseSelectOneService')); $oP->add("
\n"); } } /** * Displays the form to select a Service Subcategory Id (among the valid ones for the specified user Organization) * and based on the page's parameter 'service_id' * @param WebPage $oP Web page for the form output * @param Organization $oUserOrg The organization of the current user * @param $iSvcId Id of the selected service in case of pass-through (when there is only one service) * @return void */ function SelectServiceSubCategory($oP, $oUserOrg, $iSvcId = null) { $aParameters = $oP->ReadAllParams(PORTAL_ALL_PARAMS.',template_id'); if ($iSvcId == null) { $iSvcId = $aParameters['service_id']; } else { $aParameters['service_id'] = $iSvcId; } $iDefaultSubSvcId = isset($aParameters['servicesubcategory_id']) ? $aParameters['servicesubcategory_id'] : 0; $iDefaultWizNext = 2; $oSearch = DBObjectSearch::FromOQL(PORTAL_SERVICE_SUBCATEGORY_QUERY); $oSearch->AllowAllData(); // In case the user has the rights on his org only $oSet = new CMDBObjectSet($oSearch, array(), array('svc_id' => $iSvcId, 'org_id' => $oUserOrg->GetKey())); if ($oSet->Count() == 1) { // Only one sub service, skip this step of the wizard $oSubService = $oSet->Fetch(); $iSubSvdId = $oSubService->GetKey(); SelectRequestTemplate($oP, $oUserOrg, $iSvcId, $iSubSvdId); } else { $oServiceCategory = MetaModel::GetObject('Service', $iSvcId, false, true /* allow all data*/); if (is_object($oServiceCategory)) { $oP->add("
\n"); $oP->add("

".Dict::Format('Portal:SelectSubcategoryFrom_Service', $oServiceCategory->GetName())."

\n"); $oP->WizardFormStart('request_wizard', $iDefaultWizNext); $oP->add("\n"); while($oSubService = $oSet->Fetch()) { $id = $oSubService->GetKey(); $sChecked = ""; if ($id == $iDefaultSubSvcId) { $sChecked = "checked"; } $oP->add(""); $oP->add(""); $oP->add(""); $oP->add(""); } $oP->add("
"); $oP->add("

"); $oP->add("
"); $oP->add("

"); $oP->add("

".$oSubService->GetAsHTML('description')."

"); $oP->add("
\n"); $oP->DumpHiddenParams($aParameters, array('servicesubcategory_id')); $oP->add(""); $oP->WizardFormButtons(BUTTON_BACK | BUTTON_NEXT | BUTTON_CANCEL); //Back button automatically discarded if on the first page $oP->WizardFormEnd(); $oP->WizardCheckSelectionOnSubmit(Dict::S('Portal:PleaseSelectAServiceSubCategory')); $oP->add("
\n"); } else { $oP->p("Error: Invalid Service: id = $iSvcId"); } } } /** * Displays the form to select a Template * @param WebPage $oP Web page for the form output * @param Organization $oUserOrg The organization of the current user * @param $iSvcId Id of the selected service in case of pass-through (when there is only one service) * @param integer $iSubSvcId The identifier of the sub-service (fall through when there is only one sub-service) * @return void */ function SelectRequestTemplate($oP, $oUserOrg, $iSvcId = null, $iSubSvcId = null) { $aParameters = $oP->ReadAllParams(PORTAL_ALL_PARAMS.',template_id'); if ($iSvcId != null) { $aParameters['service_id'] = $iSvcId; } if ($iSubSvcId != null) { $aParameters['servicesubcategory_id'] = $iSubSvcId; } $iDefaultTemplate = isset($aParameters['template_id']) ? $aParameters['template_id'] : 0; if (MetaModel::IsValidClass('Template')) { $oSearch = DBObjectSearch::FromOQL(REQUEST_TEMPLATE_QUERY); $oSearch->AllowAllData(); $oSet = new CMDBObjectSet($oSearch, array(), array( 'service_id' => $aParameters['service_id'], 'servicesubcategory_id' => $aParameters['servicesubcategory_id'] )); if ($oSet->Count() == 0) { RequestCreationForm($oP, $oUserOrg, $aParameters['service_id'], $aParameters['servicesubcategory_id']); return; } elseif ($oSet->Count() == 1) { $oTemplate = $oSet->Fetch(); $iTemplateId = $oTemplate->GetKey(); RequestCreationForm($oP, $oUserOrg, $aParameters['service_id'], $aParameters['servicesubcategory_id'], $iTemplateId); return; } $oServiceSubCategory = MetaModel::GetObject('ServiceSubcategory', $aParameters['servicesubcategory_id'], false); if (is_object($oServiceSubCategory)) { $oP->add("
\n"); $oP->add("

".Dict::Format('Portal:SelectRequestTemplate', $oServiceSubCategory->GetName())."

\n"); $oP->WizardFormStart('request_wizard', 3); $oP->add("\n"); while($oTemplate = $oSet->Fetch()) { $id = $oTemplate->GetKey(); $sChecked = ""; if ($id == $iDefaultTemplate) { $sChecked = "checked"; } $oP->add(""); $oP->add(""); $oP->add(""); $oP->add(""); } $oP->add("
"); $oP->p(""); $oP->add(""); $oP->p(""); $oP->p($oTemplate->GetAsHTML('description')); $oP->add("
\n"); $oP->DumpHiddenParams($aParameters, array('template_id')); $oP->add(""); $oP->WizardFormButtons(BUTTON_BACK | BUTTON_NEXT | BUTTON_CANCEL); //Back button automatically discarded if on the first page $oP->WizardCheckSelectionOnSubmit(Dict::S('Portal:PleaseSelectATemplate')); $oP->WizardFormEnd(); $oP->add("
\n"); } else { $oP->p("Error: Invalid servicesubcategory_id = ".$aParameters['servicesubcategory_id']); } } else { RequestCreationForm($oP, $oUserOrg, $aParameters['service_id'], $aParameters['servicesubcategory_id']); return; } } /** * Displays the form for the final step of the UserRequest creation * @param WebPage $oP The current web page for the form output * @param Organization $oUserOrg The organization of the current user * @param integer $iSvcId The identifier of the service (fall through when there is only one service) * @param integer $iSubSvcId The identifier of the sub-service (fall through when there is only one sub-service) * @param integer $iTemplateId The identifier of the template (fall through when there is only one template) * @return void */ function RequestCreationForm($oP, $oUserOrg, $iSvcId = null, $iSubSvcId = null, $iTemplateId = null) { $oP->add_script( <<ReadAllParams(PORTAL_ALL_PARAMS.',template_id'); if ($iSvcId != null) { $aParameters['service_id'] = $iSvcId; } if ($iSubSvcId != null) { $aParameters['servicesubcategory_id'] = $iSubSvcId; } if ($iTemplateId != null) { $aParameters['template_id'] = $iTemplateId; } // Example: $aList = array('title', 'description', 'impact', 'emergency'); $aList = explode(',', PORTAL_REQUEST_FORM_ATTRIBUTES); $sDescription = ''; if (isset($aParameters['template_id']) && ($aParameters['template_id'] != 0)) { $aTemplateFields = array(); $oTemplate = MetaModel::GetObject('Template', $aParameters['template_id'], false); if (is_object($oTemplate)) { $oFieldSearch = DBObjectSearch::FromOQL('SELECT TemplateField WHERE template_id = :template_id'); $oFieldSearch->AllowAllData(); $oFieldSet = new DBObjectSet($oFieldSearch, array('order' => true), array('template_id' => $oTemplate->GetKey())); while($oField = $oFieldSet->Fetch()) { $sAttCode = $oField->Get('code'); if (isset($aParameters[$sAttCode])) { $oField->Set('initial_value', $aParameters[$sAttCode]); } $aTemplateFields[$sAttCode] = $oField; } } } $oServiceCategory = MetaModel::GetObject('Service', $aParameters['service_id'], false, true /* allow all data*/); $oServiceSubCategory = MetaModel::GetObject('ServiceSubcategory', $aParameters['servicesubcategory_id'], false, true /* allow all data*/); if (is_object($oServiceCategory) && is_object($oServiceSubCategory)) { $oRequest = new UserRequest(); $oRequest->Set('org_id', $oUserOrg->GetKey()); $oRequest->Set('caller_id', UserRights::GetContactId()); $oRequest->Set('service_id', $aParameters['service_id']); $oRequest->Set('servicesubcategory_id', $aParameters['servicesubcategory_id']); $oAttDef = MetaModel::GetAttributeDef('UserRequest', 'service_id'); $aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $oServiceCategory->GetName()); $oAttDef = MetaModel::GetAttributeDef('UserRequest', 'servicesubcategory_id'); $aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $oServiceSubCategory->GetName()); $iFlags = 0; foreach($aList as $sAttCode) { $value = ''; if (isset($aParameters[$sAttCode])) { $value = $aParameters[$sAttCode]; $oRequest->Set($sAttCode, $value); } } $aFieldsMap = array(); foreach($aList as $sAttCode) { $value = ''; $oAttDef = MetaModel::GetAttributeDef(get_class($oRequest), $sAttCode); $iFlags = $oRequest->GetAttributeFlags($sAttCode); if (isset($aParameters[$sAttCode])) { $value = $aParameters[$sAttCode]; } $aArgs = array('this' => $oRequest); $sInputId = 'attr_'.$sAttCode; $aFieldsMap[$sAttCode] = $sInputId; $sValue = "".$oRequest->GetFormElementForField($oP, get_class($oRequest), $sAttCode, $oAttDef, $value, '', 'attr_'.$sAttCode, '', $iFlags, $aArgs).''; $aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $sValue); } // The log must be requested in the constant PORTAL_REQUEST_FORM_ATTRIBUTES // $aDetails[] = array('label' => MetaModel::GetLabel('UserRequest', PORTAL_ATTCODE_LOG), 'value' => ''); if (!empty($aTemplateFields)) { foreach ($aTemplateFields as $sAttCode => $oField) { if (!in_array($sAttCode, $aList)) { $sValue = $oField->GetFormElement($oP, get_class($oRequest)); if ($oField->Get('input_type') == 'hidden') { $aHidden[] = $sValue; } else { $aDetails[] = array('label' => $oField->GetAsHTML('label'), 'value' => $sValue); } } } } $oP->add_linked_script("../js/json.js"); $oP->add_linked_script("../js/forms-json-utils.js"); $oP->add_linked_script("../js/wizardhelper.js"); $oP->add_linked_script("../js/wizard.utils.js"); $oP->add_linked_script("../js/linkswidget.js"); $oP->add_linked_script("../js/extkeywidget.js"); $oP->add_linked_script("../js/jquery.blockUI.js"); $oP->add("
\n"); $oP->add("

".Dict::S('Portal:DescriptionOfTheRequest')."

\n"); $oP->WizardFormStart('request_form', 4); //$oP->add("\n"); $oP->details($aDetails); $oAttPlugin = new AttachmentPlugIn(); $oAttPlugin->OnDisplayRelations($oRequest, $oP, true /* edit */); $oP->DumpHiddenParams($aParameters, $aList); $oP->add(""); $oP->WizardFormButtons(BUTTON_BACK | BUTTON_FINISH | BUTTON_CANCEL); //Back button automatically discarded if on the first page $oP->WizardFormEnd(); $oP->add("\n"); $iFieldsCount = count($aFieldsMap); $sJsonFieldsMap = json_encode($aFieldsMap); $oP->add_ready_script( <<ReadAllParams(PORTAL_ALL_PARAMS.',template_id'); $sTransactionId = utils::ReadPostedParam('transaction_id', ''); if (!utils::IsTransactionValid($sTransactionId)) { $oP->add("

".Dict::S('UI:Error:ObjectAlreadyCreated')."

\n"); //ShowOngoingTickets($oP); return; } // Validate the parameters // 1) ServiceCategory $oSearch = DBObjectSearch::FromOQL(PORTAL_VALIDATE_SERVICECATEGORY_QUERY); $oSearch->AllowAllData(); // In case the user has the rights on his org only $oSet = new CMDBObjectSet($oSearch, array(), array('id' => $aParameters['service_id'], 'org_id' => $oUserOrg->GetKey())); if ($oSet->Count() != 1) { // Invalid service for the current user ! throw new Exception("Invalid Service Category: id={$aParameters['service_id']} - count: ".$oSet->Count()); } $oServiceCategory = $oSet->Fetch(); // 2) Service Subcategory $oSearch = DBObjectSearch::FromOQL(PORTAL_VALIDATE_SERVICESUBCATEGORY_QUERY); $oSearch->AllowAllData(); // In case the user has the rights on his org only $oSet = new CMDBObjectSet($oSearch, array(), array('service_id' => $aParameters['service_id'], 'id' =>$aParameters['servicesubcategory_id'],'org_id' => $oUserOrg->GetKey() )); if ($oSet->Count() != 1) { // Invalid subcategory throw new Exception("Invalid ServiceSubcategory: id={$aParameters['servicesubcategory_id']} for service category ".$oServiceCategory->GetName()."({$aParameters['service_id']}) - count: ".$oSet->Count()); } $oServiceSubCategory = $oSet->Fetch(); $oRequest = new UserRequest(); $oRequest->Set('org_id', $oUserOrg->GetKey()); $oRequest->Set('caller_id', UserRights::GetContactId()); $aList = array('service_id', 'servicesubcategory_id', 'title', 'description', 'impact'); $oRequest->UpdateObjectFromPostedForm(); if (isset($aParameters['moreinfo'])) { // There is a template, insert it into the description $oRequest->Set(PORTAL_ATTCODE_LOG, $aParameters['moreinfo']); } if ((PORTAL_ATTCODE_TYPE != '') && (PORTAL_SET_TYPE_FROM != '')) { $oRequest->Set(PORTAL_ATTCODE_TYPE, $oServiceSubCategory->Get(PORTAL_SET_TYPE_FROM)); } if (MetaModel::IsValidAttCode('UserRequest', 'origin')) { $oRequest->Set('origin', 'portal'); } /////$oP->DoUpdateObjectFromPostedForm($oObj); $oAttPlugin = new AttachmentPlugIn(); $oAttPlugin->OnFormSubmit($oRequest); list($bRes, $aIssues) = $oRequest->CheckToWrite(); if ($bRes) { if (isset($aParameters['template_id'])) { $oTemplate = MetaModel::GetObject('Template', $aParameters['template_id']); $oRequest->Set('public_log', $oTemplate->GetPostedValuesAsText($oRequest)."\n"); $oRequest->DBInsertNoReload(); $oTemplate->RecordExtraDataFromPostedForm($oRequest); } else { $oRequest->DBInsertNoReload(); } $oP->add("

".Dict::Format('UI:Title:Object_Of_Class_Created', $oRequest->GetName(), MetaModel::GetName(get_class($oRequest)))."

\n"); //DisplayObject($oP, $oRequest, $oUserOrg); ShowOngoingTickets($oP); } else { RequestCreationForm($oP, $oUserOrg); $sIssueDesc = Dict::Format('UI:ObjectCouldNotBeWritten', implode(', ', $aIssues)); $oP->add_ready_script("alert('".addslashes($sIssueDesc)."');"); } } /** * Prompts the user for creating a new request * @param WebPage $oP The current web page * @return void */ function CreateRequest(WebPage $oP, Organization $oUserOrg) { switch($oP->GetWizardStep()) { case 0: default: SelectServiceCategory($oP, $oUserOrg); break; case 1: SelectServiceSubCategory($oP, $oUserOrg); break; case 2: SelectRequestTemplate($oP, $oUserOrg); break; case 3: RequestCreationForm($oP, $oUserOrg); break; case 4: DoCreateRequest($oP, $oUserOrg); break; } } /** * Lists all the currently opened User Requests for the current user * @param WebPage $oP The current web page * @return void */ function ListOpenRequests(WebPage $oP) { $oUserOrg = GetUserOrg(); $sOQL = 'SELECT UserRequest WHERE org_id = :org_id AND status NOT IN ("closed", "resolved")'; $oSearch = DBObjectSearch::FromOQL($sOQL); $iUser = UserRights::GetContactId(); if ($iUser > 0 && !IsPowerUser()) { $oSearch->AddCondition('caller_id', $iUser); } $oSet = new CMDBObjectSet($oSearch, array(), array('org_id' => $oUserOrg->GetKey())); $aZList = explode(',', PORTAL_TICKETS_LIST_ZLIST); $oP->DisplaySet($oSet, $aZList, Dict::S('Portal:NoOpenRequest')); } /** * Lists all the currently resolved (not yet closed) User Requests for the current user * @param WebPage $oP The current web page * @return void */ function ListResolvedRequests(WebPage $oP) { $oUserOrg = GetUserOrg(); $sOQL = 'SELECT UserRequest WHERE org_id = :org_id AND status = "resolved"'; $oSearch = DBObjectSearch::FromOQL($sOQL); $iUser = UserRights::GetContactId(); if ($iUser > 0 && !IsPowerUser()) { $oSearch->AddCondition('caller_id', $iUser); } $oSet = new CMDBObjectSet($oSearch, array(), array('org_id' => $oUserOrg->GetKey())); $aZList = explode(',', PORTAL_TICKETS_LIST_ZLIST); $oP->DisplaySet($oSet, $aZList, Dict::S('Portal:NoOpenRequest')); } /** * Lists all the currently closed tickets * @param WebPage $oP The current web page * @return void */ function ListClosedTickets(WebPage $oP) { $aAttSpecs = explode(',', PORTAL_TICKETS_SEARCH_CRITERIA); $aZList = explode(',', PORTAL_TICKETS_CLOSED_ZLIST); $oP->DisplaySearchForm('UserRequest', $aAttSpecs, array('operation' => 'show_closed'), 'search_', false /* => not closed */); $oUserOrg = GetUserOrg(); // UserRequest $oSearch = $oP->PostedParamsToFilter('UserRequest', $aAttSpecs, 'search_'); if(is_null($oSearch)) { $oSearch = new DBObjectSearch('UserRequest'); } $oSearch->AddCondition('org_id', $oUserOrg->GetKey()); $oSearch->AddCondition('status', 'closed'); $iUser = UserRights::GetContactId(); if ($iUser > 0 && !IsPowerUser()) { $oSearch->AddCondition('caller_id', $iUser); } $oSet1 = new CMDBObjectSet($oSearch); $oP->add("

".Dict::S('Portal:ClosedRequests')."

\n"); $oP->DisplaySet($oSet1, $aZList, Dict::S('Portal:NoClosedRequest')); } /** * Display an object - to be customized * @param WebPage $oP The current web page * @param Object $oObj Any kind of object * @param Object $oUserOrg The organization of the logged in user * @return void */ function DisplayObject($oP, $oObj, $oUserOrg) { switch(get_class($oObj)) { case 'UserRequest': ShowDetailsRequest($oP, $oObj); break; default: throw new Exception("The class ".get_class($oObj)." is not handled through the portal"); } } /** * Displays the details of a request * @param WebPage $oP The current web page * @param Object $oObj The target object * @return void */ function ShowDetailsRequest(WebPage $oP, $oObj) { $sClass = get_class($oObj); $bIsEscalateButton = false; $bIsReopenButton = false; $bIsCloseButton = false; $bEditAttachments = false; $aEditAtt = array(); // List of attributes editable in the main form if (!MetaModel::DBIsReadOnly()) { switch($oObj->GetState()) { case 'new': case 'assigned': case 'frozen': case 'pending': $aEditAtt = array( PORTAL_ATTCODE_LOG => '????' ); $bEditAttachments = true; // disabled - $bIsEscalateButton = true; break; case 'escalated_tto': case 'escalated_ttr': $aEditAtt = array( PORTAL_ATTCODE_LOG => '????' ); $bEditAttachments = true; break; case 'resolved': $aEditAtt = array(); if (array_key_exists('ev_reopen', MetaModel::EnumStimuli($sClass))) { $bIsReopenButton = true; MakeStimulusForm($oP, $oObj, 'ev_reopen', array(PORTAL_ATTCODE_LOG)); } $bIsCloseButton = true; MakeStimulusForm($oP, $oObj, 'ev_close', array('user_satisfaction', PORTAL_ATTCODE_COMMENT)); break; case 'closed': case 'closure_requested': default: break; } } // REFACTORISER LA MISE EN FORME $oP->add("

".$oObj->GetIcon()." ".Dict::Format('Portal:TitleRequestDetailsFor_Request', $oObj->GetName())."

\n"); switch($sClass) { case 'UserRequest': $aAttList = json_decode(PORTAL_TICKET_DETAILS_ZLIST, true); switch($oObj->GetState()) { case 'closed': $aAttList['centered'][] = 'user_satisfaction'; $aAttList['centered'][] = PORTAL_ATTCODE_COMMENT; } break; default: array('col:left'=> array('ref','service_id','servicesubcategory_id','title','description'),'col:right'=> array('status','start_date')); break; } // Remove the edited attribute from the shown attributes // foreach($aEditAtt as $sAttCode => $foo) { foreach($aAttList as $col => $aColumn) { if (in_array($sAttCode, $aColumn)) { if(($index = array_search($sAttCode, $aColumn)) !== false) { unset($aAttList[$col][$index]); } } } } $oP->add("
\n"); $oP->WizardFormStart('request_form', null); $oP->add('
'); $oP->add('
'); $oP->add(''); $oP->add(''); $oP->add(''); $oP->add(''); if (array_key_exists('centered', $aAttList)) { $oP->add(''); $oP->add(''); $oP->add(''); } // REFACTORISER $oP->add(''); $oP->add(''); $oP->add(''); $oP->add(''); $oP->add('
'); $oP->DisplayObjectDetails($oObj, $aAttList['col:left']); $oP->add(''); $oP->DisplayObjectDetails($oObj, $aAttList['col:right']); $oP->add('
'); $oP->DisplayObjectDetails($oObj, $aAttList['centered']); $oP->add('
'); $oAttPlugin = new AttachmentPlugIn(); if ($bEditAttachments) { $oAttPlugin->EnableDelete(false); $oAttPlugin->OnDisplayRelations($oObj, $oP, true /* edit */); } else { $oAttPlugin->OnDisplayRelations($oObj, $oP, false /* read */); } $oP->add('
'); //$oP->add("
\n"); //$oP->add(''); $oP->add(''); $oP->add(''); $oP->add(''); $oP->add(''); $oP->add('
'); //$oP->add("

".Dict::Format('Portal:CommentsFor_Request', $oObj->GetName())."

\n"); $oP->add(""); $oP->add("GetKey()."\">"); $oP->add(""); $oP->add("\n"); $oP->add_script( << $foo) { $sValue = $oObj->Get($sAttCode); $sDisplayValue = $oObj->GetEditValue($sAttCode); $aArgs = array('this' => $oObj, 'formPrefix' => ''); $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode); $sInputId = 'input_'.$sAttCode; $sHTMLValue = "".cmdbAbstractObject::GetFormElementForField($oP, $sClass, $sAttCode, $oAttDef, $sValue, $sDisplayValue, $sInputId, '', 0 /*$iFlags*/, $aArgs).''; $aEditFields[$sAttCode] = array( 'label' => MetaModel::GetLabel($sClass, $sAttCode), 'value' => $sHTMLValue ); } foreach($aEditFields as $sAttCode => $aFieldSpec) { if ($sAttCode == PORTAL_ATTCODE_LOG) { // Skip, the public log will be displayed below the buttons continue; } $oP->add("
"); $oP->add('

'.$aFieldSpec['label'].'

'); $oP->add($aFieldSpec['value']); $oP->add('
'); } if($bIsReopenButton) { $sStimulusCode = 'ev_reopen'; $sTitle = addslashes(Dict::S('Portal:Button:ReopenTicket')); $sOk = addslashes(Dict::S('UI:Button:Ok')); $oP->p(''); } if($bIsCloseButton) { $sStimulusCode = 'ev_close'; $sTitle = addslashes(Dict::S('Portal:Button:CloseTicket')); $sOk = addslashes(Dict::S('UI:Button:Ok')); $oP->p(''); } elseif (count($aEditAtt) > 0) { $oP->p(''); } if ($bIsEscalateButton) { $sStimulusCode = 'ev_timeout'; $oP->p(''); } $oP->add('
'); if (isset($aEditFields[PORTAL_ATTCODE_LOG])) { $oP->add("
"); $oP->add('

'.$aEditFields[PORTAL_ATTCODE_LOG]['label'].'

'); $oP->add($aEditFields[PORTAL_ATTCODE_LOG]['value']); $oP->add('
'); } else { $oP->add('

'.MetaModel::GetLabel($sClass, PORTAL_ATTCODE_LOG).'

'); $oP->add($oObj->GetAsHTML(PORTAL_ATTCODE_LOG)); } $oP->add('
'); $oP->add(''); $oP->WizardFormEnd(); $oP->add(''); } /** * Create form to apply a stimulus * @param WebPage $oP The current web page * @param Object $oObj The target object * @param String $sStimulusCode Stimulus that will be applied * @param Array $aEditAtt List of attributes to edit * @return void */ function MakeStimulusForm(WebPage $oP, $oObj, $sStimulusCode, $aEditAtt) { static $bHasStimulusForm = false; $sDialogId = $sStimulusCode."_dialog"; $sFormId = $sStimulusCode."_form"; $sCancelButtonLabel = Dict::S('UI:Button:Cancel'); $oP->add('
'); if (!$bHasStimulusForm) { $bHasStimulusForm = true; $oP->add_script( << Can fail if (is_object($oContact)) { $oOrg = MetaModel::GetObject('Organization', $oContact->Get('org_id'), false); // false => can fail } else { throw new Exception(Dict::S('Portal:ErrorNoContactForThisUser')); } return $oOrg; } /** * Determine if the current user can be considered as being a portal power user */ function IsPowerUSer() { $iUserID = UserRights::GetUserId(); $sOQLprofile = "SELECT URP_Profiles AS p JOIN URP_UserProfile AS up ON up.profileid=p.id WHERE up.userid = :user AND p.name = :profile"; $oProfileSet = new DBObjectSet( DBObjectSearch::FromOQL($sOQLprofile), array(), array( 'user' => $iUserID, 'profile' => PORTAL_POWER_USER_PROFILE, ) ); $bRes = ($oProfileSet->count() > 0); return $bRes; } /////////////////////////////////////////////////////////////////////////////// // // Main program // /////////////////////////////////////////////////////////////////////////////// try { require_once(APPROOT.'/application/startup.inc.php'); require_once(APPROOT.'/application/portalwebpage.class.inc.php'); $oAppContext = new ApplicationContext(); $sOperation = utils::ReadParam('operation', ''); require_once(APPROOT.'/application/loginwebpage.class.inc.php'); LoginWebPage::DoLogin(false /* bMustBeAdmin */, true /* IsAllowedToPortalUsers */); // Check user rights and prompt if needed ApplicationContext::SetUrlMakerClass('MyPortalURLMaker'); if (!class_exists('UserRequest')) { $oP = new WebPage(Dict::S('Portal:Title')); $oP->p(dict::Format('Portal:NoRequestMgmt', UserRights::GetUserFriendlyName())); } else { $oUserOrg = GetUserOrg(); $sCode = $oUserOrg->Get('code'); $sAlternateStylesheet = ''; if (@file_exists("./$sCode/portal.css")) { $sAlternateStylesheet = "$sCode"; } $oP = new PortalWebPage(Dict::S('Portal:Title'), $sAlternateStylesheet); $oP->EnableDisconnectButton(utils::CanLogOff()); $oP->SetWelcomeMessage(Dict::Format('Portal:WelcomeUserOrg', UserRights::GetUserFriendlyName(), $oUserOrg->GetName())); if (is_object($oUserOrg)) { switch($sOperation) { case 'show_closed': $oP->set_title(Dict::S('Portal:ShowClosed')); DisplayMainMenu($oP); ShowClosedTickets($oP); break; case 'create_request': $oP->set_title(Dict::S('Portal:CreateNewRequest')); DisplayMainMenu($oP); if (!MetaModel::DBIsReadOnly()) { CreateRequest($oP, $oUserOrg); } break; case 'details': $oP->set_title(Dict::S('Portal:TitleDetailsFor_Request')); DisplayMainMenu($oP); $oObj = $oP->FindObjectFromArgs(array('UserRequest')); DisplayObject($oP, $oObj, $oUserOrg); break; case 'update_request': $oP->set_title(Dict::S('Portal:TitleDetailsFor_Request')); DisplayMainMenu($oP); if (!MetaModel::DBIsReadOnly()) { $oObj = $oP->FindObjectFromArgs(array('UserRequest')); switch(get_class($oObj)) { case 'UserRequest': $aAttList = array(PORTAL_ATTCODE_LOG, 'user_satisfaction', PORTAL_ATTCODE_COMMENT); break; default: throw new Exception("Implementation issue: unexpected class '".get_class($oObj)."'"); } try { $oP->DoUpdateObjectFromPostedForm($oObj, $aAttList); $oObj->Reload(); // Make sure the object is in good shape to be displayed } catch(TransactionException $e) { $oP->add("

".Dict::S('UI:Error:ObjectAlreadyUpdated')."

\n"); } DisplayObject($oP, $oObj, $oUserOrg); } break; case 'show_ongoing': default: $oP->set_title(Dict::S('Portal:ShowOngoing')); DisplayMainMenu($oP); ShowOngoingTickets($oP); } } } $oP->output(); } catch(CoreException $e) { require_once(APPROOT.'/setup/setuppage.class.inc.php'); $oP = new SetupPage(Dict::S('UI:PageTitle:FatalError')); $oP->add("

".Dict::S('UI:FatalErrorMessage')."

\n"); $oP->error(Dict::Format('UI:Error_Details', $e->getHtmlDesc())); //$oP->p($e->getTraceAsString()); $oP->output(); if (MetaModel::IsLogEnabledIssue()) { if (MetaModel::IsValidClass('EventIssue')) { try { $oLog = new EventIssue(); $oLog->Set('message', $e->getMessage()); $oLog->Set('userinfo', ''); $oLog->Set('issue', $e->GetIssue()); $oLog->Set('impact', 'Page could not be displayed'); $oLog->Set('callstack', $e->getTrace()); $oLog->Set('data', $e->getContextData()); $oLog->DBInsertNoReload(); } catch(Exception $e) { IssueLog::Error("Failed to log issue into the DB"); } } IssueLog::Error($e->getMessage()); } // For debugging only //throw $e; } catch(Exception $e) { require_once(APPROOT.'/setup/setuppage.class.inc.php'); $oP = new SetupPage(Dict::S('UI:PageTitle:FatalError')); $oP->add("

".Dict::S('UI:FatalErrorMessage')."

\n"); $oP->error(Dict::Format('UI:Error_Details', $e->getMessage())); //$oP->p($e->getTraceAsString()); $oP->output(); if (MetaModel::IsLogEnabledIssue()) { if (MetaModel::IsValidClass('EventIssue')) { try { $oLog = new EventIssue(); $oLog->Set('message', $e->getMessage()); $oLog->Set('userinfo', ''); $oLog->Set('issue', 'PHP Exception'); $oLog->Set('impact', 'Page could not be displayed'); $oLog->Set('callstack', $e->getTrace()); $oLog->Set('data', array()); $oLog->DBInsertNoReload(); } catch(Exception $e) { IssueLog::Error("Failed to log issue into the DB"); } } IssueLog::Error($e->getMessage()); } } ?>