%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/abtest/admin/ |
Current File : /home/bitrix/www/bitrix/modules/abtest/admin/abtest_report.php |
<?php require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); IncludeModuleLangFile(__FILE__); Bitrix\Main\Loader::includeModule('abtest'); $conversionAvailable = Bitrix\Main\Loader::includeModule('conversion'); $arLang = $APPLICATION->getLang(); $MOD_RIGHT = $APPLICATION->getGroupRight('abtest'); if ($MOD_RIGHT < 'R') $APPLICATION->authForm(getMessage('ACCESS_DENIED')); $ID = intval($ID); $abtest = Bitrix\ABTest\ABTestTable::getList(array( 'filter' => array('=ID' => $ID), 'select' => array('*', 'USER_NAME' => 'USER.NAME', 'USER_LAST_NAME' => 'USER.LAST_NAME', 'USER_SECOND_NAME' => 'USER.SECOND_NAME', 'USER_TITLE' => 'USER.TITLE', 'USER_LOGIN' => 'USER.LOGIN') ))->fetch(); if (empty($abtest) || $abtest['ENABLED'] != 'Y') { $APPLICATION->setTitle(empty($abtest['NAME']) ? str_replace('#ID#', $ID, getMessage('ABTEST_REPORT_TITLE1')) : str_replace('#NAME#', $abtest['NAME'], getMessage('ABTEST_REPORT_TITLE2')) ); $message = new CAdminMessage(array( 'MESSAGE' => getMessage('ABTEST_REPORT_NOTFOUND'), 'DETAILS' => getMessage('ABTEST_REPORT_DISABLED') )); require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_after.php'); echo $message->Show(); require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_admin.php'); return; } if ($abtest['ACTIVE'] == 'Y') { $active_test = $abtest; } else { $active_test = Bitrix\ABTest\ABTestTable::getList(array( 'order' => array('SORT' => 'ASC'), 'filter' => array('SITE_ID' => $abtest['SITE_ID'], 'ACTIVE' => 'Y') ))->fetch(); } $arGraphData = array(); if ($conversionAvailable) $conversionRates = Bitrix\Conversion\RateManager::getTypes(array('ACTIVE' => true)); if (!empty($conversionRates)) { reset($conversionRates); $baseRate = key($conversionRates); $allRates = array_keys($conversionRates); usort($allRates, function($a, $b) use ($conversionRates) { $a = $conversionRates[$a]; $b = $conversionRates[$b]; return $a['MODULE'] == $b['MODULE'] ? $b['SORT'] - $a['SORT'] : $a['SORT'] - $b['SORT']; }); $funnelRates = array('sale_cart', 'sale_order', 'sale_payment'); if (array_diff($funnelRates, $allRates)) $funnelRates = null; $reportContext = new Bitrix\Conversion\ReportContext; $reportContext->setAttribute('conversion_site', $abtest['SITE_ID']); $reportContext->setAttribute('abtest', $ID); $reportContext->setAttribute('abtest_section', 'A'); $arGroupAData = $reportContext->getRatesDeprecated($conversionRates, array(), array('FORMAT' => 'Y-m-d', 'SELECT' => 'RATE')); $reportContext->unsetAttribute('abtest_section', 'A'); $reportContext->setAttribute('abtest_section', 'B'); $arGroupBData = $reportContext->getRatesDeprecated($conversionRates, array(), array('FORMAT' => 'Y-m-d', 'SELECT' => 'RATE')); foreach ($arGroupAData as $type => $data) $arGroupAData[$type]['TYPE'] = $conversionRates[$type]; foreach ($arGroupBData as $type => $data) $arGroupBData[$type]['TYPE'] = $conversionRates[$type]; $arGroupABaseRate =& $arGroupAData[$baseRate]; $arGroupBBaseRate =& $arGroupBData[$baseRate]; if (!empty($arGroupABaseRate)) { foreach ($arGroupABaseRate['STEPS'] as $date => $rate) { if (!isset($arGraphData[$date])) $arGraphData[$date] = array('date' => $date); $arGraphData[$date]['value_a'] = round($rate*100, 2); } } if (!empty($arGroupBBaseRate)) { foreach ($arGroupBBaseRate['STEPS'] as $date => $rate) { if (!isset($arGraphData[$date])) $arGraphData[$date] = array('date' => $date); $arGraphData[$date]['value_b'] = round($rate*100, 2); } if (!empty($arGraphData)) ksort($arGraphData); $arGraphData = array_values($arGraphData); } } function get_plural_messages($prefix) { global $MESS; $result = array(); $k = 0; while ($form = getMessage($prefix.'PLURAL_'.++$k)) $result[] = $form; return $result; } // http://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html function plural_form($n, $forms) { switch (LANG) { case 'ru': case 'ua': $p = $n%10 == 1 && $n%100 != 11 ? 0 : ($n%10 >= 2 && $n%10 <= 4 && ($n%100 < 10 || $n%100 >= 20) ? 1 : 2); break; case 'en': case 'de': case 'es': $p = $n == 1 ? 0 : 1; break; } return isset($forms[$p]) ? $forms[$p] : end($forms); } if (!empty($conversionRates)) CUtil::initJSCore(array('amcharts', 'amcharts_funnel', 'amcharts_serial')); $APPLICATION->setTitle(empty($abtest['NAME']) ? str_replace('#ID#', $ID, getMessage('ABTEST_REPORT_TITLE1')) : str_replace('#NAME#', $abtest['NAME'], getMessage('ABTEST_REPORT_TITLE2')) ); require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_after.php'); $aMenu = array( array( 'ICON' => 'btn_list', 'TEXT' => getMessage('ABTEST_GOTO_LIST'), 'LINK' => 'abtest_admin.php?lang='.LANG ) ); $context = new CAdminContextMenu($aMenu); $context->Show(); $aTabs = array(array('DIV' => 'edit1', 'TAB' => getMessage('ABTEST_TAB_NAME'), 'TITLE' => getMessage('ABTEST_TAB_TITLE'))); $tabControl = new CAdminTabControl("tabControl", $aTabs, false); ?> <? $tabControl->Begin(); ?> <? $tabControl->BeginNextTab(); ?> <? $estDays = null; if ($abtest['MIN_AMOUNT'] > 0 && $abtest['PORTION'] > 0) { $siteCapacity = Bitrix\ABTest\AdminHelper::getSiteCapacity($abtest['SITE_ID']); $testCapacity = Bitrix\ABTest\AdminHelper::getTestCapacity($abtest['ID']); if ($siteCapacity['daily'] > 0) { $rem = $abtest['MIN_AMOUNT'] - min($testCapacity); $est = $rem > 0 ? $rem / ($siteCapacity['daily'] / 2) : 0; $estDays = ceil(100 * $est / $abtest['PORTION']); } } $end_date = null; if ($abtest['ACTIVE'] == 'Y' && $abtest['DURATION'] != 0) { if ($abtest['DURATION'] > 0) { $end = clone $abtest['START_DATE']; $end->add(intval($abtest['DURATION']).' days'); $end_date = $end->format(Bitrix\Main\Type\Date::convertFormatToPhp($arLang['FORMAT_DATE'])); } else { if (isset($estDays)) { $end = new Bitrix\Main\Type\DateTime(); $end->add($estDays.' days'); $end_date = $end->format(Bitrix\Main\Type\Date::convertFormatToPhp($arLang['FORMAT_DATE'])); } else { $end_date = getMessage('ABTEST_DURATION_NA'); } } } function pvalue($p1, $p2, $n1, $n2) { $dx = array( 1.0000000000, 0.0498673470, 0.0211410061, 0.0032776263, 0.0000380036, 0.0000488906, 0.0000053830 ); $stdError = sqrt(($p1 * (1 - $p1) / $n1) + ($p2 * (1 - $p2) / $n2)); $zval = abs($p2-$p1) / $stdError; for ($pval = 0, $i = 6; $i >= 0; $i--) $pval = $pval * $zval + $dx[$i]; $pval = pow($pval, -16); $pval = 0.5 - abs($pval-0.5); return $pval; } if ($abtest['START_DATE'] || $abtest['STOP_DATE']) { $math = array('pwr' => false, 'sgn' => false); if ($abtest['MIN_AMOUNT'] > 0) { if (min($arGroupABaseRate['DENOMINATOR'], $arGroupBBaseRate['DENOMINATOR']) >= $abtest['MIN_AMOUNT']) { $pval = pvalue( $arGroupABaseRate['RATE'], $arGroupBBaseRate['RATE'], $arGroupABaseRate['DENOMINATOR'], $arGroupBBaseRate['DENOMINATOR'] ); $math = array('pwr' => true, 'sgn' => $pval < 0.05); } } } $user_name = $abtest['USER_ID'] ? CUser::formatName( CSite::getNameFormat(), array( 'TITLE' => $abtest['USER_TITLE'], 'NAME' => $abtest['USER_NAME'], 'SECOND_NAME' => $abtest['USER_SECOND_NAME'], 'LAST_NAME' => $abtest['USER_LAST_NAME'], 'LOGIN' => $abtest['USER_LOGIN'], ), true, true ) : false; ?> <tr><td> <div class="stat-item-block-container abtest-report-container"> <div class="stat-item-container item-test-info"> <? if ($user_name) : ?> <span class="ab-test-info ab-test-info-right"><?=getMessage($abtest['ACTIVE'] == 'Y' ? 'ABTEST_STARTED_BY' : 'ABTEST_STOPPED_BY'); ?>: <a href="/bitrix/admin/user_edit.php?ID=<?=intval($abtest['USER_ID']); ?>&lang=<?=LANG; ?>"><?=$user_name; ?></a></span> <? endif; ?> <img style="float: left; margin-right: 15px; " src="/bitrix/images/abtest/ab-test-<?=($abtest['ACTIVE'] == 'Y' ? 'on' : 'off');?>.gif"> <? if ($MOD_RIGHT >= 'W') : ?> <? if ($abtest['ACTIVE'] == 'Y') : ?> <span class="adm-btn" style="vertical-align: baseline; " onclick="if (confirm('<?=CUtil::JSEscape(getMessage('ABTEST_STOP_CONFIRM')); ?>')) window.location='abtest_admin.php?action=stop&ID=<?=intval($abtest['ID']); ?>&lang=<?=LANG; ?>&<?=bitrix_sessid_get(); ?>'; "><?=getMessage('ABTEST_BTN_STOP'); ?></span> <? elseif (empty($active_test)) : ?> <span class="adm-btn adm-btn-green" style="vertical-align: baseline; " onclick="if (confirm('<?=CUtil::JSEscape(getMessage('ABTEST_START_CONFIRM')); ?>')) window.location='abtest_admin.php?action=start&ID=<?=intval($abtest['ID']); ?>&lang=<?=LANG; ?>&<?=bitrix_sessid_get(); ?>'; "><?=getMessage('ABTEST_BTN_START'); ?></span> <? else : ?> <span class="adm-btn adm-btn-disabled" style="vertical-align: baseline; margin-right: 0px; " onclick="alert('<?=CUtil::JSEscape(getMessage('ABTEST_ONLYONE_WARNING')); ?>'); "><?=getMessage('ABTEST_BTN_START'); ?></span> <? endif; ?> <? endif; ?> <? if ($abtest['ACTIVE'] == 'Y') : ?> <span class="ab-test-info"> <?=getMessage('ABTEST_START_DATE'); ?>: <span><?=$abtest['START_DATE']->format(Bitrix\Main\Type\Date::convertFormatToPhp($arLang['FORMAT_DATE'])); ?></span> </span> <? if ($end_date) : ?> <span class="ab-test-info"> <?=getMessage('ABTEST_STOP_DATE2'); ?>: <span><?=htmlspecialcharsbx($end_date); ?></span> </span> <? endif; ?> <? else : ?> <? if ($abtest['START_DATE']) : ?> <span class="ab-test-info"> <?=getMessage('ABTEST_START_DATE2'); ?>: <span><?=$abtest['START_DATE']->format(Bitrix\Main\Type\Date::convertFormatToPhp($arLang['FORMAT_DATE'])); ?></span> </span> <? endif; ?> <? if ($abtest['STOP_DATE']) : ?> <span class="ab-test-info"> <?=getMessage('ABTEST_STOP_DATE'); ?>: <span><?=$abtest['STOP_DATE']->format(Bitrix\Main\Type\Date::convertFormatToPhp($arLang['FORMAT_DATE'])); ?></span> </span> <? endif; ?> <? if (!$abtest['START_DATE'] && !$abtest['STOP_DATE']) : ?> <span class="ab-test-info"><?=getMessage('ABTEST_NEVER_LAUNCHED'); ?></span> <? endif; ?> <? endif; ?> </div> <? if (!empty($math)) : ?> <div class="stat-item-container item-test-info"> <div class="adm-input-wrap adm-input-help-icon-wrap"> <a class="adm-input-help-icon" href="#math-hint"></a> </div> <span class="ab-test-info" style="padding: 0px; color: <?=($math['pwr'] ? '#729e00' : '#c70000'); ?>; font-weight: bold; "> • <?=getMessage($math['pwr'] ? 'ABTEST_MATH_POWER_YES' : 'ABTEST_MATH_POWER_NO'); ?> <? if (!$math['pwr'] && $estDays) : ?> (<?=str_replace( array('#NUM#', '#UNIT#'), array($estDays, plural_form($estDays, get_plural_messages('ABTEST_DURATION_DAYS1_'))), getMessage('ABTEST_DURATION_EST') ); ?>) <? endif; ?> </span> <sup>1</sup><br> <span class="ab-test-info" style="padding: 0px; color: <?=($math['sgn'] ? '#729e00' : '#c70000'); ?>; font-weight: bold; "> • <?=getMessage($math['sgn'] ? 'ABTEST_MATH_SIGNIFICANCE_YES' : 'ABTEST_MATH_SIGNIFICANCE_NO'); ?> </span> <sup>2</sup> </div> <? endif; ?> <? if (empty($conversionRates)) : ?> <div class="stat-item-container item-conversion-block"> <?=getMessage($conversionAvailable ? 'ABTEST_CONVRATES_UNAVAILABLE' : 'ABTEST_CONVERSION_UNAVAILABLE'); ?> </div> <? else : ?> <div class="ab-item-container"> <div class="stat-item-container"> <span class="ab-item-desc"><span>50%</span> <?=getMessage('ABTEST_VISITS'); ?></span> <span class="ab-letter ab-letter-a">A</span> <span class="ab-item" style="min-width: 250px; "><?=getMessage('ABTEST_TEST_TITLE_A'); ?></span> </div> <div class="stat-item-container"> <span class="ab-item-desc"><span>50%</span> <?=getMessage('ABTEST_VISITS'); ?></span> <span class="ab-letter ab-letter-b">B</span> <span class="ab-item" style="min-width: 250px; "><?=getMessage('ABTEST_TEST_TITLE_B'); ?></span> </div> </div> <div class="stat-item-container item-conversion-block"> <div class="item-conversion-block-title"><?=(empty($abtest['NAME']) ? str_replace('#ID#', $ID, getMessage('ABTEST_CONVERSION_GRAPH_TITLE1')) : str_replace('#NAME#', htmlspecialcharsbx($abtest['NAME']), getMessage('ABTEST_CONVERSION_GRAPH_TITLE2')) ); ?></div> <div class="item-conversion-block-subtitle"><?=getMessage('ABTEST_CONVERSION_GRAPH_DESCR'); ?></div> <div id="chart_container" class="item-conversion-graph-block"> <div style="position: relative; top: 50%; margin-top: -0.5em; color: #808080; "> <?=getMessage(empty($arGraphData) ? 'ABTEST_CONVERSION_GRAPH_EMPTY' : 'ABTEST_CONVERSION_GRAPH_LOADING'); ?> </div> </div> <? if (!empty($arGraphData)) : ?> <script type="text/javascript"> AmCharts.ready(function() { var chartData = <?=CUtil::PhpToJSObject($arGraphData); ?>; var chart = new AmCharts.AmSerialChart(); chart.path = BX.message('AMCHARTS_PATH') || '/bitrix/js/main/amcharts/3.13/'; // TODO chart.pathToImages = BX.message('AMCHARTS_IMAGES_PATH') || '/bitrix/js/main/amcharts/3.13/images/'; // TODO var monthNames = []; var shortMonthNames = []; for(var m = 1; m <= 12; m++) { monthNames.push(BX.message['MONTH_'+m.toString()]); shortMonthNames.push(BX.message['MONTH_'+m.toString()+'_S']); } AmCharts.monthNames = monthNames; AmCharts.shortMonthNames = shortMonthNames; chart.zoomOutText = '<?=CUtil::JSEscape(getMessage('ABTEST_CONVERSION_GRAPH_SHOW_ALL')); ?>'; chart.dataProvider = chartData; chart.categoryField = 'date'; chart.theme = 'none'; chart.decimalSeparator = ','; chart.autoMargins = false; chart.marginLeft = 60; chart.marginRight = 20; chart.marginTop = 20; chart.marginBottom = 40; chart.chartCursor = { enabled: true, cursorColor: '#808080', oneBalloonOnly: true, categoryBalloonEnabled: true, categoryBalloonColor: '#000000', categoryBalloonDateFormat: '<?=CUtil::JSEscape($arLang['FORMAT_DATE']); ?>' }; chart.chartScrollbar = {}; chart.dataDateFormat = 'YYYY-MM-DD'; chart.valueAxes = [{'unit': '%'}]; chart.categoryAxis = { parseDates: true, minPeriod: 'DD', equalSpacing: true, markPeriodChange: false, autoGridCount: false, gridCount: 0, dateFormats: [ {period: 'DD', format: 'D MMM'}, {period: 'WW', format: 'D MMM'}, {period: 'MM', format: 'MMMM'}, {period: 'YYYY', format: 'YYYY'} ] }; chart.addListener('zoomed', function(params) { var chart = params.chart; var axis = chart.categoryAxis; while (axis.guides.length > 0) axis.removeGuide(axis.guides[0]); var step = Math.ceil((1+params.endIndex-params.startIndex) / 10); for (var i = params.startIndex; i <= params.endIndex; i = i + step) { axis.addGuide(new AmCharts.Guide({Guide: { date: chart.dataProvider[i].date, label: AmCharts.formatDate(chart.chartData[i].category, 'D MMM') }})); } chart.validateNow(); }); var graph_a = new AmCharts.AmGraph(); var graph_b = new AmCharts.AmGraph(); graph_a.connect = false; graph_a.balloonText = '<?=CUtil::JSEscape(getMessage('ABTEST_CONVERSION_GRAPH_HINT_A')); ?>: [[value]]%'; graph_a.valueField = 'value_a'; graph_a.type = 'smoothedLine'; graph_a.lineThickness = 2; graph_a.bullet = 'round'; graph_a.lineColor = '#33b4ea'; graph_b.connect = false; graph_b.balloonText = '<?=CUtil::JSEscape(getMessage('ABTEST_CONVERSION_GRAPH_HINT_B')); ?>: [[value]]%'; graph_b.valueField = 'value_b'; graph_b.type = 'smoothedLine'; graph_b.lineThickness = 2; graph_b.bullet = 'round'; graph_b.lineColor = '#ea9a00'; chart.addGraph(graph_a); chart.addGraph(graph_b); chart.write('chart_container'); }); </script> <? endif; ?> <? $groupARate = round($arGroupABaseRate['RATE']*100, 2); ?> <? $groupBRate = round($arGroupBBaseRate['RATE']*100, 2); ?> <? $rateDiff = round($groupBRate-$groupARate, 2); ?> <div class="stat-item-data-container stat-item-data-container-a"> <div class="stat-item-container stat-item-data"> <div class="stat-item-container-title"> <span class="stat-item-container-title-letter">A</span> <span class="stat-item-container-title-name"><?=getMessage('ABTEST_CONVERSION_VALUE_TITLE'); ?></span> </div> <div class="stat-item"> <div class="stat-item-block"> <span class="stat-item-block-inner"> <span id="a-graph-rate" class="stat-item-block-digit"><?=str_replace('.', ',', $groupARate); ?><span>%</span></span> </span> </div> </div> </div> </div> <div class="stat-item-data-container<? if ($rateDiff != 0) : ?> stat-item-data-container-dynamics<? endif; ?>"> <div class="stat-item-container stat-item-data<? if ($rateDiff != 0) : ?> stat-item-block-<?=($rateDiff > 0 ? 'incr' : 'fall'); ?><? endif; ?>"> <div class="stat-item-container-title"> <span class="stat-item-container-title-name"><?=getMessage('ABTEST_CONVERSION_DIFF_TITLE'); ?></span> </div> <div class="stat-item"> <div class="stat-item-block"> <span class="stat-item-block-inner"> <span id="graph-rate-diff" class="stat-item-block-digit"> <span class="stat-item-block-digit-arrow"></span><?=str_replace('.', ',', abs($rateDiff)); ?><span>%</span> </span> </span> </div> </div> </div> </div> <div class="stat-item-data-container stat-item-data-container-b"> <div class="stat-item-container stat-item-data"> <div class="stat-item-container-title"> <span class="stat-item-container-title-letter">B</span> <span class="stat-item-container-title-name"><?=getMessage('ABTEST_CONVERSION_VALUE_TITLE'); ?></span> </div> <div class="stat-item"> <div class="stat-item-block"> <span class="stat-item-block-inner"> <span id="b-graph-rate" class="stat-item-block-digit"><?=str_replace('.', ',', $groupBRate); ?><span>%</span></span> </span> </div> </div> </div> </div> </div> <? if (!empty($funnelRates)) : ?> <? $funnelBaseRate = end($funnelRates); ?> <div class="adm-detail-toolbar"> <span class="adm-detail-toolbar-title"><?=getMessage('ABTEST_CONVERSION_FUNNEL_TITLE'); ?></span> </div> <div id="funnel-a" class="stat-item-data-container stat-item-data-container-a"> <div class="stat-item-container stat-item-data stat-item-data-funnel"> <div class="stat-item-container-title"> <span class="stat-item-container-title-letter">A</span> <span class="stat-item-container-title-name"><?=htmlspecialcharsbx($arGroupAData[$funnelBaseRate]['TYPE']['NAME']); ?></span> </div> <div class="stat-item"> <div class="stat-item-block stat-item-block-conversion"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_VALUE_TITLE'); ?></span> <span class="stat-item-block-digit"><?=str_replace('.', ',', $groupARate); ?><span>%</span></span> </span> </div> <div class="stat-item-block stat-item-block-first"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_SUM_TITLE'); ?></span> <span class="stat-item-block-digit scale-sum-fnl scale-num-30-3"> <?=number_format(floatval($arGroupAData[$funnelBaseRate]['SUM']), 0, '', ' '); ?> <span><?=htmlspecialcharsbx($arGroupAData[$funnelBaseRate]['TYPE']['UNITS']['SUM']); ?></span> </span> </span> </div> <? $sum = array_reduce($funnelRates, function($sum, $type) use ($arGroupAData) { return $sum + $arGroupAData[$type]['SUM']; }, 0); ?> <div id="funnel_a_container"> <div style="position: relative; top: 50%; margin-top: -0.5em; color: #808080; "> <?=getMessage($sum > 0 ? 'ABTEST_CONVERSION_GRAPH_LOADING' : 'ABTEST_CONVERSION_GRAPH_EMPTY'); ?> </div> </div> <? if ($sum > 0) : ?> <script type="text/javascript"> AmCharts.ready(function() { var chart = new AmCharts.AmFunnelChart(); chart.dataProvider = [ <? $k = 0; ?> <? foreach ($funnelRates as $type) : ?> <? $data = $arGroupAData[$type]; ?> <? if ($k++ > 0) echo ','; ?>{'title': '<?=CUtil::JSEscape($data['TYPE']['NAME']); ?>', 'value': <?=sprintf('%.0f', $data['SUM']); ?>, 'unit': '<?=CUtil::JSEscape($data['TYPE']['UNITS']['SUM']); ?>'} <? endforeach; ?> ]; chart.theme = 'none'; chart.labelText = ' '; chart.balloonText = '[[title]]: <span style="white-space: nowrap; ">[[value]] [[unit]]</span>'; chart.titleField = 'title'; chart.valueField = 'value'; chart.thousandsSeparator = ' '; chart.depth3D = 160; chart.angle = 23; chart.outlineAlpha = 2; chart.outlineColor = '#FFFFFF'; chart.outlineThickness = 2; chart.marginRight = 70; chart.marginLeft = 70; chart.balloon = {'fixedPosition': true}; chart.write('funnel_a_container'); }); </script> <? endif; ?> </div> </div> </div> <div id="funnel-b" class="stat-item-data-container stat-item-data-container-b"> <div class="stat-item-container stat-item-data stat-item-data-funnel"> <div class="stat-item-container-title"> <span class="stat-item-container-title-letter">B</span> <span class="stat-item-container-title-name"><?=htmlspecialcharsbx($arGroupBData[$funnelBaseRate]['TYPE']['NAME']); ?></span> </div> <div class="stat-item"> <div class="stat-item-block stat-item-block-conversion<? if ($rateDiff != 0) : ?> stat-item-block-conversion-<?=($rateDiff > 0 ? 'incr' : 'fall'); endif; ?>"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_VALUE_TITLE'); ?></span> <span class="stat-item-block-digit"> <? if ($rateDiff != 0) : ?><span class="stat-item-block-digit-arrow"></span><? endif; ?><?=str_replace('.', ',', $groupBRate); ?><span>%</span> </span> </span> </div> <div class="stat-item-block stat-item-block-first"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_SUM_TITLE'); ?></span> <span class="stat-item-block-digit scale-sum-fnl scale-num-30-3"> <?=number_format(floatval($arGroupBData[$funnelBaseRate]['SUM']), 0, '', ' '); ?> <span><?=htmlspecialcharsbx($arGroupBData[$funnelBaseRate]['TYPE']['UNITS']['SUM']); ?></span> </span> </span> </div> <? $sum = array_reduce($funnelRates, function($sum, $type) use ($arGroupBData) { return $sum + $arGroupBData[$type]['SUM']; }, 0); ?> <div id="funnel_b_container"> <div style="position: relative; top: 50%; margin-top: -0.5em; color: #808080; "> <?=getMessage($sum > 0 ? 'ABTEST_CONVERSION_GRAPH_LOADING' : 'ABTEST_CONVERSION_GRAPH_EMPTY'); ?> </div> </div> <? if ($sum > 0) : ?> <script type="text/javascript"> AmCharts.ready(function() { var chart = new AmCharts.AmFunnelChart(); chart.dataProvider = [ <? $k = 0; ?> <? foreach ($funnelRates as $type) : ?> <? $data = $arGroupBData[$type]; ?> <? if ($k++ > 0) echo ','; ?>{'title': '<?=CUtil::JSEscape($data['TYPE']['NAME']); ?>', 'value': <?=sprintf('%.0f', $data['SUM']); ?>, 'unit': '<?=CUtil::JSEscape($data['TYPE']['UNITS']['SUM']); ?>'} <? endforeach; ?> ]; chart.theme = 'none'; chart.labelText = ' '; chart.balloonText = '[[title]]: <span style="white-space: nowrap; ">[[value]] [[unit]]</span>'; chart.titleField = 'title'; chart.valueField = 'value'; chart.thousandsSeparator = ' '; chart.depth3D = 160; chart.angle = 23; chart.outlineAlpha = 2; chart.outlineColor = '#FFFFFF'; chart.outlineThickness = 2; chart.marginRight = 70; chart.marginLeft = 70; chart.balloon = {'fixedPosition': true}; chart.write('funnel_b_container'); }); </script> <? endif; ?> </div> </div> </div> <? endif; ?> <div class="adm-detail-toolbar"> <span class="adm-detail-toolbar-title"><?=getMessage('ABTEST_CONVERSION_COUNTERS_TITLE'); ?></span> </div> <? $arGroupARates = array(); ?> <div id="counters-a" class="stat-item-data-container stat-item-data-container-a"> <? $cnt = count($arGroupAData); $k = 0; ?> <? foreach ($allRates as $type) : ?> <? $data = $arGroupAData[$type]; ?> <? $rate = round($data['RATE']*100, 2); ?> <? $arGroupARates[$type] = $rate; ?> <div class="stat-item-container stat-item-data<? if (!is_set($data, 'SUM')) : ?> stat-item-data-short<? endif; ?>"> <div class="stat-item-container-title"> <span class="stat-item-container-title-letter">A</span> <span class="stat-item-container-title-name"><?=htmlspecialcharsbx($data['TYPE']['NAME']); ?></span> </div> <div class="stat-item"> <div class="stat-item-block stat-item-block-conversion"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_VALUE_TITLE'); ?></span> <span class="stat-item-block-digit"><?=str_replace('.', ',', $rate); ?><span>%</span></span> </span> </div> <? if (is_set($data, 'SUM')) : ?> <div class="stat-item-block stat-item-block-first"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_SUM_TITLE'); ?></span> <span class="stat-item-block-digit scale-sum-cnt scale-num-30-1"> <?=number_format(floatval($data['SUM']), 0, '', ' '); ?> <span><?=htmlspecialcharsbx($data['TYPE']['UNITS']['SUM']); ?></span> </span> </span> </div> <? endif; ?> <? $value = floatval(isset($data['QUANTITY']) ? $data['QUANTITY'] : $data['NUMERATOR']); ?> <div class="stat-item-block"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_CNT_TITLE'); ?></span> <span class="stat-item-block-digit scale-num-cnt scale-num-30-2"><?=number_format($value, 0, '', ' '); ?></span> </span> </div> </div> <? if (++$k < $cnt) : ?><span class="stat-item-chain"></span><? endif; ?> </div> <? endforeach; ?> </div> <div id="counters-b" class="stat-item-data-container stat-item-data-container-b"> <? $cnt = count($arGroupBData); $k = 0; ?> <? foreach ($allRates as $type) : ?> <? $data = $arGroupBData[$type]; ?> <? $rate = round($data['RATE']*100, 2); ?> <? $rateDiff = round($rate-$arGroupARates[$type], 2); ?> <div class="stat-item-container stat-item-data<? if (!is_set($data, 'SUM')) : ?> stat-item-data-short<? endif; ?>"> <div class="stat-item-container-title"> <span class="stat-item-container-title-letter">B</span> <span class="stat-item-container-title-name"><?=htmlspecialcharsbx($data['TYPE']['NAME']); ?></span> </div> <div class="stat-item"> <div class="stat-item-block stat-item-block-conversion<? if ($rateDiff != 0) : ?> stat-item-block-conversion-<?=($rateDiff > 0 ? 'incr' : 'fall'); endif; ?>"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_VALUE_TITLE'); ?></span> <span class="stat-item-block-digit"><? if ($rateDiff != 0) : ?><span class="stat-item-block-digit-arrow"></span><? endif; ?><?=str_replace('.', ',', $rate); ?><span>%</span></span> </span> </div> <? if (is_set($data, 'SUM')) : ?> <div class="stat-item-block stat-item-block-first"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_SUM_TITLE'); ?></span> <span class="stat-item-block-digit scale-sum-cnt scale-num-30-1"> <?=number_format(floatval($data['SUM']), 0, '', ' '); ?> <span><?=htmlspecialcharsbx($data['TYPE']['UNITS']['SUM']); ?></span> </span> </span> </div> <? endif; ?> <? $value = floatval(isset($data['QUANTITY']) ? $data['QUANTITY'] : $data['NUMERATOR']); ?> <div class="stat-item-block"> <span class="stat-item-block-inner"> <span class="stat-item-block-title"><?=getMessage('ABTEST_CONVERSION_CNT_TITLE'); ?></span> <span class="stat-item-block-digit scale-num-cnt scale-num-30-2"><?=number_format($value, 0, '', ' '); ?></span> </span> </div> </div> <? if (++$k < $cnt) : ?><span class="stat-item-chain"></span><? endif; ?> </div> <? endforeach; ?> </div> <script type="text/javascript"> var scale_30_1_list = [].concat( BX.findChildrenByClassName(BX('counters-a'), 'scale-num-30-1', true), BX.findChildrenByClassName(BX('counters-b'), 'scale-num-30-1', true) ); for (var i in scale_30_1_list) scale_30_1_list[i] = {node: scale_30_1_list[i], maxFontSize: 30, smallestValue: true}; var scale_30_2_list = [].concat( BX.findChildrenByClassName(BX('counters-a'), 'scale-num-30-2', true), BX.findChildrenByClassName(BX('counters-b'), 'scale-num-30-2', true) ); for (var i in scale_30_2_list) scale_30_2_list[i] = {node: scale_30_2_list[i], maxFontSize: 30, smallestValue: true}; var graphFixSize = new BX.FixFontSize({objList: scale_30_1_list, onresize: true}); var graphFixSize = new BX.FixFontSize({objList: scale_30_2_list, onresize: true}); <? if (!empty($funnelRates)) : ?> var scale_30_3_list = [].concat( BX.findChildrenByClassName(BX('funnel-a'), 'scale-num-30-3', true), BX.findChildrenByClassName(BX('funnel-b'), 'scale-num-30-3', true) ); for (var i in scale_30_3_list) scale_30_3_list[i] = {node: scale_30_3_list[i], maxFontSize: 30, smallestValue: true}; var graphFixSize = new BX.FixFontSize({objList: scale_30_3_list, onresize: true}); <? endif; ?> </script> <? endif; ?> </div> </td></tr> <? $tabControl->EndTab(); ?> <? $tabControl->End(); ?> <div class="adm-info-message-wrap"> <div class="adm-info-message" id="math-hint"> <span class="required"><sup>1</sup></span> <?=getMessage('ABTEST_MATH_POWER_HINT'); ?><br></br> <span class="required"><sup>2</sup></span> <?=getMessage('ABTEST_MATH_SIGNIFICANCE_HINT'); ?> </div> </div> <? require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_admin.php');