ModuleLs

Package engine.modules
Inheritance class ModuleLs » Module » LsObject
Since 1.0
Source Code /engine/modules/ls/Ls.class.php
Модуль Ls Для выполнения служебных действий LiveStreet CMS. В частности для отправки на сервер LiveStreet информации о домене сайта, версии плагинов и LS. Эти данные не разглашаются и используются исключительно в целях развития LiveStreet CMS, оценки спроса, отслеживания интересов аудитории. Так же вы можете благодаря этому получать уведомления о новых версиях установленных плагинов и шаблонов. Вы всегда можете отключить передачу данных в конфиге, но просим этого не далать, тем самым вы поможете развитию LS CMS. Это важно для нас.

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
aDataForSend array Список данных для отправки ModuleLs
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
oEngine Engine Объект ядра Module
sUrlLs string Адрес шлюза ModuleLs

Public Methods

Hide inherited methods

MethodDescriptionDefined By
CheckVerificationKey() Проверка ключа, в ответ браузеру выдается только сообщение "ok" или "no" ModuleLs
Init() Инициализируем модуль ModuleLs
InjectCounter() Вставка счетчика GA с учетом его возможного повторного использования ModuleLs
InjectImgForSendToLs() Возвращает строчку для инжекции в шаблон ModuleLs
SenderRun() Запуск сбора данных ModuleLs
SetInit() Помечает модуль как инициализированный Module
Shutdown() Метод срабатывает при завершении работы ядра Module
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля Module
__construct() При создании модуля передаем объект ядра Module
isInit() Возвращает значение флага инициализации модуля Module

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
ErrorSendToLs() Отмечает факт ошибки при отправки данных, увеличиваем число попыток ModuleLs
GetDataForSendToLs() Возвращает данные для отправки ModuleLs
GetMarkerFile() Читает данные из файла ModuleLs
SendToLs() Отправка данных на шлюз LS ModuleLs
SetMarkerFile() Записывает данные в файл ModuleLs
SuccessfulSendToLs() Отмечает факт успешной отправки данных ModuleLs
__clone() Блокируем копирование/клонирование объекта Module
getUrl() Чтение URL ModuleLs
makeGetParams() Формирует строку GET параметров ModuleLs

Property Details

aDataForSend property
protected array $aDataForSend;

Список данных для отправки

sUrlLs property
protected string $sUrlLs;

Адрес шлюза

Method Details

CheckVerificationKey() method
public void CheckVerificationKey()
Source Code: /engine/modules/ls/Ls.class.php#75 (show)
public function CheckVerificationKey() {
    if (
Router::GetAction()=='error' and isset($_GET['livestreet_check_verification_key'])) {
        
$sKey=trim((string)Config::Get('module.ls.verification_key'));
        if (
$sKey and $_GET['livestreet_check_verification_key']===$sKey) {
            echo(
'ok');
            exit();
        }
        echo(
'no');
        exit();
    }
}

Проверка ключа, в ответ браузеру выдается только сообщение "ok" или "no"

ErrorSendToLs() method
protected void ErrorSendToLs()
Source Code: /engine/modules/ls/Ls.class.php#159 (show)
protected function ErrorSendToLs() {
    if (!(
$aData=$this->GetMarkerFile(date("Y-m-d")))) {
        
$aData=array();
    }
    if (isset(
$aData['count_try'])) {
        
$aData['count_try']++;
    } else {
        
$aData['count_try']=1;
    }
    
$this->SetMarkerFile(date("Y-m-d"),$aData);
}

Отмечает факт ошибки при отправки данных, увеличиваем число попыток

GetDataForSendToLs() method
protected array GetDataForSendToLs()
{return} array
Source Code: /engine/modules/ls/Ls.class.php#221 (show)
protected function GetDataForSendToLs() {
    
/**
     * Формируем данные для отправки
     */
    
$aData=array();
    
$aData['ls_v']=LS_VERSION;
    
/**
     * Список плагинов с версиями
     */
    
$aPlugins=$this->Plugin_GetList();
    foreach(
$aPlugins as $aPlugin) {
        
$aData['plugins']['code'][]=$aPlugin['code'];
        
$aData['plugins']['ia'][]=$aPlugin['is_active'];
        
$aData['plugins']['v'][]=$aPlugin['property']->version;
    }
    
/**
     * Домен
     */
    
$aData['domain']=Config::Get('path.root.web');
    
/**
     * Шаблон
     */
    
$aData['template']=Config::Get('view.skin');
    
/**
     * Ключ верификации (подтверждения прав на сайт)
     */
    
$aData['key']=(string)Config::Get('module.ls.verification_key');

    return 
$aData;
}

Возвращает данные для отправки

GetMarkerFile() method
protected bool|mixed GetMarkerFile(string $sDate)
$sDate string Дата под которой сохранен файл
{return} bool|mixed
Source Code: /engine/modules/ls/Ls.class.php#182 (show)
protected function GetMarkerFile($sDate) {
    
$sFile=Config::Get('sys.cache.dir').'lssender-'.$sDate;
    if (!
file_exists($sFile)) {
        return 
false;
    }
    if (
$aData=@unserialize(file_get_contents($sFile))) {
        return 
$aData;
    }
    return 
false;
}

Читает данные из файла

Init() method
public void Init()
Source Code: /engine/modules/ls/Ls.class.php#47 (show)
public function Init() {

}

Инициализируем модуль

InjectCounter() method
public mixed InjectCounter()
{return} mixed
Source Code: /engine/modules/ls/Ls.class.php#91 (show)
public function InjectCounter() {
    
/**
     * Если _gaq уже определена, значит загружать js код GA не нужно
     */
    
$sCounter="
        <script type=\"text/javascript\">
        var _lsIsLoadGA=(typeof(window._gaq)=='undefined') ? false : true ;

          var _gaq = _gaq || [];
          _gaq.push(['lscounter._setAccount', 'UA-28922093-1']);
          _gaq.push(['lscounter._trackPageview']);

        if (!_lsIsLoadGA) {
          (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
          })();
        }
        </script>
    "
;

    return 
$sCounter;
}

Вставка счетчика GA с учетом его возможного повторного использования

InjectImgForSendToLs() method
public string InjectImgForSendToLs()
{return} string
Source Code: /engine/modules/ls/Ls.class.php#211 (show)
public function InjectImgForSendToLs() {
    
$this->SuccessfulSendToLs();
    
$sUrl=$this->sUrlLs.'img/?'.$this->makeGetParams($this->aDataForSend);
    return 
'<img width="1" height="1" src="'.$sUrl.'">';
}

Возвращает строчку для инжекции в шаблон

SendToLs() method
protected void SendToLs()
Source Code: /engine/modules/ls/Ls.class.php#118 (show)
protected function SendToLs() {
    
/**
     * Ограничения на запуск отправки, чтобы не нагружать сайт
     * Отправляем 1 раз в день ночью в промежутке 00:00-07:00, делаем по 20 попыток отправки в день
     */
    
if ((int)date('G')>=7) {
        return;
    }
    if (
$aData=$this->GetMarkerFile(date("Y-m-d")) and (isset($aData['is_send']) or (isset($aData['count_try']) and $aData['count_try']>20))) {
        return;
    }

    
$this->aDataForSend=$this->GetDataForSendToLs();

    
$bOk=false;
    
$sResponse=$this->getUrl($this->sUrlLs,$this->aDataForSend);
    if (
$sResponse===false) {
        
/**
         * Отправка не удалась, скорее всего нет нужных расширений, пробуем передать данные через клиента инжекцией тега <img/>
         * Такой способ отправки нужно делать только для админа сайта, чтобы не "засветить" данные третьим лицам.
         */
        //$this->Hook_AddExecModule('template_body_end','Ls_InjectImgForSendToLs',-2000);
    
} else {
        if (
$sResponse=='accepted') {
            
$bOk=true;
        } else {
            
// очень странная ситуация, скорее всего временно не работает сервер
        
}
    }
    
/**
     * Отмечаем факт отправки
     */
    
if ($bOk) {
        
$this->SuccessfulSendToLs();
    } else {
        
$this->ErrorSendToLs();
    }
}

Отправка данных на шлюз LS

SenderRun() method
public bool SenderRun()
{return} bool
Source Code: /engine/modules/ls/Ls.class.php#55 (show)
public function SenderRun() {
    
$this->CheckVerificationKey();
    if (!
Config::Get('module.ls.send_general')) {
        return 
false;
    }
    
/**
     * Вставка счетчика
     */
    
if (Config::Get('module.ls.use_counter')) {
        
// лучше вставлять в html_head_end, но здесь нужно постараться вставить код в самом конце, чтобы уменьшить вероятность повторного вызова GA, если сайт его использует
        
$this->Hook_AddExecModule('template_body_end','Ls_InjectCounter',-10000);
    }
    
/**
     * Отправка данных
     */
    
$this->SendToLs();
}

Запуск сбора данных

SetMarkerFile() method
protected bool SetMarkerFile(string $sDate, array $aData)
$sDate string Дата
$aData array Данные
{return} bool
Source Code: /engine/modules/ls/Ls.class.php#199 (show)
protected function SetMarkerFile($sDate,$aData) {
    
$sFile=Config::Get('sys.cache.dir').'lssender-'.$sDate;
    if (@
file_put_contents($sFile,serialize($aData))) {
        return 
true;
    }
    return 
false;
}

Записывает данные в файл

SuccessfulSendToLs() method
protected void SuccessfulSendToLs()
Source Code: /engine/modules/ls/Ls.class.php#173 (show)
protected function SuccessfulSendToLs() {
    
$this->SetMarkerFile(date("Y-m-d"),array('is_send'=>1));
}

Отмечает факт успешной отправки данных

getUrl() method
protected bool|string getUrl(string $sUrl, array $aParams)
$sUrl string Урл
$aParams array параметры
{return} bool|string
Source Code: /engine/modules/ls/Ls.class.php#258 (show)
protected function getUrl($sUrl,$aParams) {
    if (
function_exists('curl_init')) {
        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$sUrl);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_POSTFIELDS,$this->makeGetParams($aParams));
        
curl_setopt($chCURLOPT_CONNECTTIMEOUT5);

        
$sData curl_exec($ch);
        if (
curl_errno($ch)) {
            
curl_close($ch);
            return 
false;
        }
        
curl_close($ch);
        return 
$sData;
    } else {
        
$aUrl=parse_url($sUrl);
        
$socket = @fsockopen($aUrl['host'], isset($aUrl['port']) ? $aUrl['port'] : 80$errno$errstr5);

        if(!
$socket) {
            return 
false;
        }

        
//собираем данные
        
$data $this->makeGetParams($aParams);

        
fwrite($socket"POST {$aUrl['path']} HTTP/1.1\r\n");
        
fwrite($socket"Host: {$aUrl['host']}\r\n");
        
fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
        
fwrite($socket,"Content-length:".strlen($data)."\r\n");
        
fwrite($socket,"Accept:*/*\r\n");
        
fwrite($socket,"User-agent:Opera 10.00\r\n");
        
fwrite($socket,"Connection: Close\r\n");
        
fwrite($socket,"\r\n");
        
fwrite($socket,"$data\r\n");
        
fwrite($socket,"\r\n");

        
$sData '';
        while ( (
$line fgets($socket4096)) !== false) {
            
$sData.= $line;
        }
        
//закрываем сокет
        
fclose($socket);
        
$sData trim(substr($sDatastrpos($sData"\r\n\r\n") + 4));
        return 
$sData;
    }
}

Чтение URL

makeGetParams() method
protected string makeGetParams(array $aParams=array ( ))
$aParams array Параметры
{return} string
Source Code: /engine/modules/ls/Ls.class.php#312 (show)
protected function makeGetParams($aParams=array()) {
    
$sGetParams='';
    if (
is_string($aParams) or count($aParams)){
        
$sGetParams=is_array($aParams) ? http_build_query($aParams,'','&') : $aParams;
    }
    return 
$sGetParams;
}

Формирует строку GET параметров