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
Property | Type | Description | Defined By |
---|---|---|---|
_aBehaviors | Список поведений в виде готовых объектов, формируется автоматически | LsObject | |
aBehaviors | array | Список поведений | LsObject |
aDataForSend | array | Список данных для отправки | ModuleLs |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
sUrlLs | string | Адрес шлюза | ModuleLs |
Public Methods
Method | Description | Defined 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
Method | Description | Defined 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($sFile, serialize($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($ch, CURLOPT_URL, $sUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->makeGetParams($aParams));
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$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, $errstr, 5);
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($socket, 4096)) !== false) {
$sData .= $line;
}
//закрываем сокет
fclose($socket);
$sData = trim(substr($sData, strpos($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 параметров