protected function _DoExecute($oTrigger, $aContextArgs, &$oLog) { $sPreviousUrlMaker = ApplicationContext::SetUrlMakerClass(); try { $sScriptPath = $this->Get('script_path'); if (!is_executable($sScriptPath)) { throw new Exception('cannot execute script'); } $sCMD = ''; $aParams = explode("\n", $this->Get('params')); array_walk($aParams, function (&$aParam) { $aParam = explode('=', $aParam); $aParam = array_map('trim', $aParam); }); foreach ($aParams as $aParam) { if (count($aParam) == 2) { $sVarName = $aParam[0]; $sVarValue = MetaModel::ApplyParams($aParam[1], $aContextArgs); if ($sVarValue == $aParam[1]) { $sVarValue = ''; // Значит ApplyParams не нашел такого плейсхолдера if ($this->IsBeingTested() && !is_null($oLog)) { $oLog->Set('log', $oLog->Get('log') . "There is no value for placeholder: {$aParam['1']}\n"); } } } else { $sVarName = $aParam[0]; $sVarValue = MetaModel::ApplyParams($aParam[0], $aContextArgs); if ($sVarValue == $aParam[0]) { $sVarValue = ''; if ($this->IsBeingTested() && !is_null($oLog)) { $oLog->Set('log', $oLog->Get('log') . "There is no value for placeholder: {$aParam['0']}\n"); } } } $sVarName = str_replace('->', '_', $sVarName); $sVarName = str_replace('$', '', $sVarName); $sVarName = strtoupper($sVarName); $sCMD .= $sVarName . '="' . $sVarValue . '" '; } $sCMD .= ' ' . $sScriptPath; if ($this->IsBeingTested()) { if (!is_null($oLog)) { $oLog->Set('log', $oLog->Get('log') . "Start executing shell command:\n{$sCMD}"); } return "Script will be started."; } if (!is_null($oLog)) { $oLog->Set('log', shell_exec($sCMD)); } return "Script {$sScriptPath} successfully started."; } catch (Exception $e) { ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker); throw $e; // Ошибка выбрасывается на верхний уровень и записывается в лог оповещения. } ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker); }
public function Render(WebPage $oPage, $aParams = array()) { $this->m_sTemplate = MetaModel::ApplyParams($this->m_sTemplate, $aParams); $iStart = 0; $iEnd = strlen($this->m_sTemplate); $iCount = 0; $iBeforeTagPos = $iStart; $iAfterTagPos = $iStart; while ($sTag = $this->GetNextTag($iStart, $iEnd)) { $sContent = $this->GetTagContent($sTag, $iStart, $iEnd); $iAfterTagPos = $iEnd + strlen('</' . $sTag . '>'); $sOuterTag = substr($this->m_sTemplate, $iStart, $iAfterTagPos - $iStart); $oPage->add(substr($this->m_sTemplate, $iBeforeTagPos, $iStart - $iBeforeTagPos)); if ($sTag == DisplayBlock::TAG_BLOCK) { try { $oBlock = DisplayBlock::FromTemplate($sOuterTag); if (is_object($oBlock)) { $oBlock->Display($oPage, 'block_' . self::$iBlockCount, $aParams); } } catch (OQLException $e) { $oPage->p('Error in template (please contact your administrator) - Invalid query<!--' . $sOuterTag . '-->'); } catch (Exception $e) { $oPage->p('Error in template (please contact your administrator)<!--' . $e->getMessage() . '--><!--' . $sOuterTag . '-->'); } self::$iBlockCount++; } else { $aAttributes = $this->GetTagAttributes($sTag, $iStart, $iEnd); //$oPage->p("Tag: $sTag - ($iStart, $iEnd)"); $this->RenderTag($oPage, $sTag, $aAttributes, $sContent); } $iAfterTagPos = $iEnd + strlen('</' . $sTag . '>'); $iBeforeTagPos = $iAfterTagPos; $iStart = $iEnd; $iEnd = strlen($this->m_sTemplate); $iCount++; } $oPage->add(substr($this->m_sTemplate, $iAfterTagPos)); }
protected function _DoExecute($oTrigger, $aContextArgs, &$oLog) { $sPreviousUrlMaker = ApplicationContext::SetUrlMakerClass(); try { $this->m_iRecipients = 0; $this->m_aMailErrors = array(); $bRes = false; // until we do succeed in sending the email // Determine recicipients // $sTo = $this->FindRecipients('to', $aContextArgs); $sCC = $this->FindRecipients('cc', $aContextArgs); $sBCC = $this->FindRecipients('bcc', $aContextArgs); $sFrom = MetaModel::ApplyParams($this->Get('from'), $aContextArgs); $sReplyTo = MetaModel::ApplyParams($this->Get('reply_to'), $aContextArgs); $sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs); $sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs); $oObj = $aContextArgs['this->object()']; $sMessageId = sprintf('iTop_%s_%d_%f@%s.openitop.org', get_class($oObj), $oObj->GetKey(), microtime(true), MetaModel::GetEnvironmentId()); $sReference = '<' . $sMessageId . '>'; } catch (Exception $e) { ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker); throw $e; } ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker); if (!is_null($oLog)) { // Note: we have to secure this because those values are calculated // inside the try statement, and we would like to keep track of as // many data as we could while some variables may still be undefined if (isset($sTo)) { $oLog->Set('to', $sTo); } if (isset($sCC)) { $oLog->Set('cc', $sCC); } if (isset($sBCC)) { $oLog->Set('bcc', $sBCC); } if (isset($sFrom)) { $oLog->Set('from', $sFrom); } if (isset($sSubject)) { $oLog->Set('subject', $sSubject); } if (isset($sBody)) { $oLog->Set('body', $sBody); } } $oEmail = new EMail(); if ($this->IsBeingTested()) { $oEmail->SetSubject('TEST[' . $sSubject . ']'); $sTestBody = $sBody; $sTestBody .= "<div style=\"border: dashed;\">\n"; $sTestBody .= "<h1>Testing email notification " . $this->GetHyperlink() . "</h1>\n"; $sTestBody .= "<p>The email should be sent with the following properties\n"; $sTestBody .= "<ul>\n"; $sTestBody .= "<li>TO: {$sTo}</li>\n"; $sTestBody .= "<li>CC: {$sCC}</li>\n"; $sTestBody .= "<li>BCC: {$sBCC}</li>\n"; $sTestBody .= "<li>From: {$sFrom}</li>\n"; $sTestBody .= "<li>Reply-To: {$sReplyTo}</li>\n"; $sTestBody .= "<li>References: {$sReference}</li>\n"; $sTestBody .= "</ul>\n"; $sTestBody .= "</p>\n"; $sTestBody .= "</div>\n"; $oEmail->SetBody($sTestBody); $oEmail->SetRecipientTO($this->Get('test_recipient')); $oEmail->SetRecipientFrom($this->Get('test_recipient')); $oEmail->SetReferences($sReference); $oEmail->SetMessageId($sMessageId); } else { $oEmail->SetSubject($sSubject); $oEmail->SetBody($sBody); $oEmail->SetRecipientTO($sTo); $oEmail->SetRecipientCC($sCC); $oEmail->SetRecipientBCC($sBCC); $oEmail->SetRecipientFrom($sFrom); $oEmail->SetRecipientReplyTo($sReplyTo); $oEmail->SetReferences($sReference); $oEmail->SetMessageId($sMessageId); } if (isset($aContextArgs['attachments'])) { $aAttachmentReport = array(); foreach ($aContextArgs['attachments'] as $oDocument) { $oEmail->AddAttachment($oDocument->GetData(), $oDocument->GetFileName(), $oDocument->GetMimeType()); $aAttachmentReport[] = array($oDocument->GetFileName(), $oDocument->GetMimeType(), strlen($oDocument->GetData())); } $oLog->Set('attachments', $aAttachmentReport); } if (empty($this->m_aMailErrors)) { if ($this->m_iRecipients == 0) { return 'No recipient'; } else { $iRes = $oEmail->Send($aErrors, false, $oLog); // allow asynchronous mode switch ($iRes) { case EMAIL_SEND_OK: return "Sent"; case EMAIL_SEND_PENDING: return "Pending"; case EMAIL_SEND_ERROR: return "Errors: " . implode(', ', $aErrors); } } } else { if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0) { $sError = implode(', ', $this->m_aMailErrors); } else { $sError = 'Unknown reason'; } return 'Notification was not sent: ' . $sError; } }