%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/conversion/lib/internals/ |
| Current File : //home/bitrix/www/bitrix/modules/conversion/lib/internals/handlers.php |
<?php
namespace Bitrix\Conversion\Internals;
use Bitrix\Conversion\DayContext;
use Bitrix\Main\SiteTable;
use Bitrix\Main\Page\Asset;
use Bitrix\Main\Page\AssetLocation;
use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);
/** @internal */
final class Handlers
{
static public function onGetCounterTypes()
{
return array(
'conversion_visit_day' => array('MODULE' => 'conversion', 'GROUP' => 'day', 'NAME' => 'Day visits'),
);
}
static public function onGetAttributeTypes()
{
$userAgent = $_SERVER['HTTP_USER_AGENT'];
// http://stackoverflow.com/questions/18070154/get-operating-system-info-with-php
$operatingSystemValues = array(
'windows' => array('NAME' => 'Windows' , 'REGEX' => '/windows|win98|win95|win16/i' ),
'macos' => array('NAME' => 'Mac OS' , 'REGEX' => '/macintosh|mac os x|mac_powerpc/i'),
'android' => array('NAME' => 'Android' , 'REGEX' => '/android/i' ),
'linux' => array('NAME' => 'Linux' , 'REGEX' => '/linux|ubuntu/i' ),
'ios' => array('NAME' => 'iOS' , 'REGEX' => '/iphone|ipod|ipad/i' ),
'blackberry' => array('NAME' => 'BlackBerry', 'REGEX' => '/blackberry/i' ),
'webos' => array('NAME' => 'Web OS' , 'REGEX' => '/webos/i' ),
);
$browser = null; // TODO hack
$browserValues = array(
'edge' => array('NAME' => 'Edge', 'REGEX' => '/edge\//i'),
'ie' => array('NAME' => 'Internet Explorer', 'REGEX' => '/msie|trident/i'),
'firefox' => array('NAME' => 'Firefox', 'REGEX' => '/firefox/i' ),
'chrome' => array('NAME' => 'Chrome', 'REGEX' => '/chrome/i' ),
'opera' => array('NAME' => 'Opera', 'REGEX' => '/opera/i' ),
'safari' => array('NAME' => 'Safari', 'REGEX' => '/safari/i' ),
'netscape' => array('NAME' => 'Netscape', 'REGEX' => '/netscape/i' ),
'maxthon' => array('NAME' => 'Maxthon', 'REGEX' => '/maxthon/i' ),
'konqueror' => array('NAME' => 'Konqueror', 'REGEX' => '/konqueror/i'),
'mobile' => array('NAME' => 'Handheld', 'REGEX' => '/mobile/i' ),
);
$detector = new MobileDetect;
$searchEngineValues = array(
'google' => array('NAME' => 'Google' , 'REGEX' => '#^https?://www\.google\.[a-z]{2,3}/#' ),
'bing' => array('NAME' => 'Bing' , 'REGEX' => '#^https?://www\.bing\.[a-z]{2,3}/#' ),
'yahoo' => array('NAME' => 'Yahoo' , 'REGEX' => '#^https?://r\.search\.yahoo\.[a-z]{2,3}/#'),
'ask' => array('NAME' => 'Ask' , 'REGEX' => '#^https?://www\.ask\.[a-z]{2,3}/#' ),
'yandex' => array('NAME' => 'Yandex' , 'REGEX' => '#^https?://yandex\.[a-z]{2,3}/#' ),
'mail.ru' => array('NAME' => 'Mail.ru', 'REGEX' => '#^https?://go\.mail\.ru/#' ),
'rambler' => array('NAME' => 'Rambler', 'REGEX' => '#^https?://nova\.rambler\.ru/#' ),
);
return array(
// SITE
'conversion_site' => array(
'MODULE' => 'conversion',
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_SITE_NAME'),
'SORT' => 1100,
'GET_VALUES' => function (array $ids)
{
$values = array();
$result = SiteTable::getList(array(
'select' => array('LID', 'NAME'),
'filter' => array('LID' => $ids),
'order' => array('SORT' => 'ASC'),
));
while ($row = $result->fetch())
{
$values[$row['LID']] = array('NAME' => $row['NAME']);
}
return $values;
},
'SET_DAY_CONTEXT' => function (DayContext $dayContext)
{
if ($siteId = DayContext::getSiteId())
{
$dayContext->setAttribute('conversion_site', $siteId);
}
},
),
// OPERATING SYSTEM
'conversion_operating_system' => array(
'MODULE' => 'conversion',
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_OPERATING_SYSTEM_NAME'),
'SORT' => 2100,
'GET_VALUES' => function (array $ids) use ($operatingSystemValues)
{
$values = array();
foreach ($ids as $id)
{
if ($value = $operatingSystemValues[$id])
{
$values[$id] = $value;
}
}
return $values;
},
'SET_DAY_CONTEXT' => function (DayContext $dayContext) use ($operatingSystemValues, $userAgent)
{
if ($userAgent)
{
foreach ($operatingSystemValues as $name => $type)
{
if (preg_match($type['REGEX'], $userAgent))
{
$dayContext->setAttribute('conversion_operating_system', $name);
break;
}
}
}
},
),
// BROWSER
'conversion_browser' => array(
'MODULE' => 'conversion',
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_BROWSER_NAME'),
'SORT' => 3100, // must be before conversion_device_desktop!
'GET_VALUES' => function (array $ids) use ($browserValues)
{
$values = array();
foreach ($ids as $id)
{
if ($value = $browserValues[$id])
{
$values[$id] = $value;
}
}
return $values;
},
'SET_DAY_CONTEXT' => function (DayContext $dayContext) use ($browserValues, $userAgent, & $browser)
{
if ($userAgent)
{
foreach ($browserValues as $name => $type)
{
if (preg_match($type['REGEX'], $userAgent))
{
$dayContext->setAttribute('conversion_browser', $name);
$browser = $name;
break;
}
}
}
},
),
// DEVICE
'conversion_device_tablet' => array(
'MODULE' => 'conversion',
'GROUP' => 'device',
'SORT' => 4100, // must be before conversion_device_mobile!
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_DEVICE_TABLET_NAME'),
'SPLIT_BY' => 'conversion_operating_system',
'BG_COLOR' => '#be6ac4',
'SET_DAY_CONTEXT' => function (DayContext $dayContext) use ($detector)
{
if ($detector->isTablet())
{
$dayContext->setAttribute('conversion_device_tablet');
}
},
),
'conversion_device_mobile' => array(
'MODULE' => 'conversion',
'GROUP' => 'device',
'SORT' => 4200, // must be after conversion_device_tablet!
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_DEVICE_MOBILE_NAME'),
'SPLIT_BY' => 'conversion_operating_system',
'BG_COLOR' => '#4bbedb',
'SET_DAY_CONTEXT' => function (DayContext $dayContext) use ($detector)
{
if ($detector->isMobile())
{
$dayContext->setAttribute('conversion_device_mobile');
}
},
),
'conversion_device_desktop' => array(
'MODULE' => 'conversion',
'GROUP' => 'device',
'SORT' => 4500, // must be after conversion_browser!
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_DEVICE_DESKTOP_NAME'),
'SPLIT_BY' => 'conversion_browser',
'BG_COLOR' => '#cf4343',
'SET_DAY_CONTEXT' => function (DayContext $dayContext) use (& $browser)
{
if ($browser)
{
$dayContext->setAttribute('conversion_device_desktop');
}
},
),
// SOURCE
'conversion_search_engine' => array(
'MODULE' => 'conversion',
'GROUP' => 'source',
'SORT' => 5500, // must be after seo_yandex_direct_source!
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_SEARCH_ENGINE_NAME'),
'SPLIT_BY' => 'conversion_search_engine',
'BG_COLOR' => '#be6ac4',
'GET_VALUES' => function (array $ids) use ($searchEngineValues)
{
$values = array();
foreach ($ids as $id)
{
if ($value = $searchEngineValues[$id])
{
$values[$id] = $value;
}
}
return $values;
},
'SET_DAY_CONTEXT' => function (DayContext $dayContext) use ($searchEngineValues)
{
if ($referer = $_SERVER['HTTP_REFERER'])
{
foreach ($searchEngineValues as $name => $type)
{
if (preg_match($type['REGEX'], $referer))
{
$dayContext->setAttribute('conversion_search_engine', $name);
break;
}
}
}
},
),
);
}
static public function onSetDayContextAttributes(DayContext $dayContext)
{
foreach (self::onGetAttributeTypes() as $name => $type)
{
if ($setDayContext = $type['SET_DAY_CONTEXT'])
{
$setDayContext($dayContext);
}
}
}
public static function onGetAttributeGroupTypes()
{
return array(
'source' => array(
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_GROUP_SOURCE_NAME'),
'SORT' => 100,
),
'device' => array(
'NAME' => Loc::getMessage('CONVERSION_ATTRIBUTE_GROUP_DEVICE_NAME'),
'SORT' => 200,
),
);
}
static public function onProlog()
{
static $done = false;
if (! $done)
{
$done = true;
\CJSCore::init();
DayContext::getInstance();
// For composite site this script must not be changing often!!!
Asset::getInstance()->addString(
'<script type="text/javascript">
(function () {
"use strict";
var counter = function ()
{
var cookie = (function (name) {
var parts = ("; " + document.cookie).split("; " + name + "=");
if (parts.length == 2) {
try {return JSON.parse(decodeURIComponent(parts.pop().split(";").shift()));}
catch (e) {}
}
})("'.DayContext::getVarName().'");
if (cookie && cookie.EXPIRE >= BX.message("SERVER_TIME"))
return;
var request = new XMLHttpRequest();
request.open("POST", "/bitrix/tools/conversion/ajax_counter.php", true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send(
"SITE_ID="+encodeURIComponent("'.DayContext::getSiteId().'")+
"&sessid="+encodeURIComponent(BX.bitrix_sessid())+
"&HTTP_REFERER="+encodeURIComponent(document.referrer)
);
};
if (window.frameRequestStart === true)
BX.addCustomEvent("onFrameDataReceived", counter);
else
BX.ready(counter);
})();
</script>',
false,
AssetLocation::AFTER_JS_KERNEL
// Do not use AssetMode unless you absolutely sure what you're doing!
// Maybe default value or AssetMode::ALL is appropriate, all other modes do not work!
// This script must be executed on every hit!!!
);
}
}
}