ModuleLs

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

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
_aBehaviors Список поведений в виде готовых объектов, формируется автоматически LsObject
aBehaviors array Список поведений LsObject
aDataForSend array Список данных для отправки ModuleLs
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
sUrlLs string Адрес шлюза ModuleLs

Public Methods

Hide inherited methods

MethodDescriptionDefined By
AddBehaviorHook() Добавляет хук поведения LsObject
AttachBehavior() Присоединяет поведение к объекту LsObject
CheckVerificationKey() Проверка ключа, в ответ браузеру выдается только сообщение "ok" или "no" ModuleLs
DetachBehavior() Отсоединяет поведение от объекта LsObject
GetBehavior() Возвращает объект поведения по его имени LsObject
GetBehaviors() Возвращает все объекты поведения LsObject
Init() Инициализируем модуль ModuleLs
InjectCounter() Вставка счетчика GA с учетом его возможного повторного использования ModuleLs
InjectImgForSendToLs() Возвращает строчку для инжекции в шаблон ModuleLs
RemoveBehaviorHook() Удаляет хук поведения LsObject
RunBehaviorHook() Запускает хук поведения на выполнение LsObject
SenderRun() Запуск сбора данных ModuleLs
SetInit() Помечает модуль как инициализированный Module
Shutdown() Метод срабатывает при завершении работы ядра Module
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля LsObject
__clone() Блокируем копирование/клонирование объекта Module
__construct() Конструктор, запускается автоматически при создании объекта LsObject
__get() Обработка доступа к объекты поведения LsObject
isInit() Возвращает значение флага инициализации модуля Module

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
ErrorSendToLs() Отмечает факт ошибки при отправки данных, увеличиваем число попыток ModuleLs
GetDataForSendToLs() Возвращает данные для отправки ModuleLs
GetMarkerFile() Читает данные из файла ModuleLs
PrepareBehaviors() Инициализация поведений LsObject
SendToLs() Отправка данных на шлюз LS ModuleLs
SetMarkerFile() Записывает данные в файл ModuleLs
SuccessfulSendToLs() Отмечает факт успешной отправки данных ModuleLs
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: /framework/classes/modules/ls/Ls.class.php#84 (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: /framework/classes/modules/ls/Ls.class.php#174 (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: /framework/classes/modules/ls/Ls.class.php#246 (show)
protected function GetDataForSendToLs()
{
    
/**
     * Формируем данные для отправки
     */
    
$aData = array();
    
$aData['ls_v'] = LS_VERSION;
    
/**
     * Список плагинов с версиями
     */
    
$aPlugins $this->PluginManager_GetPluginsItems();
    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: /framework/classes/modules/ls/Ls.class.php#201 (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: /framework/classes/modules/ls/Ls.class.php#52 (show)
public function Init()
{

}

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

InjectCounter() method
public mixed InjectCounter()
{return} mixed
Source Code: /framework/classes/modules/ls/Ls.class.php#102 (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: /framework/classes/modules/ls/Ls.class.php#234 (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: /framework/classes/modules/ls/Ls.class.php#131 (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: /framework/classes/modules/ls/Ls.class.php#62 (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: /framework/classes/modules/ls/Ls.class.php#220 (show)
protected function SetMarkerFile($sDate$aData)
{
    
$sFile Config::Get('sys.cache.dir') . 'lssender-' $sDate;
    if (@
file_put_contents($sFileserialize($aData))) {
        return 
true;
    }
    return 
false;
}

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

SuccessfulSendToLs() method
protected void SuccessfulSendToLs()
Source Code: /framework/classes/modules/ls/Ls.class.php#190 (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: /framework/classes/modules/ls/Ls.class.php#285 (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: /framework/classes/modules/ls/Ls.class.php#341 (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 параметров