2014-10-07 6 views
2

Недавно появившийся в SugarCRM, ATM, я должен реализовать пользовательский Logger, идея состоит в том, чтобы получить некоторые релевантные данные из объекта Bean после логического перехода save и поместить его в XML (по запросу). Я думаю, что реализация его как модуля Sugar может быть неправильным подходом.SugarCRM: добавление пользовательского класса помощника

Вопрос в том, где его право поставить мой класс в иерархии каталогов и как его загрузить?

Заранее спасибо

+0

возможно дубликат [Можно ли создавать пользовательские журналы файлы в Sugar CRM своих методов?] (Http://stackoverflow.com/questions/26143788/can-we-create-custom-logs-files- in-sugar-crm-through-its-own-methods) –

+0

@MatthewPoer, пожалуйста, прочитайте вопрос, у меня нет проблем с тем, как реализовать Logger, у меня проблема с тем, куда я должен поместить свой код. Cheers, Vova –

+1

Суть в этом сообщении предполагает 'custom/Company/Helper/Logger.php', который кажется мне странным, я бы создал файл класса в' custom/include/MyLogger.php', чтобы он мог быть легко найдено, требуется и вызывается в логических перехватах. –

ответ

4

Вы хотите поместить свой класс в пользовательском/включить/SugarLogger и назвать это что-то вроде SugarXMLLogger (это гибкое, но следует конвенции в SugarCRM). Не забудьте назвать класс таким же, как файл.

Вы должны реализовать LoggerTemplate, по крайней мере, и, если вы хотите, чтобы полная структура регистратора по умолчанию, используемого SugarCRM, вы хотели бы расширить SugarLogger. Однако для простого XML-регистратора это не обязательно.

Хотя я знаю, что вы не запрашивали код для фактического ведения журнала, при тестировании фактического создания пользовательского регистратора я решил его создать. Это моя попытка простого XML-регистратора с использованием SimpleXML. Я протестировал это против Ping API, чтобы посмотреть, как он работает, используя как фатальные журналы для XML, так и все журналы в XML.

<?php 
/** 
* Save to custom/include/SugarLogger/SugarXMLLogger.php 
* 
* Usage: 
* To make one particular log level write to the XML log do this: 
* ```php 
* <?php 
* LoggerManager::setLogger('fatal', 'SugarXMLLogger'); 
* $GLOBALS['log']->fatal('Testing out the XML logger'); 
* ``` 
* 
* To make all levels log to the XML log, do this 
* ```php 
* <?php 
* LoggerManager::setLogger('default', 'SugarXMLLogger'); 
* $GLOBALS['log']->warn('Testing out the XML logger'); 
* ``` 
*/ 

/** 
* Get the interface that his logger should implement 
*/ 
require_once 'include/SugarLogger/LoggerTemplate.php'; 

/** 
* SugarXMLLogger - A very simple logger that will save log entries into an XML 
* log file 
*/ 
class SugarXMLLogger implements LoggerTemplate 
{ 
    /** 
    * The name of the log file 
    * 
    * @var string 
    */ 
    protected $logfile = 'sugarcrm.log.xml'; 

    /** 
    * The format for the timestamp entry of the log 
    * 
    * @var string 
    */ 
    protected $dateFormat = '%c'; 

    /** 
    * The current SimpleXMLElement logger resource 
    * 
    * @var SimpleXMLElement 
    */ 
    protected $currentData; 

    /** 
    * Logs an entry to the XML log 
    * 
    * @param string $level The log level being logged 
    * @param array $message The message to log 
    * @return boolean True if the log was saved 
    */ 
    public function log($level, $message) 
    { 
     // Get the current log XML 
     $this->setCurrentLog(); 

     // Append to it 
     $this->appendToLog($level, $message); 

     // Save it 
     return $this->saveLog(); 
    } 

    /** 
    * Saves the log file 
    * 
    * @return boolean True if the save was successful 
    */ 
    protected function saveLog() 
    { 
     $write = $this->currentData->asXML(); 
     return sugar_file_put_contents_atomic($this->logfile, $write); 
    } 

    /** 
    * Sets the SimpleXMLElement log object 
    * 
    * If there is an existing log, it will consume it. Otherwise it will create 
    * a SimpleXMLElement object from a default construct. 
    */ 
    protected function setCurrentLog() 
    { 
     if (file_exists($this->logfile)) { 
      $this->currentData = simplexml_load_file($this->logfile); 
     } else { 
      sugar_touch($this->logfile); 
      $this->currentData = simplexml_load_string("<?xml version='1.0' standalone='yes'?><entries></entries>"); 
     } 
    } 

    /** 
    * Adds an entry of level $level to the log, with message $message 
    * 
    * @param string $level The log level being logged 
    * @param array $message The message to log 
    */ 
    protected function appendToLog($level, $message) 
    { 
     // Set some basics needed for every entry, starting with the current 
     // user id 
     $userID = $this->getUserID(); 

     // Get the process id 
     $pid = getmypid(); 

     // Get the message to log 
     $message = $this->getMessage($message); 

     // Set the timestamp 
     $timestamp = strftime($this->dateFormat); 

     // Add it to the data now 
     $newEntry = $this->currentData->addChild('entry'); 
     $newEntry->addChild('timestamp', $timestamp); 
     $newEntry->addChild('pid', $pid); 
     $newEntry->addChild('userid', $userID); 
     $newEntry->addChild('level', $level); 
     $newEntry->addChild('message', $message); 
    } 

    /** 
    * Gets the user id for the current user, or '-none-' if the current user ID 
    * is not attainable 
    * 
    * @return string The ID of the current user 
    */ 
    protected function getUserID() 
    { 
     if (!empty($GLOBALS['current_user']->id)) { 
      return $GLOBALS['current_user']->id; 
     } 

     return '-none-'; 
    } 

    /** 
    * Gets the message in a loggable format 
    * 
    * @param mixed $message The message to log, as a string or an array 
    * @return string The message to log, as a string 
    */ 
    protected function getMessage($message) 
    { 
     if (is_array($message) && count($message) == 1) { 
      $message = array_shift($message); 
     } 

     // change to a human-readable array output if it's any other array 
     if (is_array($message)) { 
      $message = print_r($message,true); 
     } 

     return $message; 
    } 
}