Перенес скрипты, шаблоны из админки, правки в контроллерах

parent 5dad880d
......@@ -38,7 +38,10 @@ return [
->allow(Roles::ROLE_USER, 'user.cabinet.viewid', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'user.cabinet.orderid', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'user.cabinet.amsystem', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'user.cabinet.group', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'user.cabinet.campaign', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'user.cabinet.groups.stat', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'user.cabinet.campaigns.stat', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'install.counter', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_USER, 'download.counter', null, new \App\Acl\Assertion\UserActive())
->allow(Roles::ROLE_GUEST, 'email.counter')
......
......@@ -3012,7 +3012,6 @@ return [
'codes' =>
array(
0 => 703883,
1 => 694422,
),
),
340 =>
......@@ -3216,6 +3215,22 @@ return [
0 => 703447,
),
),
365 =>
array(
'name' => 'город Севастополь',
'codes' =>
array(
0 => 694422,
),
),
366 =>
array(
'name' => 'Моб. операторы',
'codes' =>
array(
0 => 'empty',
),
),
)
]
];
......@@ -385,7 +385,7 @@ return [
],
[
'name' => 'user.cabinet.amsystem',
'path' => '/[:lang/]campaigns/',
'path' => '/[:lang/]groups/',
'middleware' => App\Action\User\CabinetAmSystem::class,
'allowed_methods' => ['GET', 'POST'],
'options' => [
......@@ -394,13 +394,29 @@ return [
],
'defaults' => [
'lang' => \App\Model\Locales::DEFAULT_LANG,
'action' => App\Action\User\CabinetAmSystem::ACTION_LIST,
'action' => App\Action\User\CabinetAmSystem::ACTION_GROUPS_LIST,
]
],
],
[
'name' => 'user.cabinet.group',
'path' => '/[:lang/]group/:id/',
'middleware' => App\Action\User\CabinetAmSystem::class,
'allowed_methods' => ['GET', 'POST'],
'options' => [
'constraints' => [
'lang' => '[a-z]{2,3}',
'id' => '\w+',
],
'defaults' => [
'lang' => \App\Model\Locales::DEFAULT_LANG,
'action' => App\Action\User\CabinetAmSystem::ACTION_GROUPS_ITEM,
]
],
],
[
'name' => 'user.cabinet.campaign',
'path' => '/[:lang/]campaign/:id',
'path' => '/[:lang/]campaign/:id/',
'middleware' => App\Action\User\CabinetAmSystem::class,
'allowed_methods' => ['GET', 'POST'],
'options' => [
......@@ -410,7 +426,35 @@ return [
],
'defaults' => [
'lang' => \App\Model\Locales::DEFAULT_LANG,
'action' => App\Action\User\CabinetAmSystem::ACTION_ITEM,
'action' => App\Action\User\CabinetAmSystem::ACTION_CAMPAIGNS_ITEM,
]
],
],
[
'name' => 'user.cabinet.groups.stat',
'path' => '/groups/stat/:id/',
'middleware' => App\Action\User\CabinetAmSystem::class,
'allowed_methods' => ['POST'],
'options' => [
'constraints' => [
'id' => '\d+',
],
'defaults' => [
'action' => App\Action\User\CabinetAmSystem::ACTION_GROUPS_STAT,
]
],
],
[
'name' => 'user.cabinet.campaigns.stat',
'path' => '/campaigns/stat/:id/',
'middleware' => App\Action\User\CabinetAmSystem::class,
'allowed_methods' => ['POST'],
'options' => [
'constraints' => [
'id' => '\d+',
],
'defaults' => [
'action' => App\Action\User\CabinetAmSystem::ACTION_CAMPAIGNS_STAT,
]
],
],
......
......@@ -64,6 +64,10 @@ h1 {
color : #697075;
}
.panel-heading h1 {
font-family: Arial, sans-serif;
}
h2 {
font-family: 'RalewayBold', sans-serif;
font-size : 1rem;
......
/* Таблица стилей к странице рекламных кампаний */
.b-content__work
{
.b-content__work {
margin: 0 auto;
padding-top: 75px;
max-width: 1240px;
}
}
.b-content__work.error .wrapp
{
......@@ -46,7 +45,6 @@
.form-group-data
{
display: none;
position: relative;
}
.form-group-data.selected
......@@ -54,29 +52,26 @@
display: block;
}
.form-group-data .b-content__loading
{
display: none;
position: absolute;
width: 100%;
height: 100%;
background: #FFF url('../img/gif-load.gif') center center no-repeat;
opacity: 0.5;
z-index: 1;
}
.form-group .form-control
{
font-family: monospace;
}
/* Стили из админки */
input[type="checkbox"],
input[type="radio"]
{
vertical-align: -2px;
}
.edited {
min-width: 100px;
min-height: 20px;
cursor: pointer;
}
input.editing {
display: none;
background-color: transparent;
border: 1px solid #ccc;
}
.b-left
{
float: left;
......@@ -91,41 +86,90 @@ input[type="radio"]
width: 50%;
}
table.campaigns tbody tr td.stat {
font-family: monospace;
.users-groups
{
margin-bottom: 30px;
}
.users-groups .user-name
{
margin-right: 10px;
}
table th .sort
{
color: #337ab7;
cursor: pointer;
}
table th .sort.selected,
table th .sort.selected:hover
{
color: #03772E;
text-decoration: underline;
}
table th .sort.selected.asc
{
color: #03772E;
}
table th .sort.selected.desc
{
color: #C02B2A;
}
/* таблица групп кампаний */
table.groups
{
white-space: nowrap;
text-align: right;
}
}
table.campaigns thead th.stat {
table.groups thead th.stat
{
width: 1px;
text-align: right;
font-family: monospace;
}
table.campaigns tbody tr.group-item {
table.groups tbody tr.group-item
{
font-weight: bold;
background-color: #f9f9f9;
}
table.campaigns tbody tr.campaign-item {
table.groups tbody tr.campaign-item
{
display: none;
}
table.campaigns tbody tr.campaign-item.open {
table.groups tbody tr.campaign-item td
{
background-color: #fff;
}
table.groups tbody tr.campaign-item.open
{
display: table-row;
}
table.campaigns tbody td.campaign-item-title {
table.groups tbody td.campaign-item-title
{
padding-left: 40px;
}
table.campaigns tbody tr td.stat.load-target {
font-style: italic;
table.groups tbody td.stat
{
text-align: right;
font-family: monospace;
}
table.groups tr.disabled,
table.groups tr.disabled-group
{
opacity: 0.5;
}
.table.campaigns span.group
.table.groups span.group
{
display: inline-block;
min-width: 12px;
......@@ -133,33 +177,129 @@ table.campaigns tbody tr td.stat {
cursor: pointer;
}
.table.campaigns span.group b.open
.table.groups span.group b.open
{
display: none;
}
.table.campaigns span.group.open b.closed
.table.groups span.group.open b.closed
{
display: none;
}
.table.campaigns span.group.open b.open
.table.groups span.group.open b.open
{
display: inline;
}
.form-group.active span
/* таблица кампаний */
table.campaigns tbody tr td.stat {
font-family: monospace;
white-space: nowrap;
text-align: right;
}
table.campaigns thead th.stat
{
color: #D93025;
width: 1px;
text-align: right;
font-family: monospace;
}
.form-group.active.enabled span
table.campaigns tbody tr.active td {
background-color: inherit;
}
table.campaigns tbody tr td.stat.load-target {
font-style: italic;
}
.form-group.title .value-show.changed
{
color: #076d13;
text-decoration: underline;
}
.form-group .value-notice
{
color: #2CA02C;
display: none;
font-style: italic;
font-size: 12px;
color: #A0A0A0;
}
.form-group .geo-notice
{
font-style: italic;
font-size: 12px;
color: #A0A0A0;
}
input.campaign-title {
padding: 0 6px;
line-height: 34px;
color: #697075;
}
.campaign-title.edited {
display: inline-block;
min-width: 600px;
height: 36px;
line-height: 36px;
}
.campaign-title.edited.was-edited {
color: #076d13;
text-decoration: underline;
}
.campaign-title.editing {
margin-left: -7px;
width: 600px;
}
input.group-title {
padding: 0 12px;
line-height: 34px;
color: #697075;
}
.group-title.edited {
display: inline-block;
padding: 0 13px;
min-width: 600px;
height: 36px;
line-height: 36px;
color: #337ab7;
font-weight: bold;
}
.group-title.editing {
margin-left: 4px;
width: 600px;
}
.form-control.user-id
{
display: inline-block;
width: 250px;
}
.user-new
{
display: none;
margin-left: 10px;
}
.user-new input
{
display: inline;
width: 300px;
}
.form-group.url .value-show,
.form-group.tracking_pixels .value-show div.url
.form-group.tracking_pixels .value-show div.url,
.tracking-action_link
{
padding: 5px;
line-height: 15px;
......@@ -171,37 +311,143 @@ table.campaigns tbody tr td.stat {
.form-group.tracking_pixels .value-show div.url
{
line-height: 15px;
margin-bottom: 4px;
}
.tracking-action_link
{
color: #0c5c82;
margin-bottom: 4px;
}
.form-group.url .value-show a,
.form-group.tracking_pixels .value-show div.url a
{
color: #0c5c82;
}
.form-group.url .value-show a:hover,
.form-group.tracking_pixels .value-show div.url a:hover
{
text-decoration: underline;
}
.form-group label.select-item.disabled
{
color: #BCBCBC;
}
.form-group .value-show span
.btn.btn-primary.save-item,
.btn.btn-primary.cancel-item
{
float: none;
margin: 0;
}
.btn.edit-item
{
margin-bottom: 1px;
padding: 0;
color: #337ab7;
font-size: 12px;
text-decoration: underline;
}
.form-group .value-edit,
.form-group .save-item,
.form-group .cancel-item
{
display: none;
}
.form-group .value-show.campaign-value,
.form-group .value-show-group
{
float: left;
}
.form-group .value-show.campaign-value
{
padding-right: 50px;
border-right: 4px solid #ccc;
margin-right: -4px;
min-width: 150px;
min-height: 1px;
}
.form-group .value-show-group
{
padding-left: 10px;
border-left: 4px solid #ccc;
}
.form-group .value-show-group span
{
opacity: 0.65;
}
.form-group .value-show-group.geo
{
float: none;
padding: 0;
border-left: none;
}
.form-group .value-show-group .notice
{
margin-top: 4px;
font-style: italic;
font-size: 12px;
color: #A0A0A0;
}
.form-group .value-show span,
.form-group .value-show-group span
{
font-size: 13px;
color: #000000;
}
.form-group .value-show-group b,
.form-group .value-show b
{
color: #23527c;
}
.form-group.geo.group-geo .value-show-group.geo,
.form-group.geo.group-geo.null-value .value-show
{
display: none;
}
.form-group.geo.group-geo.null-value .value-show-group.geo
{
display: block;
}
.form-group.tracking-action
{
}
.panel-heading h1
{
display: inline-block;
}
.panel-heading__controls
{
float: right;
}
.form-control.date-value,
.form-control.price,
.form-control.money-limit-total,
.form-control.limit
.form-control.limit,
.form-control.order-sum
{
display: inline;
}
......@@ -212,6 +458,20 @@ table.campaigns tbody tr td.stat {
}
.form-control.price,
.form-control.order-sum
{
width: 60px;
}
.form-control.price:invalid ,
.form-control.order-sum:invalid,
.form-control.money-limit-total:invalid,
.form-control.limit:invalid
{
color: #C02B2A;
}
.form-control.money-limit-total
{
width: 100px;
......@@ -223,14 +483,20 @@ table.campaigns tbody tr td.stat {
margin-bottom: 4px;
}
.form-group.campaign-money-limit .form-control.limit
.form-group label.title-field
{
width: 100px;
margin-right: 10px;
}
.form-group label:first-child
.panel-heading label.title-field
{
margin-right: 10px;
display: none;
}
.form-group label.title-field.changed
{
color: #076d13;
text-decoration: underline;
}
.form-group label.select-item
......@@ -249,6 +515,11 @@ table.campaigns tbody tr td.stat {
font-weight: normal;
}
.form-group .tracking_pixels_item .add-row
{
display: inline;
}
.form-group .tracking_pixels_urls .url-item
{
margin-bottom: 4px;
......@@ -262,23 +533,179 @@ table.campaigns tbody tr td.stat {
width: 100%;
}
.form-group .tracking_pixels_urls .delete-item {
float: right;
margin-right: -20px;
height: 32px;
width: 15px;
font-size: 27px;
line-height: 32px;
vertical-align: -4px;
color: #383838;
cursor: pointer;
}
.form-control#targeting_geo_country
{
display: inline-block;
width: 200px;
margin-bottom: 6px;
margin-right: 4px;
}
.geo_country .b-exclude label
{
font-weight: normal;
font-size: 13px;
}
.geo_region,
.geo_city
{
float: left;
padding: 4px 6px 0;
margin-bottom: 5px;
width: 100%;
border: 1px solid #CCC;
border-radius: 4px;
}
.geo_region .b-exclude,
.geo_city .b-exclude
{
float: right;
}
.geo_region-city .filters-select
{
float: left;
padding-right: 3px;
width: 50%;
height: 200px;
}
.geo_region-city .filters-values {
float: right;
padding-left: 3px;
width: 50%;
height: 200px;
}
.geo_region-city .region-val-geo {
line-height: 32px;
}
.geo_region #region-filter {
display: inline-block;
float: none;
margin-right: 0;
}
.geo_region-city .filters-select .filter {
margin-bottom: 8px;
}
.geo_region-city .filters-select .list-filters-wrap {
display: inline-block;
width: 100%;
border: 1px solid #CCCCCC;
border-radius: 4px;
}
.geo_region-city .list-filter {
padding-left: 4px;
height: 150px;
overflow-x: hidden;
overflow-y: scroll;
}
.geo_region-city .list-filter label,
.geo_region-city .values-string-list label
{
font-weight: normal;
}
.geo_region-city .values-string-list {
padding: 2px 6px;
height: 194px;
min-height: 34px;
border: 1px solid #CCCCCC;
border-radius: 4px;
overflow-y: scroll;
}
table.campaigns tbody tr.disabled
{
opacity: 0.5;
}
table.campaign-banners thead tr th {
/* Баннеры */
.form-group.banners label
{
line-height: 34px;
}
.form-control.banners-status
{
float: right;
width: 120px;
}
table.campaign-banners
{
font-family: monospace;
}
table.campaign-banners thead tr th {
text-align: right;
}
}
table.campaign-banners th .sort {
color: #337ab7;
}
.table.campaign-banners tbody tr td
{
background-color: #f5f5f5;
}
table.campaign-banners tbody tr td {
.table.campaign-banners tfoot tr.total
{
font-weight: bold;
font-size: 12px;
}
.table.campaign-banners tfoot tr.total td
{
text-align: right;
}
.table.campaign-banners.active tr.not-active,
.table.campaign-banners.not-active tr.active
{
display: none !important;
}
.table.campaign-banners tr.total td:first-child
{
font-size: 14px;
text-align: left;
}
table.campaign-banners tbody tr td
{
font-size: 12px;
font-family: monospace;
white-space: nowrap;
text-align: right;
}
}
table.campaign-banners tbody tr td.stat.load-target {
table.campaign-banners tbody tr td.stat.load-target
{
font-style: italic;
}
......@@ -293,6 +720,7 @@ table.campaign-banners tbody tr td {
background-position: center;
}
.b-popup__window.preview {
width: auto;
min-width: 380px;
......@@ -313,30 +741,83 @@ table.campaign-banners tbody tr td {
}
.b-popup-content {
min-height: 300px;
max-height: 800px;
padding: 10px;
}
.b-popup__window.preview .b-popup-content {
min-height: 300px;
max-height: 800px;
}
.b-popup-content h2
{
color: #000000;
}
.b-popup-content h2 b
.b-popup-content b
{
color: #39B54A;
}
.b-popup-content h2 span
.b-popup-content span
{
font-family: 'RalewayRegular', sans-serif;
}
.b-popup-content .b-popup-controls
{
margin-top: 10px;
}
.b-popup__window.preview .form-group {
margin-bottom: 0;
}
.b-popup__window.preview .banner-img {
.b-popup__window.preview .banner-img {
text-align: center;
}
}
.b-popup__window.preview .form-group .controls {
display: none;
}
.form-group.banners .form-pattern,
.form-group.banners input#img
{
display: none;
}
.form-group .image-controls,
.form-group .image-wrap
{
margin-bottom: 5px;
}
.form-group .image-wrap
{
display: none;
padding: 10px 0;
text-align: center;
}
.form-group .form-control.banner-size
{
display: inline-block;
width: 170px;
}
.form-group .btn.select-image
{
float: right;
}
.group-campaigns
{
margin-top: 16px;
}
/* Вкладки статистики */
textarea#campaign-stat,
textarea#campaign-stat-total,
......@@ -349,6 +830,7 @@ textarea#cities-codes
display: none;
}
.chart-graph-stat-info,
.chart-graph-stat-error,
.sites-stats-info,
......@@ -367,7 +849,6 @@ textarea#cities-codes
height: 370px;
}
/*
#table-stat
*/
......@@ -383,22 +864,7 @@ textarea#cities-codes
font-family: monospace;
}
.table.table-striped thead.sortable tr b
{
cursor: pointer;
}
.table.table-striped thead.sortable tr b.not-sorted
{
cursor: default;
}
.table.table-striped thead.sortable tr b.selected
{
color: #2CA02C;
}
.table.table-striped thead.sortable tr span
.table.sortable thead tr span
{
display: inline-block;
border-bottom: 2px solid red;
......@@ -430,7 +896,8 @@ textarea#cities-codes
.table.table-by-cats span.group
{
display: inline-block;
min-width: 12px;
margin-right: 10px;
min-width: 10px;
color: #697075;
cursor: pointer;
}
......@@ -493,6 +960,7 @@ textarea#cities-codes
text-align: right;
}
.table tbody tr td.stat.date
{
font-size: 12px;
......@@ -503,6 +971,23 @@ textarea#cities-codes
color: #D33E3D;
}
.btn.action-archive
{
margin-left: 10px;
line-height: 12px;
}
.btn.action-archive.hidden
{
display: none;
}
.btn.action-archive.remove
{
background-color: #10934A;
border-color: #10934A;
}
.form-control.campaign-status
{
display: inline;
......@@ -530,3 +1015,28 @@ textarea#cities-codes
}
/* папап редактирования */
.b-popup__window.edit
{
}
.b-popup__window.edit h1
{
text-align: left;
font-size: 18px;
}
.b-popup-inner .campaign-visitor-limit
{
float: left;
width: 50%;
}
.b-popup-inner .campaign-money-limit-values .form-control.limit
{
width: 100px;
}
\ No newline at end of file
$(document).ready(function () {
"use strict";
/* Стр. создания-редактирования кампании */
var
$contentWrap = $('.b-content__work.inner'),
isCreatePage = $('.campaign-id').data('id') == 0,
datepicker1 = $('#campaign-date-begin').datepicker({
dateFormat: "yyyy-mm-dd",
autoClose: true,
onSelect: function(fd, d, picker) {
dataChanged($('#campaign-date-begin'));
},
}).data('datepicker'),
datepicker2 = $('#campaign-date-end').datepicker({
dateFormat: "yyyy-mm-dd",
autoClose: true,
onSelect: function(fd, d, picker) {
dataChanged($('#campaign-date-end'));
},
}).data('datepicker'),
$form = $('#campaign-create-form', $contentWrap),
isChanged = false,
popupIsOpen = false,
changeContriolsListenerIsActive = false,
$checkTrackingAction = $('#group-tracking-action'),
$btnSubmitAction = $('.btn.submit-action', $form),
$btnCancelAction = $('.btn.cancel-action', $form),
$btnArchive = $('.action-archive', $form),
$btnArchiveSend = $('.action-archive.send', $form),
$btnArchiveRemove = $('.action-archive.remove', $form);
// Покидание страницы:
window.onbeforeunload = function(e) {
if (isChanged || popupIsOpen) {
return "Данные не сохранены. Закрыть страницу без сохранения?";
}
};
function CheckNullValueInput(value) {
return ($.trim(value) != '') ? $.trim(value) : null;
}
function CheckFloatValueInput(value) {
value = value.replace(',', '.');
return (isNaN(parseFloat(value))) ? null : parseFloat(value);
}
function checkPriceValue() {
var
$inputPrice = $('input#campaign-price', $form),
$notice = $('.form-group.price .value-notice', $form);
if ($inputPrice.val() == '') {
$notice.show();
} else {
$notice.hide();
}
}
function checkOrderSumValue() {
var
$inputOrderSum = $('input#campaign-order-sum', $form),
$notice = $('.form-group.tracking-action .value-notice', $form);
if ($inputOrderSum.val() == '') {
$notice.show();
} else {
$notice.hide();
}
}
function CheckTrackingAction($check) {
var
$content = $('.tracking-action_content'),
isChecked = $check.prop("checked");
if (isChecked) {
$content.show();
} else {
$content.hide();
}
}
function dataChanged($target)
{
if (changeContriolsListenerIsActive) {
isChanged = true;
$btnCancelAction.attr('disabled',false);
$btnSubmitAction.attr('disabled',false);
var
$formGroup = $target.parents('.form-group').eq(0),
$label = $('label.title-field', $formGroup);
$label.addClass('changed');
// Название в header-панели
if ($formGroup.hasClass('title')) {
$target.siblings('.value-show').addClass('changed');
}
}
}
function AddListenerChangeContriols()
{
changeContriolsListenerIsActive = true;
// Действие по какому-либо контролу:
$form.on('change', 'input, select:not(.banners-status)', function(){
dataChanged($(this));
});
$form.on('keyup', 'input', function(){
dataChanged($(this));
});
$('.panel-heading input.campaign-title').on('change', function(){
dataChanged($(this));
});
}
// Клик на редактируемый элемент (название кампании):
$contentWrap.on('click', '.edited', function(){
var
$field = $(this),
fieldName = $field.data('field'),
$input = $('input.'+fieldName, $field.parent()),
oldVal = $input.val(),
oldText = $field.html();
$field.hide();
$input.off('blur').off('keyup').show().focus();
$input.on('keyup', function(e) {
if (e.keyCode == 13) {
$input.blur();
}
if (e.keyCode == 27) {
$input.off('blur');
$input.val(oldVal);
$field.html(oldText);
$input.hide();
$field.show();
}
});
$input.on('blur', function() {
var
textInput = $input.val(),
textField = textInput;
$input.hide();
$field.html(textField);
if (textInput != oldVal) {
$field.addClass('was-edited');
}
$field.show();
});
});
// Изменение стоимости
$('input#campaign-price', $form).on('keyup', function(){
checkPriceValue();
});
checkPriceValue();
// Клик на галочку Трекинг действий:
$checkTrackingAction.on('change', function(e) {
CheckTrackingAction($(this));
});
CheckTrackingAction($checkTrackingAction);
// Изменение значения Цена действия по-умолчанию:
$('input#campaign-order-sum', $form).on('keyup', function(){
checkOrderSumValue();
});
checkOrderSumValue();
// Редактирование элементов формы:
(function(){
var
$popupBg = $('.l-popup'),
$popupEdit = $('.b-popup__window.edit', $popupBg),
$popupInner = $('.b-popup-inner', $popupEdit),
$popupClose = $('.button-close', $popupEdit),
$popupTitle = $('.b-popup-content h1', $popupEdit),
$saveBtn = $('.btn.save-edit', $popupEdit),
$cancelBtn = $('.btn.cancel-edit', $popupEdit);
// Склонение числительных
function declOfNum(number, titles) {
var cases = [2, 0, 1, 1, 1, 2];
return titles[ (number%100 > 4 && number %100 < 20) ? 2 : cases[Math.min(number%10, 5)] ];
}
function ChangeEditValue($formGroup) {
var
type = $formGroup.data('type'),
$valueShow = $('.value-show', $formGroup),
$valueEdit = $('.value-edit', $formGroup),
content = '';
if (type == 'title') {
content = $('input', $valueEdit).val();
}
if (type == 'url') {
var urlValue = $('input', $valueEdit).val();
content = '<a href="' + urlValue + '" target="_blank">' + urlValue + '</a>';
}
if (type == 'visitor-limit') {
$('.campaign-visitor-limit input', $valueEdit).each(function(){
var
$this = $(this),
itemVal = parseInt($this.val());
if (itemVal) {
var titles = ($this.parent().hasClass('view')) ? ['показ', 'показа', 'показов'] : ['клик', 'клика', 'кликов'];
content += '<span><b>' + itemVal + '</b> <i>' + declOfNum(itemVal, titles) + '</i> ' + $this.data('desc') + '</span><br />';
}
});
}
if (type == 'money-limit') {
$('input', $valueEdit).each(function(){
var
$this = $(this),
itemVal = CheckFloatValueInput($this.val());
if (itemVal) {
var titles = 'грн.';
content += '<span><b>' + itemVal + '</b> ' + titles + ' ' + $this.data('desc') + '</span><br />';
}
});
}
if (type == 'geo') {
var
countryVal = $('.geo_country select option:selected', $valueEdit).text(),
regionItems = [],
cityItems = [],
regionVal = '',
cityVal = '';
if ($('.geo_country select', $valueEdit).val() == 'UA' && $('.geo_country .b-exclude input').is(':checked')) {
countryVal += ' (исключить неподконтрольные территории)';
}
content += '<span>Страна: <b>' + countryVal + '</b></span><br />';
$('.geo_region .filters-values ul li input', $valueEdit).each(function(){
regionItems.push($(this).data('text').replace(' область', ''));
});
if (regionItems.length > 0) {
regionVal += ($('.geo_region .b-exclude input', $valueEdit).is(':checked')) ? '<i>кроме:</i> ' : '<i>только:</i> ';
regionVal += '<b>' + regionItems.join(', ') + '</b>';
content += '<span>Области ' + regionVal + '</span><br />';
}
$('.geo_city .filters-values ul li input', $valueEdit).each(function(){
cityItems.push($(this).data('text'));
});
if (cityItems.length > 0) {
cityVal += ($('.geo_city .b-exclude input', $valueEdit).is(':checked')) ? '<i>кроме:</i> ' : '<i>только:</i> ';
cityVal += '<b>' + cityItems.join(', ') + '</b>';
content += '<span>Города ' + cityVal + '</span><br />';
}
var
geoData = {},
countryValue,
countryExclude,
regionValues = [],
regionExclude,
cityValues = [],
cityExclude,
isGeoSet;
// country
countryValue = $('select#targeting_geo_country', $formGroup).val();
countryExclude = ($('input#country-exclude', $formGroup).is(':checked')) ? true : false;
geoData['country'] = {
values: [countryValue],
exclude: false
};
// special
if (countryValue == 'UA' && countryExclude) {
geoData['special'] = {
values: ["ATO", "Crimea"],
exclude: true
}
}
// region
$('.geo_region .filters-values ul li', $formGroup).each(function(){
regionValues.push(parseInt($('input', $(this)).data('id')));
});
regionExclude = ($('input#region-exclude', $formGroup).is(':checked')) ? true : false;
geoData['region'] = {
values: regionValues,
exclude: regionExclude
};
// city
$('.geo_city .filters-values ul li', $formGroup).each(function(){
cityValues.push(parseInt($('input', $(this)).data('id')));
});
cityExclude = ($('input#city-exclude', $formGroup).is(':checked')) ? true : false;
geoData['city'] = {
values: cityValues,
exclude: cityExclude
};
if ((countryValue == 'UA' && countryExclude) && (regionValues.length == 0) && (cityValues.length == 0)) {
isGeoSet = false;
} else {
isGeoSet = true;
}
// Проверка на совпадение данных с родительскими:
var
$groupValue = $('#group-targeting-value'),
geoGroupValues = ($groupValue.length > 0) ? JSON.parse($groupValue.val()) : null;
if (geoGroupValues) {
if (JSON.stringify(geoGroupValues.geo) === JSON.stringify(geoData)) {
isGeoSet = false;
}
}
if (isGeoSet) {
$formGroup.removeClass('null-value');
$formGroup.attr('data-value', JSON.stringify({geo: geoData}))
} else {
$formGroup.addClass('null-value');
$formGroup.attr('data-value', null)
}
}
if (type == 'tracking-pixels') {
var
dataTrackingPixels = {},
isTrackingPixelsSet = false;
$('.tracking_pixels_item', $formGroup).each(function(){
var
$this = $(this),
name = $this.data('name'),
dataValues = [],
noItems = true,
inputValue;
$('.tracking_pixels_urls input', $this).each(function(){
var $input = $(this);
if ($input.val()) {
isTrackingPixelsSet = true;
if (noItems) {
content += '<div>' + $('label', $this).text() + '</div>';
noItems = false;
}
inputValue = $.trim($input.val());
content += '<div class="url"><a href="' + inputValue + '" target="_blank">' + inputValue + '</a></div>';
dataValues.push(inputValue);
}
});
dataTrackingPixels[name] = dataValues;
});
if (isTrackingPixelsSet) {
$formGroup.attr('data-value', JSON.stringify(dataTrackingPixels))
} else {
$formGroup.attr('data-value', null)
}
}
$valueShow.empty().append(content);
}
function AddEditPopupEventsListener() {
// Закрыввем попап по клику на Х:
$popupClose.on('click', function(){
ClosePopupEdit();
});
// Закрыввем попап по клику извне:
/*
$popupEdit.on('click', function(event){
event.stopPropagation();
});
$popupBg.on('click', function(){
ClosePopupEdit();
});
*/
AddControlsEventsListener();
}
function RemoveEditPopupEventsListener() {
$popupClose.off('click');
$popupEdit.off('click');
$popupBg.off('click');
}
function ShowPopupEdit(type, title, data)
{
popupIsOpen = true;
$saveBtn.attr('disabled', true);
InsertPopupEdit(title, data);
$popupBg.addClass('open-popup');
$popupEdit.show();
$popupEdit.attr('data-type', type);
AddEditPopupEventsListener();
}
function ClosePopupEdit()
{
popupIsOpen = false;
$popupBg.removeClass('open-popup');
$popupEdit.hide();
$popupInner.empty();
RemoveEditPopupEventsListener();
}
function InsertPopupEdit(title, data)
{
$popupTitle.text(title);
$popupInner.append(data);
}
function AddControlsEventsListener()
{
// Действие по какому-либо контролу внутри попапа:
$('input, select', $popupInner).on('change', function(){
$saveBtn.attr('disabled', false);
});
$('input', $popupInner).on('keyup', function(){
$saveBtn.attr('disabled', false);
});
$('.add-row, .delete-item', $popupInner).on('click', function(){
$saveBtn.attr('disabled', false);
});
// Добавление/удаление tracking_pixels urls
(function(){
$popupEdit.on('click', '.tracking_pixels_item .add-row', function(){
var
$this = $(this),
$trackingItem = $this.parents('.tracking_pixels_item'),
$urlsWrap = $('.tracking_pixels_urls', $trackingItem);
$urlsWrap.append('<div class="url-item"><input type="text" class="form-control" value="" placeholder="url"><div class="delete-item">×</div></div>');
});
$popupEdit.on('click', '.tracking_pixels_urls .delete-item', function(){
$(this).parent().remove();
});
})();
// Гео
(function(){
var
$geoCountrySelect = $('.form-control#targeting_geo_country', $popupEdit),
$geoWrap = $('.targeting_geo', $popupEdit);
// Изменение значения страны
$geoCountrySelect.on('change', function(){
var $geoCountryExclude = $('.geo_country .b-exclude', $popupEdit);
if ($(this).val() == 'UA') {
$geoCountryExclude.show();
} else {
$geoCountryExclude.hide();
}
});
// Изменение списка фильтров чекбоксом:
$geoWrap.on('change', '.geo_region-city .list-filter input',function(){
var
$this = $(this),
$listItems = $('li', $this.parents('ul')),
$listString = $('.values-string-list', $this.parents('.form-group')[0]),
values = [],
tplId = ($this.parents('.geo_region').length) ? 'l-region-id-' : 'l-city-id-';
$this.attr('checked', $this.is(':checked'));
$listItems.each(function(){
var
$this = $(this),
$checkbox = $('input', $this);
if ($checkbox.is(':checked')) {
values.push([$checkbox.data('id'), $checkbox.data('text')]);
}
});
// Редактируем список выбранных фильтров справа:
$listString.empty();
if (values.length > 0) {
values.forEach(function(valuesItem) {
$listString.append('<li><input type="checkbox" checked id="' + tplId + valuesItem[0] + '" data-id="' + valuesItem[0] + '" data-text="' + valuesItem[1] + '"> <label for="' + tplId + valuesItem[0] + '">' + valuesItem[1] + '</label></li>');
});
}
//$listString.trigger('change-list');
});
// Удаление из списка фильтров снятием галочки:
$geoWrap.on('change', '.geo_region-city .values-string-list input',function(){
var
itemId = $(this).data('id'),
$listFilterItem = $('.list-filter input[data-id="' + itemId + '"]', $(this).parents('.form-group'));
$listFilterItem.attr('checked', false);
$listFilterItem.change();
});
// Изменение фильтрации внутри фильтра:
$geoWrap.on('keyup', '.geo_region-city input.filter',function(){
var
$this = $(this),
val = $this.val().toLowerCase(),
$listItems = $('li', $this.parents('.filters-select'));
// Фильтрация списка значений:
$listItems.each(function(){
var
$item = $(this),
itemTitle = $('input', $item).data('text').toLowerCase(),
filteredByVal = itemTitle.indexOf(val) == 0;
$item.hide().removeClass('filtered');
if (filteredByVal) {
$item.show().addClass('filtered');
}
});
});
})();
}
// Клик на "Правка" для блока
$('.form-group').on('click', '.edit-item', function(){
var
$this = $(this),
$formGroup = $this.parents('.form-group').eq(0),
typeGroup = $formGroup.data('type'),
$valueEdit = $('.value-edit', $formGroup),
titleGroup = $('label.title-field', $this.parent()).text();
$formGroup.attr('data-tempstate', $valueEdit.html());
ShowPopupEdit(typeGroup, titleGroup, $valueEdit.html());
return false;
});
// Клик на "Сохранить" значение блока
$saveBtn.on('click', function(){
if ($(this).attr('disabled') == 'disabled') return false;
var
type = $popupEdit.attr('data-type'),
$formGroup = $('.form-group[data-type="' + type + '"]'),
$valueEdit = $('.value-edit', $formGroup);
$formGroup.attr('data-tempstate', null);
$('input', $popupEdit).each(function(){
var $this = $(this);
$this.attr("value", $.trim($this.val()));
});
$valueEdit.html($popupInner.html());
ChangeEditValue($formGroup);
ClosePopupEdit();
dataChanged($valueEdit);
return false;
});
// Клик на "Отменить" редактирование блока
$cancelBtn.on('click', function(){
var
type = $popupEdit.attr('data-type'),
$formGroup = $('.form-group[data-type="' + type + '"]'),
$valueEdit = $('.value-edit', $formGroup);
$valueEdit.html($formGroup.attr('data-tempstate'));
$formGroup.attr('data-tempstate', null);
ClosePopupEdit();
return false;
});
// Устанавливаем стартовые значения блоков формы
if (!isCreatePage) {
$('.form-group[data-type]').each(function(){
ChangeEditValue($(this));
});
}
})();
// Баннеры:
(function(){
var
$popupBg = $('.l-popup'),
$popup = $('.b-popup__window.preview', $popupBg),
$popupClose = $('.button-close', $popup),
$popupInner = $('.b-popup-content', $popup),
$popupMessage = $('.b-popup-message', $popup),
$banners = $('.form-group.banners', $form),
$tableBanners = $('table.campaign-banners', $banners),
$addItem = $('.add-row', $banners),
$inputImage = $('input#img', $banners);
if (!isCreatePage)
{
// Фильтрация в таблице баннеров:
$('.panel-body').filterAmsystemTable({
table: '.table.campaign-banners',
selectStatus: '.form-control.banners-status',
});
// Сортировка в таблице баннеров:
$tableBanners.sortAmsystemTable();
}
// Открываем попап превью:
$tableBanners.on('click', '.banner-preview', function(){
var
$this = $(this),
size = $.trim($('.banner-size', $this.parents('tr')).text()),
data = {
id: $this.parents('tr').data('id'),
size: size.split('x'),
img: $this.attr('src')
};
ShowPopup('preview', data);
});
// Открываем попап добавления баннера:
$addItem.on('click', function(){
ShowPopup('add');
});
function AddPreviewPopupEventsListener() {
// Закрыввем попап по клику на Х:
$popupClose.on('click', function(){
ClosePopup();
});
// Закрыввем попап по клику извне:
/*
$popup.on('click', function(event){
event.stopPropagation();
});
$popupBg.on('click', function(){
ClosePopup();
});
*/
}
function RemovePreviewPopupEventsListener() {
$popupClose.off('click');
$popup.off('click');
$popupBg.off('click');
}
function ShowPopup(type, data)
{
if (type == 'preview') InsertPopupPreview(data);
if (type == 'add') InsertPopupAdd();
$popupBg.addClass('open-popup');
$popup.show();
AddPreviewPopupEventsListener();
}
function ClosePopup()
{
$popupBg.removeClass('open-popup');
$popupMessage.hide();
$popup.hide();
$popupInner.empty();
RemovePreviewPopupEventsListener();
}
function InsertPopupPreview(data)
{
var $content = $(document.createElement('div'));
$content.append('<h2>id: <b>'+ data.id +'</b> <span>('+ data.size[0] +'х'+ data.size[1] +')</span></h2>');
$content.append('<div class="banner-img"><img width="' + data.size[0] + 'px" height="' + data.size[1] + 'px" src="' + data.img + '" /></div>');
$popupInner.append($content)
}
function InsertPopupAdd()
{
var
$content = $(document.createElement('div')),
$tplBannerForm = $('.form-pattern div.form-group', $banners).clone();
$content.append('<h2>Добавление баннера</h2>');
$content.append($tplBannerForm);
$popupInner.append($content)
}
// Клик на "Загрузите изображение":
$popupInner.on('click', '.btn.select-image', function(){
$inputImage.click();
return false;
});
// Выбор изображения:
$inputImage.on('change', function() {
var file = $(this)[0].files[0];
if (!file) {
return false;
}
var
$imageWrap = $('.image-wrap', $popupInner),
$imageBanner = $('img', $imageWrap),
$controlsPopup = $('.controls', $popupInner),
$bannerSize = $('.form-control.banner-size', $popupInner);
if (file.type.match('image.*')) {
var fileReader = new FileReader();
fileReader.onload = function(f) {
CheckBannerSize(
function(imgPath, imgSize, imgTitle){
$popupMessage.hide();
var d = new Date();
$imageBanner.attr('src', imgPath + '?' + d.getTime());
$imageBanner.attr('width', imgSize[0] + 'px');
$imageBanner.attr('height', imgSize[1] + 'px');
$imageBanner.attr('title', imgTitle);
$bannerSize.val(imgSize[0]+'x'+imgSize[1]);
$imageWrap.show();
$controlsPopup.show();
},
function(dataMsg){
ShowPopupMessage('error', dataMsg);
$imageWrap.hide();
$controlsPopup.hide();
}
);
};
fileReader.readAsDataURL(file);
} else {
$.showMessage('error', 'Выбранный файл не является изображением!');
}
});
// Клик на "Сохранить" внутри попапа:
$popupInner.on('click', '.btn.submit-action', function(){
ApplyBannerLoad(
function(bannerId, bannerSize, bannerImg){
AdTableRow(bannerId, bannerSize, bannerImg);
ClosePopup();
},
function(dataMsg){
$.showMessage('error', dataMsg);
}
);
return false;
});
// Клик на "Отмена" внутри попапа:
$popupInner.on('click', '.btn.cancel-action', function(){
CancelBannerLoad(
function(){
ClosePopup();
},
function(dataMsg){
$.showMessage('error', dataMsg);
}
);
return false;
});
// Запрос для проверки размера изображения при его загрузке:
function CheckBannerSize(callback, callbackError)
{
var
$form = $('form#img-size-form'),
action = $form.attr('action'),
method = $form.attr('method'),
formData = new FormData();
// Данные картинки:
if ($inputImage.length>0) {
formData.append('img', $inputImage.prop('files')[0]);
}
formData.append('size', $('.form-control.banner-size', $popupInner).val().split('x'));
if ($('.image-wrap img', $popupInner).attr('title')) {
formData.append('current_img', $('.image-wrap img', $popupInner).attr('title'));
} else {
}
//console.log('AAA CheckBannerSize = ', formData);
//return false;
$.ajax(action, {
type: method,
data: formData,
cache:false,
contentType: false,
processData: false,
success: function(data) {
if(data) {
if(data.result === true && data.img_path && data.img_size) {
if (callback && $.isFunction(callback)) {
callback(data.img_path, data.img_size, data.img_title);
}
}
if(data.result === false && data.msg) {
if (callbackError && $.isFunction(callbackError)) {
callbackError(data.msg);
}
}
}
},
error: function(rew, status, err) {
console.log(status, err);
if (callbackError && $.isFunction(callbackError)) {
callbackError('Ошибка: ' + rew.responseText);
}
}
});
return false;
}
// Запрос для подтверждения загрузки баннера:
function ApplyBannerLoad(callback, callbackError)
{
var
$form = $('form#img-size-form'),
action = $form.attr('action'),
method = $form.attr('method'),
$img = $('.image-wrap img', $popupInner),
data = {
type: 'apply_load',
img: $img.attr('title'),
width: parseInt($img.attr('width')),
height: parseInt($img.attr('height'))
};
$.ajax(action, {
type: method,
data: data,
success: function(data) {
if(data) {
if(data.result === true) {
if (callback && $.isFunction(callback)) {
callback(data.id, data.size, data.img);
}
}
if(data.result === false && data.msg) {
$.showMessage('error', data.msg);
if (callbackError && $.isFunction(callbackError)) {
callbackError(data.msg);
}
}
}
},
error: function(rew, status, err) {
console.log(status, err);
if (callbackError && $.isFunction(callbackError)) {
callbackError(data.msg);
}
}
});
}
// Запрос для отмены загрузки баннера:
function CancelBannerLoad(callback, callbackError)
{
var
$form = $('form#img-size-form'),
action = $form.attr('action'),
method = $form.attr('method'),
data = {
type: 'cancel_load',
img: $('.image-wrap img', $popupInner).attr('title')
};
$.ajax(action, {
type: method,
data: data,
success: function(data) {
if(data) {
if(data.result === true) {
if (callback && $.isFunction(callback)) {
callback();
}
}
if(data.result === false && data.msg) {
$.showMessage('error', data.msg);
if (callbackError && $.isFunction(callbackError)) {
callbackError(data.msg);
}
}
}
},
error: function(rew, status, err) {
console.log(status, err);
if (callbackError && $.isFunction(callbackError)) {
callbackError(data.msg);
}
}
});
}
// Добавление строки в таблицу для баннера:
function AdTableRow(bannerId, bannerSize, bannerImg)
{
var statFieldsCount = $('thead th.stat', $tableBanners).length;
var $tableRow = '' +
'<tr class="banner-item" data-id="' + bannerId + '">' +
'<td class="check"><input type="checkbox" checked></td>' +
'<td><span class="banner-size">' + bannerSize.join('x') + '</span></td>' +
'<td><span class="banner-preview" src="' + bannerImg + '" style="background-image: url(' + bannerImg + ')"></span></td>'
;
for (var i=0; i<statFieldsCount; i++) {
$tableRow += '<td class="stat">0</td>';
}
$tableRow += '' +
'</tr>';
$('tbody', $tableBanners).append($tableRow);
/*
if ($('tbody tr.total', $tableBanners).length > 0) {
$('tbody tr.total', $tableBanners).before($tableRow);
} else {
$('tbody', $tableBanners).append($tableRow);
}
*/
}
// Инфо сообщение внутри попапа:
function ShowPopupMessage(type, msg)
{
$popupMessage.text(msg);
$popupMessage.fadeIn(500);
}
})();
// Фокус на название и раскрытие блоков, установка времени старта при создании новой кампании:
if (isCreatePage) {
datepicker1.selectDate(new Date());
}
AddListenerChangeContriols();
// Форма создания-редактирование кампании Клик на "Сохранить":
$btnSubmitAction.on('click', function(e) {
if ($(this).attr('disabled') == 'disabled') return false;
isChanged = false;
e.stopPropagation();
var
action = $form.attr('action'),
method = $form.attr('method'),
data = {},
warningInfo = null;
// Основные данные для страниц создания и редактирования:
data['active'] = ($('input#campaign-active', $form).is(':checked')) ? 1 : 0;
data['date_begin'] = CheckNullValueInput($('input#campaign-date-begin', $form).val());
data['date_end'] = CheckNullValueInput($('input#campaign-date-end', $form).val());
data['price'] = CheckFloatValueInput($('input#campaign-price', $form).val());
var groupPrice = CheckFloatValueInput($('input#campaign-price', $form).attr('group-value'));
if ($checkTrackingAction.prop("checked")) {
data['tracking_action'] = 1;
data['order_sum'] = CheckFloatValueInput($('input#campaign-order-sum', $form).val());
} else {
data['order_sum'] = null;
data['tracking_action'] = 0;
}
// Основные данные для стр. создания:
if (isCreatePage) {
data['title'] = CheckNullValueInput($('input.campaign-title', $form).val());
if (data['date_end']) {
var
now = new Date(),
nowDate = new Date(now.getFullYear(), now.getMonth(), now.getDate()),
endDate = new Date(data['date_end']);
if (nowDate > endDate) {
warningInfo = 'Нельзя создать кампанию, которая полностью в прошлом';
}
}
data['url'] = CheckNullValueInput($('input#campaign-url', $form).val());
var
totalValue = CheckFloatValueInput($('input#campaign-money-limit-total', $form).val()),
dataMoneyLimit = {
total: totalValue,
day: 0,
week: 0,
month: 0,
};
data['money_limit'] = JSON.stringify(dataMoneyLimit);
if (!totalValue) {warningInfo = 'Введите бюджет кампании';}
}
// Расширенные данные для стр. редактирования:
if (!isCreatePage) {
data['title'] = CheckNullValueInput($('.panel-heading input.campaign-title').val());
data['url'] = CheckNullValueInput($('input#campaign-url', $form).attr('value'));
data['max_speed'] = $('input[name=max_speed]:checked', $form).val();
var
visitorLimit = {},
isVisitorLimitSet = false;
$('.form-group.campaign-visitor-limit__wrap .value-edit .campaign-visitor-limit').each(function(){
var
$this = $(this),
dataLimit = {};
$('input', $this).each(function(){
var $input = $(this);
if (parseInt($input.attr('value'))) {
isVisitorLimitSet = true;
dataLimit[$input.attr('name')] = parseInt($input.attr('value'));
} else {
dataLimit[$input.attr('name')] = 0;
}
});
visitorLimit[$this.data('name')] = dataLimit;
});
if (isVisitorLimitSet) {
data['visitor_limit'] = JSON.stringify(visitorLimit);
} else {
data['visitor_limit'] = null;
}
var
moneyLimit = {},
isMoneyLimitSet = false;
$('.form-group.campaign-money-limit .value-edit input').each(function(){
var $this = $(this);
if (parseFloat($this.attr('value'))) {
isMoneyLimitSet = true;
moneyLimit[$this.attr('name')] = CheckFloatValueInput($this.attr('value'));
} else {
moneyLimit[$this.attr('name')] = 0;
}
});
data['money_limit'] = JSON.stringify(moneyLimit);
if (isMoneyLimitSet) {
data['money_limit'] = JSON.stringify(moneyLimit);
} else {
data['money_limit'] = null;
}
data['targeting'] = $('.form-group.geo', $form).attr('data-value');
var trackingPixelsData = $('.form-group.tracking_pixels', $form).attr('data-value');
if (trackingPixelsData) {
data['tracking_pixels'] = $('.form-group.tracking_pixels', $form).attr('data-value');
}
var
$tableBanners = $('.form-group.banners table.campaign-banners'),
$bannersItems = $('tbody tr', $tableBanners);
if ($bannersItems.length>0) {
var dataBanners = {};
$bannersItems.each(function(){
var $this = $(this);
dataBanners[$this.data('id')] = $('td.check input', $this).is(':checked') ? 1 : 0;
});
data['banners'] = dataBanners;
}
}
// Обработка сообщений валидации:
if (!data['price'] && !groupPrice) {warningInfo = 'Введите стоимость кампании';}
if (!data['url'] || data['url'] == '') {warningInfo = 'Введите url кампании';}
if (!data['title'] || data['title'] == '') {warningInfo = 'Введите название кампании';}
if (warningInfo) {
alert(warningInfo);
return false;
}
//console.log('AAA ', data);
//return false;
$.ajax(action, {
type: method,
data: data,
success: function(data) {
if(data) {
if(data.result === true && data.redirect) {
document.location.href = data.redirect;
}
if(data.result === false && data.msg) {
$.showMessage('error', data.msg);
}
}
},
error: function(rew, status, err) {
console.log(status, err);
}
});
return false;
});
// Клик на "Отменить изменения"
$btnCancelAction.on('click', function(e) {
if ($(this).attr('disabled') == 'disabled') return false;
var isChangedCurrent = isChanged;
if (confirm((isCreatePage) ? 'Отменить создание кампании?' : 'Отменить изменения в кампании?')) {
isChanged = false;
if (isCreatePage) {
document.location.href = $('.group-title').attr('href');
} else {
location.reload();
}
} else {
isChanged = isChangedCurrent;
}
return false;
});
// Клик на "Отправить в архив"
$btnArchive.on('click', function(e) {
var
$this = $(this),
$campaignActiveCheck = $('input#campaign-active', $form),
data = {
'set_archive': 1,
'value': ($this.hasClass('send')) ? 1 : 0
};
$this.attr('disabled', true);
$.ajax($this.attr('href'), {
type: 'POST',
data: data,
success: function(data) {
$this.attr('disabled', false);
if (data.result) {
if (data.val) {
$.showMessage('info', data.msg);
$campaignActiveCheck.prop('checked', false);
$btnArchiveSend.addClass('hidden');
$btnArchiveRemove.removeClass('hidden');
} else {
$.showMessage('info', data.msg);
$campaignActiveCheck.prop('disabled', false);
$btnArchiveSend.removeClass('hidden');
$btnArchiveRemove.addClass('hidden');
}
}
},
error: function(rew, status, err) {
console.log(status, err);
$this.prop("disabled", false);
}
});
return false;
});
});
$(document).ready(function () {
"use strict";
/* Стр. кампании пользователя */
// Переключение данных вкладок для отображения
(function(){
// Переключение данных вкладок для отображения
var
$switchItems = $('.switch-item'),
$formGroups = $('.form-group-data'),
......@@ -21,6 +19,7 @@ $(document).ready(function () {
$this.addClass(classSelected);
location.replace("#" + type);
$formGroups.removeClass(classSelected);
$('.form-group-data[data-type="' + type + '"]').addClass(classSelected);
......@@ -34,74 +33,13 @@ $(document).ready(function () {
if(window.location.hash) {
currentType = $.trim(location.hash.replace('#', ''));
} else {
currentType = 'stat-common';
currentType = 'settings';
}
$('.switch-item[data-type="' + currentType + '"]').click();
})();
// Превьюшки:
(function(){
var
$popupBg = $('.l-popup'),
$popup = $('.b-popup__window.preview', $popupBg),
$popupClose = $('.button-close', $popup),
$popupInner = $('.b-popup-content', $popup),
$popupMessage = $('.b-popup-message', $popup),
$banners = $('.form-group.banners'),
$tableBanners = $('table.campaign-banners', $banners);
// Открываем попап:
$tableBanners.on('click', '.banner-preview', function(){
var
$this = $(this),
size = $.trim($('.banner-size', $this.parents('tr')).text()),
data = {
id: $this.parents('tr').data('id'),
size: size.split('x'),
img: $this.attr('src')
};
ShowPopup(data);
});
// Закрыввем попап по клику на Х:
$popupClose.on('click', function(){
ClosePopup();
});
// Закрыввем попап по клику извне:
$popup.on('click', function(event){
event.stopPropagation();
});
$popupBg.on('click', function(){
ClosePopup();
});
function ShowPopup(data)
{
var $content = $(document.createElement('div'));
$content.append('<h2>id: <b>'+ data.id +'</b> <span>('+ data.size[0] +'х'+ data.size[1] +')</span></h2>');
$content.append('<div class="banner-img"><img width="' + data.size[0] + '" height="' + data.size[1] + '" src="' + data.img + '" /></div>');
$popupInner.append($content)
$popupBg.addClass('open-popup');
$popup.show();
}
function ClosePopup()
{
$popupBg.removeClass('open-popup');
$popupMessage.hide();
$popup.hide();
$popupInner.empty();
}
})();
// Статистика по кампании:
// Статистики по кампании:
(function(){
var
......@@ -142,7 +80,20 @@ $(document).ready(function () {
selectDatePicker(fd, d, picker);
},
}).data('datepicker'),
myLocale = {
"decimal": ",",
"thousands": "\xa0",
"grouping": [3],
"currency": ["", " &#8372;"],
"dateTime": "%A, %e %B %Y г. %X",
"date": "%d.%m.%Y",
"time": "%H:%M:%S",
"periods": ["AM", "PM"],
"days": ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"],
"shortDays": ["вс", "пн", "вт", "ср", "чт", "пт", "сб"],
"months": ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"],
"shortMonths": ["янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"]
},
dataSitesStat,
$statSitesWrap = $('.form-group-data.stat-sites'),
$statSitesInfo = $('.sites-stats-info', $statRegionsWrap),
......@@ -215,24 +166,29 @@ $(document).ready(function () {
function valueFormatTable(value, currentActiveLine)
{
var
isCurrencyValue = currencyFields.indexOf(currentActiveLine) > -1,
format = d3.format(',.0f');
if (isCurrencyValue) format = d3.format(',.2f');
if (currentActiveLine == 'ctr') format = d3.format(',.2f');
if (currentActiveLine == 'cpm') format = d3.format(',.2f');
if (currentActiveLine == 'cpc') format = d3.format(',.2f');
if (isCurrencyValue) return format(value) + ' &#8372;';
if (currentActiveLine == 'ctr') return format(value) + ' %';
if (currentActiveLine == 'cpm') return format(value) + ' &#8372;';
if (currentActiveLine == 'cpc') return format(value) + ' &#8372;';
localeFormatter = d3.locale(myLocale),
format;
switch(currentActiveLine) {
case 'money':
case 'order_money':
case 'cpc':
case 'cpm':
format = localeFormatter.numberFormat("$,.2f");
break;
case 'ctr':
format = function(d) { return d3.format(',.2f')(d) + "%"; };
break;
default:
//format = d3.format(',.0f');
format = localeFormatter.numberFormat(",.0f");
break;
}
return format(value);
}
// Получение данных для отрисовки графика Stat при старте:
// Получение данных для общей статистики:
if ($('#campaign-stat').val() && $('#campaign-stat-total').val()) {
dataStat = JSON.parse($('#campaign-stat').val());
dataStatTotal = JSON.parse($('#campaign-stat-total').val());
......@@ -479,6 +435,7 @@ $(document).ready(function () {
if (!sortField) {
sortField = 'period';
isDesc = true;
$('thead th b.sort[id="period"]', $tableCommonStat).addClass('selected').addClass('desc');
}
//console.log('AAA sortField = ', sortField, ' isDesc = ', isDesc);
......@@ -526,16 +483,15 @@ $(document).ready(function () {
function renderSitesTable() {
var
dataTable = dataSitesStat,
dataTable = JSON.parse(JSON.stringify(dataSitesStat)),
dataTableForSort = [],
$selectedField = $('thead th b.selected', $tableSites),
$selectedField = $('thead th b.sort.selected', $tableSites),
$tableContent = $('<tbody>'),
$row,
sortField = false,
isDesc = true;
// Определение поля для сортировки строк в таблице:
/*
if ($selectedField.length > 0) {
sortField = $selectedField.attr('id');
isDesc = $selectedField.hasClass('desc');
......@@ -543,11 +499,8 @@ $(document).ready(function () {
if (!sortField) {
sortField = 'money';
isDesc = true;
$('thead th b.sort[id="money"]', $tableSites).addClass('selected').addClass('desc');
}
console.log('AAA sortField = ', sortField, ' isDesc = ', isDesc);
*/
sortField = 'money';
isDesc = true;
// Подготовка данных для сортировки:
prepareDataForSort(dataTable, dataTableForSort);
......@@ -560,14 +513,13 @@ $(document).ready(function () {
sortingDataByField(dataTableForSort[ind]['sub'], sortField, isDesc);
}
});
//console.log('AAA dataTableForSort = ', dataTableForSort);
// Отрисовка таблицы:
dataTableForSort.forEach(function(item){
$row = $('<tr class="cat" data-id="' + item['cat'] + '">');
if (item['sub']) {
$row.append($('<td>').html('<span class="group"><b class="closed">+</b><b class="open">&ndash;</b></span> ' + item['cat']));
$row.append($('<td>').html('<span class="group"><b class="closed">+</b><b class="open">&ndash;</b></span>' + item['cat']));
} else {
$row.append($('<td>').html(item['cat']));
}
......@@ -603,12 +555,25 @@ $(document).ready(function () {
function renderRegionsTable() {
var
dataTable = dataRegionsStat,
dataTable = JSON.parse(JSON.stringify(dataRegionsStat)),
dataTableForSort = [],
$selectedField = $('thead th b.sort.selected', $tableRegions),
$tableContent = $('<tbody>'),
$row,
sortField = 'money',
sortField = false,
isDesc = true;
// Определение поля для сортировки строк в таблице:
if ($selectedField.length > 0) {
sortField = $selectedField.attr('id');
isDesc = $selectedField.hasClass('desc');
}
if (!sortField) {
sortField = 'money';
isDesc = true;
$('thead th b.sort[id="money"]', $tableRegions).addClass('selected').addClass('desc');
}
// Подготовка данных для сортировки:
prepareDataForSort(dataTable, dataTableForSort);
......@@ -629,7 +594,7 @@ $(document).ready(function () {
$row = $('<tr class="cat" data-id="' + item['cat'] + '">');
if (item['sub']) {
$row.append($('<td>').html('<span class="group"><b class="closed">+</b><b class="open">&ndash;</b></span> ' + regionName));
$row.append($('<td>').html('<span class="group"><b class="closed">+</b><b class="open">&ndash;</b></span>' + regionName));
} else {
$row.append($('<td>').html(regionName));
}
......@@ -643,15 +608,15 @@ $(document).ready(function () {
item['sub'].forEach(function(itemSub){
var city = itemSub['cat'];
if (codeCities[city]) {
cityName = codeCities[city];
//if (codeCities[city]) {
cityName = (codeCities[city]) ? codeCities[city] : city;
$row = $('<tr class="subcat" data-parent="' + item['cat'] + '">');
$row.append($('<td class="subcat-title">').html(cityName));
activeLinesId.forEach(function(line){
$row.append($('<td class="stat '+ line +'">').html(valueFormatTable(itemSub[line], line)));
});
$row.appendTo($tableContent);
}
//}
});
}
......@@ -688,7 +653,7 @@ $(document).ready(function () {
EnableLoadingState($groupWrap, true);
$.ajax({
url: $('#campaign-create-form').attr('action'),
url: $('.switch-data').attr('action'),
method: 'POST',
data: dataRequest,
success: function(res) {
......@@ -785,8 +750,34 @@ $(document).ready(function () {
renderCommonChart();
});
// Сортировка по колонкам внутри таблицы:
$('.table.sortable').on('click', 'thead th .sort', function(){
var
$this = $(this),
$table = $this.parents('.table.sortable');
$('thead th .sort', $table).removeClass('selected');
$this.addClass('selected');
$this.toggleClass('desc');
switch($table.data('type')) {
case 'common-stat':
renderCommonTable();
break;
case 'sites-stat':
renderSitesTable();
break;
case 'regions-stat':
renderRegionsTable();
break;
}
});
})();
// Свернуть-развернуть дочерние ячейки в таблице:
$('table.table-striped').on('click', 'span.group', function(e) {
$('table.table-by-cats').on('click', 'span.group', function(e) {
var
$this = $(this),
......@@ -808,6 +799,5 @@ $(document).ready(function () {
});
})();
});
$(document).ready(function () {
"use strict";
/* Стр. создания-редактирования группы кампаний */
var
$contentWrap = $('.b-content__work.inner'),
isCreatePage = $('.group-id').data('id') == 0,
$form = $('#group-create-form', $contentWrap),
$userNewBlock = $('span.user-new', $form),
isChanged = false,
popupIsOpen = false,
changeContriolsListenerIsActive = false,
$checkTrackingAction = $('#group-tracking-action'),
$btnSubmitAction = $('.btn.submit-action', $form),
$btnCancelAction = $('.btn.cancel-action', $form);
// Покидание страницы:
window.onbeforeunload = function(e) {
if (isChanged || popupIsOpen) {
return "Данные не сохранены. Закрыть страницу без сохранения?";
}
};
function CheckNullValueInput(value) {
return ($.trim(value) != '') ? $.trim(value) : null;
}
function CheckFloatValueInput(value) {
value = value.replace(',', '.');
return (isNaN(parseFloat(value))) ? null : parseFloat(value);
}
function CheckBuyType() {
var
buyTypeValue = $('input[name=buy_type]:checked', $form).val(),
targetActionValue = $('input[name=target_action]:checked', $form).val(),
$targetActionLoad = $('input#campaign-view-load', $form),
$targetActionLoadLabel = $('label[for="campaign-view-load"]', $form);
if (buyTypeValue == 'auction') {
$targetActionLoad.prop('disabled', true);
$targetActionLoadLabel.addClass('disabled');
} else {
$targetActionLoad.prop('disabled', false);
$targetActionLoadLabel.removeClass('disabled');
}
if (buyTypeValue == 'auction' && targetActionValue == 'load') {
$('input#campaign-view-view', $form).prop('checked', true);
}
}
function CheckTargetAction() {
var
targetActionValue = $('input[name=target_action]:checked', $form).val(),
$priceTitleMark = $('.price-title-mark', $form),
titleValue;
switch(targetActionValue) {
case 'load':
titleValue = '1000 показов';
break;
case 'view':
titleValue = '1000 реальных показов';
break;
case 'click':
titleValue = 'клик';
break;
}
$priceTitleMark.text(titleValue);
}
function CheckTrackingAction($check) {
var
$content = $('.tracking-action_content'),
isChecked = $check.prop("checked");
if (isChecked) {
$content.show();
} else {
$content.hide();
}
}
function dataChanged($target)
{
if (changeContriolsListenerIsActive) {
isChanged = true;
$btnCancelAction.attr('disabled',false);
$btnSubmitAction.attr('disabled',false);
var
$formGroup = $target.parents('.form-group').eq(0),
$label = $('label.title-field', $formGroup);
$label.addClass('changed');
// Название в header-панели
if ($formGroup.hasClass('title')) {
$target.siblings('.value-show').addClass('changed');
}
}
}
function AddListenerChangeContriols()
{
changeContriolsListenerIsActive = true;
// Действие по какому-либо контролу:
$form.on('change', 'input, select', function(){
dataChanged($(this));
});
$form.on('keyup', 'input', function(){
dataChanged($(this));
});
$('.panel-heading input.group-title').on('change', function(){
dataChanged($(this));
});
}
// Клик на редактируемый элемент (название группы):
$contentWrap.on('click', '.edited', function(){
var
$field = $(this),
fieldName = $field.data('field'),
$input = $('input.'+fieldName, $field.parent()),
oldVal = $input.val(),
oldText = $field.html();
$field.hide();
$input.off('blur').off('keyup').show().focus();
$input.on('keyup', function(e) {
if (e.keyCode == 13) {
$input.blur();
}
if (e.keyCode == 27) {
$input.off('blur');
$input.val(oldVal);
$field.html(oldText);
$input.hide();
$field.show();
}
});
$input.on('blur', function() {
var
textInput = $input.val(),
textField = textInput;
$input.hide();
$field.html(textField);
if (textInput != oldVal) {
$field.addClass('was-edited');
//MarkOfferAsEdited();
}
$field.show();
});
});
// Переключение типа кампании:
$('input[name=buy_type]', $form).on('change', function(){
CheckBuyType();
});
CheckBuyType();
// Переключение целевого действия:
$('input[name=target_action]', $form).on('change', function(){
CheckTargetAction();
});
CheckTargetAction();
// Клик на галочку Трекинг действий:
$checkTrackingAction.on('change', function(e) {
CheckTrackingAction($(this));
});
CheckTrackingAction($checkTrackingAction);
// Переключение смены пользователя:
$('select#group-user-id', $form).on('change', function(){
if ($(this).val() == 'new') {
$userNewBlock.show();
} else {
$userNewBlock.hide();
}
});
// Редактирование элементов формы:
(function(){
var
$popupBg = $('.l-popup'),
$popupEdit = $('.b-popup__window.edit', $popupBg),
$popupInner = $('.b-popup-inner', $popupEdit),
$popupClose = $('.button-close', $popupEdit),
$popupTitle = $('.b-popup-content h1', $popupEdit),
$saveBtn = $('.btn.save-edit', $popupEdit),
$cancelBtn = $('.btn.cancel-edit', $popupEdit);
// Склонение числительных
function declOfNum(number, titles) {
var cases = [2, 0, 1, 1, 1, 2];
return titles[ (number%100 > 4 && number %100 < 20) ? 2 : cases[Math.min(number%10, 5)] ];
}
function ChangeEditValue($formGroup) {
var
type = $formGroup.data('type'),
$valueShow = $('.value-show', $formGroup),
$valueEdit = $('.value-edit', $formGroup),
content = '';
if (type == 'title') {
content = $('input', $valueEdit).val();
}
if (type == 'url') {
content = $('input', $valueEdit).val();
}
if (type == 'visitor-limit') {
$('.campaign-visitor-limit input', $valueEdit).each(function(){
var
$this = $(this),
itemVal = parseInt($this.val());
if (itemVal) {
var titles = ($this.parent().hasClass('view')) ? ['показ', 'показа', 'показов'] : ['клик', 'клика', 'кликов'];
content += '<span><b>' + itemVal + '</b> <i>' + declOfNum(itemVal, titles) + '</i> ' + $this.data('desc') + '</span><br />';
}
});
}
if (type == 'money-limit') {
$('input', $valueEdit).each(function(){
var
$this = $(this),
itemVal = CheckFloatValueInput($this.val());
if (itemVal) {
var titles = 'грн.';
content += '<span><b>' + itemVal + '</b> ' + titles + ' ' + $this.data('desc') + '</span><br />';
}
});
}
if (type == 'geo') {
var
countryVal = $('.geo_country select option:selected', $valueEdit).text(),
regionItems = [],
cityItems = [],
regionVal = '',
cityVal = '';
if ($('.geo_country select', $valueEdit).val() == 'UA' && $('.geo_country .b-exclude input').is(':checked')) {
countryVal += ' (исключить неподконтрольные территории)';
}
content += '<span>Страна: <b>' + countryVal + '</b></span><br />';
$('.geo_region .filters-values ul li input', $valueEdit).each(function(){
regionItems.push($(this).data('text').replace(' область', ''));
});
if (regionItems.length > 0) {
regionVal += ($('.geo_region .b-exclude input', $valueEdit).is(':checked')) ? '<i>кроме:</i> ' : '<i>только:</i> ';
regionVal += '<b>' + regionItems.join(', ') + '</b>';
content += '<span>Области ' + regionVal + '</span><br />';
}
$('.geo_city .filters-values ul li input', $valueEdit).each(function(){
cityItems.push($(this).data('text'));
});
if (cityItems.length > 0) {
cityVal += ($('.geo_city .b-exclude input', $valueEdit).is(':checked')) ? '<i>кроме:</i> ' : '<i>только:</i> ';
cityVal += '<b>' + cityItems.join(', ') + '</b>';
content += '<span>Города ' + cityVal + '</span><br />';
}
var
geoData = {},
countryValue,
countryExclude,
regionValues = [],
regionExclude,
cityValues = [],
cityExclude,
isGeoSet;
// country
countryValue = $('select#targeting_geo_country', $formGroup).val();
countryExclude = ($('input#country-exclude', $formGroup).is(':checked')) ? true : false;
geoData['country'] = {
values: [countryValue],
exclude: false
};
// special
if (countryValue == 'UA' && countryExclude) {
geoData['special'] = {
values: ["ATO", "Crimea"],
exclude: true
}
}
// region
$('.geo_region .filters-values ul li', $formGroup).each(function(){
regionValues.push(parseInt($('input', $(this)).data('id')));
});
regionExclude = ($('input#region-exclude', $formGroup).is(':checked')) ? true : false;
geoData['region'] = {
values: regionValues,
exclude: regionExclude
};
// city
$('.geo_city .filters-values ul li', $formGroup).each(function(){
cityValues.push(parseInt($('input', $(this)).data('id')));
});
cityExclude = ($('input#city-exclude', $formGroup).is(':checked')) ? true : false;
geoData['city'] = {
values: cityValues,
exclude: cityExclude
};
if ((countryValue == 'UA' && countryExclude) && regionValues.length == 0 && regionValues.length == 0) {
isGeoSet = false;
} else {
isGeoSet = true;
}
if (isGeoSet) {
$formGroup.attr('data-value', JSON.stringify({geo: geoData}))
} else {
$formGroup.attr('data-value', null)
}
}
if (type == 'tracking-pixels') {
var
dataTrackingPixels = {},
isTrackingPixelsSet = false;
$('.tracking_pixels_item', $formGroup).each(function(){
var
$this = $(this),
name = $this.data('name'),
dataValues = [],
noItems = true,
inputValue;
$('.tracking_pixels_urls input', $this).each(function(){
var $input = $(this);
if ($input.val()) {
isTrackingPixelsSet = true;
if (noItems) {
content += '<div>' + $('label', $this).text() + '</div>';
noItems = false;
}
inputValue = $.trim($input.val());
content += '<div class="url">' + inputValue + '</div>';
dataValues.push(inputValue);
}
});
dataTrackingPixels[name] = dataValues;
});
if (isTrackingPixelsSet) {
$formGroup.attr('data-value', JSON.stringify(dataTrackingPixels))
} else {
$formGroup.attr('data-value', null)
}
}
$valueShow.empty();
$valueShow.append(content);
}
function AddEditPopupEventsListener() {
// Закрыввем попап по клику на Х:
$popupClose.on('click', function(){
ClosePopupEdit();
});
// Закрыввем попап по клику извне:
/*
$popupEdit.on('click', function(event){
event.stopPropagation();
});
$popupBg.on('click', function(){
ClosePopupEdit();
});
*/
AddControlsEventsListener();
}
function RemoveEditPopupEventsListener() {
$popupClose.off('click');
$popupEdit.off('click');
$popupBg.off('click');
}
function ShowPopupEdit(type, title, data)
{
popupIsOpen = true;
$saveBtn.attr('disabled', true);
InsertPopupEdit(title, data);
$popupBg.addClass('open-popup');
$popupEdit.show();
$popupEdit.attr('data-type', type);
AddEditPopupEventsListener();
}
function ClosePopupEdit()
{
popupIsOpen = false;
$popupBg.removeClass('open-popup');
$popupEdit.hide();
$popupInner.empty();
RemoveEditPopupEventsListener();
}
function InsertPopupEdit(title, data)
{
$popupTitle.text(title);
$popupInner.append(data);
}
function AddControlsEventsListener()
{
// Действие по какому-либо контролу внутри попапа:
$('input, select', $popupInner).on('change', function(){
$saveBtn.attr('disabled', false);
});
$('input', $popupInner).on('keyup', function(){
$saveBtn.attr('disabled', false);
});
// Добавление/удаление tracking_pixels urls
(function(){
$popupEdit.on('click', '.tracking_pixels_item .add-row', function(){
var
$this = $(this),
$trackingItem = $this.parents('.tracking_pixels_item'),
$urlsWrap = $('.tracking_pixels_urls', $trackingItem);
$urlsWrap.append('<div class="url-item"><input type="text" class="form-control" value="" placeholder="url"><div class="delete-item">×</div></div>');
});
$popupEdit.on('click', '.tracking_pixels_urls .delete-item', function(){
$(this).parent().remove();
});
})();
// Гео
(function(){
var
$geoCountrySelect = $('.form-control#targeting_geo_country', $popupEdit),
$geoWrap = $('.targeting_geo', $popupEdit);
// Изменение значения страны
$geoCountrySelect.on('change', function(){
var $geoCountryExclude = $('.geo_country .b-exclude', $popupEdit);
if ($(this).val() == 'UA') {
$geoCountryExclude.show();
} else {
$geoCountryExclude.hide();
}
});
// Изменение списка фильтров чекбоксом:
$geoWrap.on('change', '.geo_region-city .list-filter input',function(){
var
$this = $(this),
$listItems = $('li', $this.parents('ul')),
$listString = $('.values-string-list', $this.parents('.form-group')[0]),
values = [],
tplId = ($this.parents('.geo_region').length) ? 'l-region-id-' : 'l-city-id-';
$this.attr('checked', $this.is(':checked'));
$listItems.each(function(){
var
$this = $(this),
$checkbox = $('input', $this);
if ($checkbox.is(':checked')) {
values.push([$checkbox.data('id'), $checkbox.data('text')]);
}
});
// Редактируем список выбранных фильтров справа:
$listString.empty();
if (values.length > 0) {
values.forEach(function(valuesItem) {
$listString.append('<li><input type="checkbox" checked id="' + tplId + valuesItem[0] + '" data-id="' + valuesItem[0] + '" data-text="' + valuesItem[1] + '"> <label for="' + tplId + valuesItem[0] + '">' + valuesItem[1] + '</label></li>');
});
}
//$listString.trigger('change-list');
});
// Удаление из списка фильтров снятием галочки:
$geoWrap.on('change', '.geo_region-city .values-string-list input',function(){
var
itemId = $(this).data('id'),
$listFilterItem = $('.list-filter input[data-id="' + itemId + '"]', $(this).parents('.form-group'));
$listFilterItem.attr('checked', false);
$listFilterItem.change();
});
// Изменение фильтрации внутри фильтра:
$geoWrap.on('keyup', '.geo_region-city input.filter',function(){
var
$this = $(this),
val = $this.val().toLowerCase(),
$listItems = $('li', $this.parents('.filters-select'));
// Фильтрация списка значений:
$listItems.each(function(){
var
$item = $(this),
itemTitle = $('input', $item).data('text').toLowerCase(),
filteredByVal = itemTitle.indexOf(val) == 0;
$item.hide().removeClass('filtered');
if (filteredByVal) {
$item.show().addClass('filtered');
}
});
});
})();
}
// Клик на "Правка" для блока
$('.form-group').on('click', '.edit-item', function(){
var
$this = $(this),
$formGroup = $this.parents('.form-group').eq(0),
typeGroup = $formGroup.data('type'),
$valueEdit = $('.value-edit', $formGroup),
titleGroup = $('label.title-field', $this.parent()).text();
$formGroup.attr('data-tempstate', $valueEdit.html());
ShowPopupEdit(typeGroup, titleGroup, $valueEdit.html());
return false;
});
// Клик на "Сохранить" значение блока
$saveBtn.on('click', function(){
var
type = $popupEdit.attr('data-type'),
$formGroup = $('.form-group[data-type="' + type + '"]'),
$valueEdit = $('.value-edit', $formGroup);
$formGroup.attr('data-tempstate', null);
$('input', $popupEdit).each(function(){
var $this = $(this);
$this.attr("value", $.trim($this.val()));
});
$valueEdit.html($popupInner.html());
ChangeEditValue($formGroup);
ClosePopupEdit();
dataChanged($valueEdit);
return false;
});
// Клик на "Отменить" редактирование блока
$cancelBtn.on('click', function(){
var
type = $popupEdit.attr('data-type'),
$formGroup = $('.form-group[data-type="' + type + '"]'),
$valueEdit = $('.value-edit', $formGroup);
$valueEdit.html($formGroup.attr('data-tempstate'));
$formGroup.attr('data-tempstate', null);
ClosePopupEdit();
return false;
});
// Устанавливаем стартовые значения блоков формы
$('.form-group[data-type]').each(function(){
ChangeEditValue($(this));
});
})();
// Фокус на название и раскрытие блоков при создании новой группы кампаний:
if (isCreatePage) {
$('.form-control.group-title.create').focus();
$btnCancelAction.attr('disabled', false);
}
AddListenerChangeContriols();
// Клик на галочку "Активности камапнии" на стр. списка кампаний:
$('.table.campaigns').on('change', 'input.is-active', function(e) {
var
$this = $(this),
campaignId = $this.data('id'),
$campaignTr = $this.parents('tr'),
isActive = $this.prop("checked"),
action = $this.parents('table').data('action').replace('id',campaignId),
method = 'POST',
data = {
'toggle_active': 1,
'is_active': isActive ? 1 : 0,
};
$this.prop("disabled", true);
$.ajax(action, {
type: method,
data: data,
success: function(data) {
$this.prop("disabled", false);
if (data.result) {
if (isActive) {
$campaignTr.removeClass('disabled');
} else {
$campaignTr.addClass('disabled');
}
}
},
error: function(rew, status, err) {
console.log(status, err);
$this.prop("disabled", false);
}
});
});
// Форма создания-редактирования группы Клик на "Сохранить":
$btnSubmitAction.on('click', function(e) {
if ($(this).attr('disabled') == 'disabled') return false;
isChanged = false;
e.stopPropagation();
var
action = $form.attr('action'),
method = $form.attr('method'),
data = {},
warningInfo = null;
// Основные данные для страниц создания и редактирования:
data['active'] = ($('input#group-active', $form).is(':checked')) ? 1 : 0;
data['buy_type'] = $('input[name=buy_type]:checked', $form).val();
data['target_action'] = $('input[name=target_action]:checked', $form).val();
data['price'] = CheckFloatValueInput($('input#campaign-price', $form).val());
data['max_speed'] = $('input[name=max_speed]:checked', $form).val();
data['targeting'] = $('.form-group.geo', $form).attr('data-value');
if ($checkTrackingAction.prop("checked")) {
data['tracking_action'] = 1;
data['order_sum'] = CheckFloatValueInput($('input#campaign-order-sum', $form).val());
} else {
data['tracking_action'] = 0;
data['order_sum'] = null;
}
data['user_id'] = $('select#group-user-id', $form).val();
if (data['user_id'] == 'new') {
data['user_name'] = CheckNullValueInput($('input#user-name', $form).val());
data['user_email'] = CheckNullValueInput($('input#user-email', $form).val());
// Проверка email пользователя на уже имеющегося в системе:
if (data['user_email']) {
$('select#group-user-id option', $form).each(function(){
var $this = $(this);
if (data['user_email'] == $this.data('email')) {
warningInfo = 'Пользователь с введенным email уже в системе присутствует';
}
});
}
}
var
visitorLimit = {},
isVisitorLimitSet = false;
$('.form-group.campaign-visitor-limit__wrap .value-edit .campaign-visitor-limit').each(function(){
var
$this = $(this),
dataLimit = {};
$('input', $this).each(function(){
var $input = $(this);
if (parseInt($input.attr('value'))) {
isVisitorLimitSet = true;
dataLimit[$input.attr('name')] = parseInt($input.attr('value'));
} else {
dataLimit[$input.attr('name')] = 0;
}
});
visitorLimit[$this.data('name')] = dataLimit;
});
if (isVisitorLimitSet) {
data['visitor_limit'] = JSON.stringify(visitorLimit);
} else {
data['visitor_limit'] = null;
}
// Данные для стр. создания:
if (isCreatePage) {
data['title'] = CheckNullValueInput($('input.group-title', $form).val());
var
totalValue = CheckFloatValueInput($('input#campaign-money-limit-total', $form).val()),
dataMoneyLimit = {
total: totalValue,
day: 0,
week: 0,
month: 0,
};
if (totalValue) {
data['money_limit'] = JSON.stringify(dataMoneyLimit);
} else {
data['money_limit'] = null;
}
}
// Данные для стр. редактирования:
if (!isCreatePage) {
data['title'] = CheckNullValueInput($('.panel-heading input.group-title').val());
var
moneyLimit = {},
isMoneyLimitSet = false;
$('.form-group.campaign-money-limit .value-edit input').each(function(){
var $this = $(this);
if (parseFloat($this.attr('value'))) {
isMoneyLimitSet = true;
moneyLimit[$this.attr('name')] = CheckFloatValueInput($this.attr('value'));
} else {
moneyLimit[$this.attr('name')] = 0;
}
});
if (isMoneyLimitSet) {
data['money_limit'] = JSON.stringify(moneyLimit);
} else {
data['money_limit'] = null;
}
}
// Обработка сообщений валидации:
if ((data['user_id'] == 'new') && !data['user_name']) {warningInfo = 'Введите имя пользователя';}
if ((data['user_id'] == 'new') && !data['user_email']) {warningInfo = 'Введите email пользователя';}
if (data['user_id'] == 0) {warningInfo = 'Укажите пользователя';}
if (!data['title'] || data['title'] == '') {warningInfo = 'Введите название группы кампаний';}
if (warningInfo) {
alert(warningInfo);
return false;
}
//console.log('AAA ', data);
//return false;
$.ajax(action, {
type: method,
data: data,
success: function(data) {
if(data) {
if(data.result === true && data.redirect) {
document.location.href = data.redirect;
}
if(data.result === false && data.msg) {
$.showMessage('error', data.msg);
}
}
},
error: function(rew, status, err) {
console.log(status, err);
}
});
return false;
});
// Клик на "Отменить изменения"
$btnCancelAction.on('click', function(e) {
if ($(this).attr('disabled') == 'disabled') return false;
var isChangedCurrent = isChanged;
if (confirm((isCreatePage) ? 'Отменить создание группы кампаний?' : 'Отменить изменения в группе кампаний?')) {
isChanged = false;
if (isCreatePage) {
document.location.href = $('.group-id').attr('href');
} else {
location.reload();
}
} else {
isChanged = isChangedCurrent;
}
return false;
});
// Фильтрация в таблице:
$('.panel-body').filterAmsystemTable({
table: '.table.campaigns',
selectStatus: '.form-control.campaign-status',
currentFilterDefault: 'not-archive'
});
// Сортировка в таблице кампаний:
if (!isCreatePage) {
$('.table.campaigns').sortAmsystemTable();
}
});
;(function($){
var jqPluginName = 'filterAmsystemTable';
var filterPlugin = function(element, options) {
var self = this;
var config = $.extend(true, {}, $.fn[jqPluginName].defaults, options);
config.context = element;
config.$table = $(config.table, config.context);
config.$selectStatus = $(config.selectStatus, config.context);
config.currentFilter = ($.cookie(config.cookieName)) ? $.cookie(config.cookieName) : config.currentFilterDefault;
// Форматирование значений для таблицы
this.valueFormatTable = function(value, currentActiveLine)
{
var
localeFormatter = d3.locale(config.myLocale),
format;
switch(currentActiveLine) {
case 'money':
case 'order_money':
case 'cpc':
case 'cpm':
format = localeFormatter.numberFormat("$,.2f");
break;
case 'ctr':
format = function(d) { return d3.format(',.2f')(d) + "%"; };
break;
default:
format = localeFormatter.numberFormat(",.0f");
break;
}
return format(value);
}
this.setTableFilter = function(val) {
config.$selectStatus.val(val);
config.filters.forEach(function(item) {
config.$table.removeClass(item);
})
config.$table.addClass(val);
$.cookie(config.cookieName, val, { expires : 365 });
}
this.setTotalValue = function(val) {
var $totalTr = $('tr.total', config.$table);
if ($totalTr.length > 0) {
var
totalValue = [],
totalValueCat,
views, money, clicks;
config.sumCats.forEach(function(cat){
totalValueCat = 0;
$('tbody tr.banner-item', config.$table).each(function(){
var $this = $(this);
if (val == 'all' || $this.hasClass(val)) {
totalValueCat+= parseFloat($('td.'+ cat, $this).data('value'));
}
});
totalValue[cat] = totalValueCat;
});
views = totalValue['views'];
money = totalValue['money'];
clicks = totalValue['clicks'];
totalValue['ctr'] = (views != 0) ? ((clicks/views)*100).toFixed(2) : 0;
totalValue['cpm'] = (views != 0) ? ((money/views)*1000).toFixed(3) : 0;
totalValue['cpc'] = (clicks != 0) ? (money/clicks).toFixed(2) : 0;
config.cats.forEach(function(cat){
$('tr.total td.' + cat, config.$table).html(self.valueFormatTable(totalValue[cat], cat));
});
}
}
this.InitData = function() {
this.setTableFilter(config.currentFilter);
this.setTotalValue(config.currentFilter);
}
// Устанавливаем по-умолчанию фильтр для таблицы:
this.InitData();
config.$selectStatus.on('change', function(){
self.setTableFilter($(this).val());
self.setTotalValue($(this).val());
});
config.context.data(jqPluginName, this);
}
$.fn[jqPluginName] = function(options) {
return this.each(function() {
var _this = $(this);
if (!_this.data(jqPluginName))
{
new filterPlugin(_this, options);
}
});
}
$.fn[jqPluginName].defaults = {
context: null,
table: null,
$table: null,
selectStatus: null,
$selectStatus: null,
filters: ['all', 'active', 'not-active', 'archive', 'not-archive'],
cookieName: 'table_filter_status',
cats: ['views', 'clicks', 'ctr', 'cpm', 'cpc', 'money', 'order_cnt', 'order_money'],
sumCats: ['views', 'clicks', 'money', 'order_cnt', 'order_money'],
currentFilterDefault: 'all',
myLocale: {
"decimal": ",",
"thousands": "\xa0",
"grouping": [3],
"currency": ["", " &#8372;"],
"dateTime": "%A, %e %B %Y г. %X",
"date": "%d.%m.%Y",
"time": "%H:%M:%S",
"periods": ["AM", "PM"],
"days": ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"],
"shortDays": ["вс", "пн", "вт", "ср", "чт", "пт", "сб"],
"months": ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"],
"shortMonths": ["янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"]
}
}
})(jQuery);
;(function($){
var jqPluginName = 'sortAmsystemTable';
var sortPlugin = function(element, options) {
var self = this;
var config = $.extend(true, {}, $.fn[jqPluginName].defaults, options);
config.context = element;
config.$columnItems = $(config.columnItems, config.context);
config.isParentStructure = $('tr[data-parent]', config.context).length>0;
this.addDataItems = function() {
config.dataItems = [];
config.$itemsRows = $(config.itemsRows, config.context);
var $itemRow;
config.$itemsRows.each(function(i, e){
$itemRow = $(e);
var itemData = {
tr: $itemRow, // строка в таблице
};
config.$columnItems.each(function(){
var
sortName = $.trim($(this).data('sort')),
sortValue = $('td[data-cat="' + sortName + '"]', $itemRow).data('value');
itemData[sortName] = sortValue;
});
config.dataItems.push(itemData);
});
}
this.filterItems = function(field) {
config.$columnItems.filter('[data-sort="' + field + '"]').click();
}
// Клик по названию колонки для сортировки:
config.$columnItems.click(function() {
// Сортировка в таблице
var
$columnItem = $(this),
sortField = $columnItem.data('sort'),
sortAsc = $columnItem.attr('data-sortasc');
config.$columnItems.removeClass('selected');
$columnItem.attr('data-sortasc', -sortAsc);
$columnItem.removeClass('asc').removeClass('desc').addClass('selected').addClass((-sortAsc > 0) ? 'asc' : 'desc');
config.dataItems.sort(function(a, b) {
if (sortAsc < 0) {
return (a[sortField] > b[sortField]) ? 1 : -1;
} else {
return (a[sortField] < b[sortField]) ? 1 : -1;
}
});
// Доп. сортровка данных для родительских структуры внутри таблицы:
if (config.isParentStructure) {
var dataItemsTemp = [],id;
config.dataItems.forEach(function(item, i){
if (item.tr.hasClass('group-item')) {
dataItemsTemp.push(item);
id = item.tr.data('id');
config.dataItems.forEach(function(item, i){
if (item.tr.data('parent') == id) {
dataItemsTemp.push(item);
}
});
}
});
config.dataItems = dataItemsTemp;
}
// Переписываем таблицу:
var
$table = $(config.context),
$tableBody = $('tbody', $table),
$tableContent = $('<tbody>');
for (var i = 0; i < config.dataItems.length; i++) {
(config.dataItems[i].tr).appendTo($tableContent);
}
$tableBody.html('').append($tableContent.children());
});
self.InitData = function() {
this.addDataItems();
}
this.addDataItems();
this.filterItems(config.defaultSortField);
config.context.data(jqPluginName, this);
}
$.fn[jqPluginName] = function(options) {
return this.each(function() {
var _this = $(this);
if (!_this.data(jqPluginName))
{
new sortPlugin(_this, options);
}
});
}
$.fn[jqPluginName].defaults = {
context: null,
dataItems: [],
itemsRows: 'tbody tr',
$itemsRows: null,
columnItems: '.sort[data-sort]',
$columnItems: null,
fieldsInt: ['id', 'views', 'clicks', 'orders', 'reach', 'order_cnt'],
fieldsFloat: ['cl', 'money', 'ctr', 'cpc', 'cpm', 'order_money'],
isParentStructure: false,
defaultSortField: 'views'
}
})(jQuery);
......@@ -2,7 +2,7 @@ $(document).ready(function () {
"use strict";
// Свернуть-развернуть дочерние ячейки в таблице:
$('.table.campaigns').on('click', 'span.group', function(e) {
$('.table.groups').on('click', 'span.group', function(e) {
var
$this = $(this),
......@@ -12,6 +12,7 @@ $(document).ready(function () {
isOpen,
$subcats = $('tr.campaign-item[data-parent="'+ id + '"]', $tableBody);
$this.toggleClass('open');
isOpen = $this.hasClass('open');
......@@ -24,32 +25,17 @@ $(document).ready(function () {
});
// Разворачиваем списки групп кампаний при старте:
$('.table.campaigns span.group').click();
// Фильтрация для таблицы:
var
$table = $('.table.campaigns'),
$selectStatus = $('.form-control.campaign-status'),
filters = ['all', 'active', 'not-active', 'archive', 'not-archive'],
cookieName = 'table_filter_status',
currentFilter = ($.cookie(cookieName)) ? $.cookie(cookieName) : 'not-archive';
function setTableFilter(val)
{
$selectStatus.val(val);
filters.forEach(function(item) {
$table.removeClass(item);
})
$table.addClass(val);
$.cookie(cookieName, val, { expires : 365 });
}
$('.table.groups span.group').click();
$selectStatus.on('change', function(){
setTableFilter($(this).val());
// Фильтрация в таблице:
$('.users-groups').filterAmsystemTable({
table: '.table.groups',
selectStatus: '.form-control.campaign-status',
currentFilterDefault: 'not-archive'
});
// Устанавливаем по-умолчанию фильтр для таблицы:
setTableFilter(currentFilter);
// Сортировка в таблице групп-кампаний:
$('.users-groups .table.groups').sortAmsystemTable();
});
......@@ -41,8 +41,12 @@ use Zend\Hydrator\DelegatingHydrator;
*/
class CabinetAmSystem extends Common
{
const ACTION_LIST = 'list';
const ACTION_ITEM = 'item';
const ACTION_GROUPS_LIST = 'groups';
const ACTION_GROUPS_ITEM = 'groups_item';
const ACTION_CAMPAIGNS_ITEM = 'campaigns_item';
const ACTION_GROUPS_STAT = 'groups_stat';
const ACTION_CAMPAIGNS_STAT = 'campaigns_stat';
const CAMPAIGN_STAT_CATS = [
'views' => ['title' => 'Показы', 'color' => '#2CA02C'],
......@@ -71,8 +75,11 @@ class CabinetAmSystem extends Common
try {
switch ($request->getAttribute('action')) {
case self::ACTION_ITEM:
$response = $this->getStatData($request);
case self::ACTION_GROUPS_STAT:
$response = $this->getGroupsStatData($request);
break;
case self::ACTION_CAMPAIGNS_STAT:
$response = $this->getCampaignsStatData($request);
break;
default:
}
......@@ -86,7 +93,7 @@ class CabinetAmSystem extends Common
return $response;
}
elseif($request->getAttribute('action') == self::ACTION_LIST)
elseif($request->getAttribute('action') == self::ACTION_GROUPS_LIST)
{
try {
......@@ -106,6 +113,7 @@ class CabinetAmSystem extends Common
/** @var \App\Model\Statistics $stats */
$stats = $this->container->get(\App\Model\Statistics::class);
$groups_stat = [];
$campaigns_stat = [];
$groups_campaigns = [];
......@@ -113,16 +121,21 @@ class CabinetAmSystem extends Common
$campaigns = $campaignsModel->findAll(['group_id' => $group['id']])->toArray();
$groups_campaigns[$group['id']] = $campaigns;
$group_id = $group['id'];
$groups_stat[$group_id] = $stats->getCampaignsStat('group', [$group_id], $group['target_action'], null, false);
foreach ($campaigns as $campaign_item) {
$campaign_id = $campaign_item['id'];
$campaigns_stat[$campaign_id] = $stats->getCampaignsStat([$campaign_id], $campaign_item['target_action'], null, false);
$campaigns_stat[$campaign_id] = $stats->getCampaignsStat('campaign', [$campaign_id], $campaign_item['target_action'], null, false);
}
}
$data['groups'] = $groups;
$data['campaigns'] = $campaigns;
$data['groups_campaigns'] = $groups_campaigns;
$data['stats'] = $campaigns_stat;
$data['groups_stat'] = $groups_stat;
$data['campaigns_stat'] = $campaigns_stat;
$data['stat_cats'] = self::CAMPAIGN_STAT_CATS;
} else {
$data['error'] = _t('Отсутствуют доступные кампании');
......@@ -138,9 +151,147 @@ class CabinetAmSystem extends Common
'layoutInfo' => $request->getAttribute('layoutInfo'),
]);
return new HtmlResponse($this->template->render('app::user/campaigns_list', $data));
return new HtmlResponse($this->template->render('app::user/amsystem/groups_list', $data));
}
elseif($request->getAttribute('action') == self::ACTION_ITEM)
elseif($request->getAttribute('action') == self::ACTION_GROUPS_ITEM)
{
$group_id = $request->getAttribute('id');
/** @var UserService $auth */
$auth = $this->container->get(UserService::class);
$userId = $auth->getIdentity()->getId();
/** @var \App\Model\AmSystem\Groups $groupsModel */
$groupsModel = $this->container->get(\App\Model\AmSystem\Groups::class);
$group = $groupsModel->findOne(['id' => $group_id]);
if($group) {
if ($group->getUserId() == $userId) {
/** @var \App\Model\AmSystem\Campaigns $campaignsModel */
$campaignsModel = $this->container->get(\App\Model\AmSystem\Campaigns::class);
$campaigns = $campaignsModel->findAll(['group_id' => $group_id])->toArray();
/** @var \App\Model\Statistics $stats */
$stats = $this->container->get(\App\Model\Statistics::class);
$campaigns_stat = [];
$isTrackingCampaign = false;
$date_begin = date("Y-m-d");
$date_end_common = date('2020-01-01');
$date_end = date('2020-01-01');
foreach ($campaigns as $campaign_item) {
if ($campaign_item['tracking_action']) {
$isTrackingCampaign = true;
}
$campaign_id = $campaign_item['id'];
$campaigns_stat[$campaign_id] = $stats->getCampaignsStat('campaign', [$campaign_id], $campaign_item['target_action'], null, false);
$campaign_begin = $campaign_item['date_begin'];
$campaign_end = $campaign_item['date_end'];
if ($campaign_begin && $campaign_begin < $date_begin) {
$date_begin = $campaign_begin;
}
if ($campaign_end && $campaign_end > $date_end) {
$date_end = $campaign_end;
}
if (!$campaign_end) {
$date_end_common = null;
}
}
if ($date_end_common) {
$date_end_common = $date_end;
}
/** @var \App\Model\Users $userModel */
$userModel = $this->container->get(\App\Model\Users::class);
$users_list = $userModel->findAll(['type' => 'advertiser']);
$users = [];
foreach($users_list as $user_item) {
$users[$user_item->getId()] = [$user_item->getFullname(), $user_item->getEmail()];
}
/** @var \App\Model\Statistics $stats */
$stats = $this->container->get(\App\Model\Statistics::class);
$dates_common = [$date_begin, $date_end_common];
$dates = [$date_begin, $date_end];
$group_stat = $stats->getCampaignsStat('group', [(int)$group_id], $group->getTargetAction(), $dates_common, true);
$group_stat_total = $stats->getCampaignsStat('group', [(int)$group_id], $group->getTargetAction(), $dates_common, false);
$sites_stats = $stats->getCampaignsSitesStat('group', (int)$group_id, $group->getTargetAction(), $dates);
$regions_stats = $stats->getCampaignsRegionsStat('group', (int)$group_id, $group->getTargetAction(), $dates);
$regions_stats = $this->prepareRegionsData($regions_stats);
// Добавляем размер зоны в данные по сайтам:
/** @var \App\Model\Zones $zonesModel */
$zonesModel = $this->container->get(\App\Model\Zones::class);
if ($sites_stats && !($sites_stats['status'] && $sites_stats['status'] == 'Error')) {
foreach ($sites_stats as $site_name => $site_data) {
if ($site_data['sub']) {
foreach ($site_data['sub'] as $zone_id => $zone_data) {
$zone = $zonesModel->findById($zone_id);
if ($zone) {
$zone_width = $zone->getWidth();
$zone_height = $zone->getHeight();
$zone_size = $zone_width.'x'.$zone_height;
} else {
$zone_size = null;
}
$sites_stats[$site_name]['sub'][$zone_id]['size'] = $zone_size;
}
}
}
}
$stat_cats = self::CAMPAIGN_STAT_CATS;
if (!$isTrackingCampaign) {
unset($stat_cats['order_cnt']);
unset($stat_cats['order_money']);
}
$data['lang'] = $request->getAttribute('layoutInfo')->getLang();
$data['countries'] = $this->container->get('config')['amsystem_conf']['country'];
$data['regions'] = $this->container->get('config')['amsystem_conf']['region'];
$data['cities'] = $this->container->get('config')['amsystem_conf']['city'];
$data['users'] = $users;
$data['group'] = $group;
$data['campaigns'] = $campaigns;
$data['campaigns_stat'] = $campaigns_stat;
$data['sites_stats'] = $sites_stats;
$data['regions_stats'] = $regions_stats;
$data['group_stat'] = $group_stat;
$data['group_stat_total'] = $group_stat_total;
$data['stat_cats'] = $stat_cats;
$data['active_line'] = 'views';
$data['group_date_begin'] = $date_begin;
$data['group_date_end'] = $date_end;
$data['code_regions'] = $this->getCodeRegions();
$data['code_cities'] = $this->getCodeCities();
} else {
$data['error'] = _t('Извините, данная группа закреплена за другим пользователем');
}
} else {
$data['error'] = _t('Извините, группа не найдена');
}
$data = array_merge($data, [
'lang' => $request->getAttribute('layoutInfo')->getLang(),
'layoutInfo' => $request->getAttribute('layoutInfo'),
]);
return new HtmlResponse($this->template->render('app::user/amsystem/group_item', $data));
}
elseif($request->getAttribute('action') == self::ACTION_CAMPAIGNS_ITEM)
{
$campaign_id = $request->getAttribute('id');
......@@ -153,35 +304,38 @@ class CabinetAmSystem extends Common
/** @var \App\Model\AmSystem\Campaigns $campaignsModel */
$campaignsModel = $this->container->get(\App\Model\AmSystem\Campaigns::class);
$campaign_item = $campaignsModel->findById($campaign_id);
$campaign = $campaignsModel->findById($campaign_id);
if ($campaign_item) {
if ($campaign) {
$group_id = $campaign_item->getGroupId();
$group_id = $campaign->getGroupId();
$group = $groupsModel->findOne(['id' => $group_id]);
if ($group->getUserId() == $userId){
$countries = $this->container->get('config')['amsystem_conf']['country'];
$regions = $this->container->get('config')['amsystem_conf']['region'];
$cities = $this->container->get('config')['amsystem_conf']['city'];
/** @var \App\Model\AmSystem\Campaigns $campaignsModel */
//$campaignsModel = $this->container->get(\App\Model\AmSystem\Campaigns::class);
//$campaign = $campaignsModel->findOne(['id' => $campaign_id]);
$campaign = $campaign_item;
$campaignsModel = $this->container->get(\App\Model\AmSystem\Campaigns::class);
$campaign = $campaignsModel->findOne(['id' => $campaign_id]);
if(!$campaign) {
return new HtmlResponse($this->template->render('error::404', ['lang' => $request->getAttribute('layoutInfo')->getLang()]));
}
$group_id = $campaign->getGroupId();
/** @var \App\Model\AmSystem\Groups $groupsModel */
$groupsModel = $this->container->get(\App\Model\AmSystem\Groups::class);
$group = $groupsModel->findOne(['id' => $group_id]);
if(!$group) {
return new HtmlResponse($this->template->render('error::404', ['lang' => $request->getAttribute('layoutInfo')->getLang()]));
}
/** @var \App\Model\Users $userModel */
$userModel = $this->container->get(\App\Model\Users::class);
$user = $userModel->findOne(['id' => $group->getUserId()]);
/** @var \App\Model\Statistics $stats */
$stats = $this->container->get(\App\Model\Statistics::class);
$date_begin = $campaign->getDateBegin();
$date_end_common = $campaign->getDateEnd() ? : null;
$date_end = $campaign->getDateEnd() ? : date("Y-m-d");
$dates_common = [$date_begin, $date_end_common];
$dates = [$date_begin, $date_end];
$campaign_stat = $stats->getCampaignsStat([(int)$campaign_id], $campaign->getTargetAction(), $dates_common, true);
$campaign_stat_total = $stats->getCampaignsStat([(int)$campaign_id], $campaign->getTargetAction(), $dates_common, false);
$active_line = 'views';
$campaign_banners_id = $campaign->getBanners();
if ($campaign_banners_id) {
......@@ -191,41 +345,29 @@ class CabinetAmSystem extends Common
$bannersModel = $this->container->get(\App\Model\AmSystem\Banners::class);
$banners = $bannersModel->findAll(['id' => $banners_id])->toArray();
/** @var \App\Model\Statistics $stats */
$stats = $this->container->get(\App\Model\Statistics::class);
$banners_stats = [];
foreach ($banners as $banner_item) {
$banner_id = $banner_item['id'];
$banners_stats[$banner_id] = $stats->getBannersStat([$banner_id], $campaign->getTargetAction(), null);
/*
$banners_stats[$banner_id] = $stats->getBannersStat([$banner_id], null);
if ($campaign->getTargetAction() == 'load') {
$banners_stats[$banner_id]['views'] = $banners_stats[$banner_id]['loads'];
} else {
}
$views = $banners_stats[$banner_id]['views'];
$money = $banners_stats[$banner_id]['money'];
$clicks = $banners_stats[$banner_id]['clicks'];
$banners_stats[$banner_id]['ctr'] = ($views != 0) ? round(($clicks/$views)*100, 2) : 0;
$banners_stats[$banner_id]['cpm'] = ($views != 0) ? round(($money/$views)*1000, 3) : 0;
$banners_stats[$banner_id]['cpc'] = ($clicks != 0) ? round(($money/$clicks), 1) : 0;
$banners_stats[$banner_id]['money'] = round($banners_stats[$banner_id]['money'], 2);
*/
}
}
$sites_stats = $stats->getCampaignsSitesStat((int)$campaign_id, $campaign->getTargetAction(), $dates);
$regions_stats = $stats->getCampaignsRegionsStat((int)$campaign_id, $campaign->getTargetAction(), $dates);
$date_begin = $campaign->getDateBegin();
$date_end_common = $campaign->getDateEnd() ? : null;
$date_end = $campaign->getDateEnd() ? : date("Y-m-d");
$dates_common = [$date_begin, $date_end_common];
$dates = [$date_begin, $date_end];
$campaign_stat = $stats->getCampaignsStat('campaign', [(int)$campaign_id], $campaign->getTargetAction(), $dates_common, true);
$campaign_stat_total = $stats->getCampaignsStat('campaign', [(int)$campaign_id], $campaign->getTargetAction(), $dates_common, false);
$sites_stats = $stats->getCampaignsSitesStat('campaign', (int)$campaign_id, $campaign->getTargetAction(), $dates);
$regions_stats = $stats->getCampaignsRegionsStat('campaign', (int)$campaign_id, $campaign->getTargetAction(), $dates);
$regions_stats = $this->prepareRegionsData($regions_stats);
// Добавляем размер зоны в данные по сайтам:
/** @var \App\Model\Zones $zonesModel */
$zonesModel = $this->container->get(\App\Model\Zones::class);
if ($sites_stats && !($sites_stats['status'] && $sites_stats['status'] == 'Error')) {
foreach ($sites_stats as $site_name => $site_data) {
if ($site_data['sub']) {
foreach ($site_data['sub'] as $zone_id => $zone_data) {
......@@ -241,19 +383,34 @@ class CabinetAmSystem extends Common
}
}
}
}
$active_line = 'views';
$stat_cats = self::CAMPAIGN_STAT_CATS;
if (!$campaign->getTrackingAction()) {
unset($stat_cats['order_cnt']);
unset($stat_cats['order_money']);
}
$data['lang'] = $request->getAttribute('layoutInfo')->getLang();
$data['campaign'] = $campaign;
$data['countries'] = $countries;
$data['regions'] = $regions;
$data['cities'] = $cities;
$data['banners'] = $banners;
$data['banners_stats'] = $banners_stats;
$data['countries'] = $this->container->get('config')['amsystem_conf']['country'];
$data['regions'] = $this->container->get('config')['amsystem_conf']['region'];
$data['cities'] = $this->container->get('config')['amsystem_conf']['city'];
$data['sites_stats'] = $sites_stats;
$data['regions_stats'] = $regions_stats;
$data['campaign_stat'] = $campaign_stat;
$data['campaign_stat_total'] = $campaign_stat_total;
$data['campaign_stat_cats'] = self::CAMPAIGN_STAT_CATS;
$data['stat_cats'] = $stat_cats;
$data['active_line'] = $active_line;
$data['banners'] = $banners;
$data['banners_stats'] = $banners_stats;
$data['group'] = $group;
$data['user'] = $user;
$data['code_regions'] = $this->getCodeRegions();
$data['code_cities'] = $this->getCodeCities();
$data['img_domain'] = (getenv('DEVELOPMENT')) ? self::IMG_DOMAIN_DEV : self::IMG_DOMAIN_PROD;
} else {
......@@ -269,34 +426,38 @@ class CabinetAmSystem extends Common
'layoutInfo' => $request->getAttribute('layoutInfo'),
]);
return new HtmlResponse($this->template->render('app::user/campaign_item', $data));
return new HtmlResponse($this->template->render('app::user/amsystem/campaign_item', $data));
}
}
private function getGroupsStatData(ServerRequestInterface $request)
{
$stat_data = $this->getAmSystemStatData('group', $request);
return new JsonResponse($stat_data);
}
private function getCampaignsStatData(ServerRequestInterface $request)
{
$stat_data = $this->getAmSystemStatData('campaign', $request);
return new JsonResponse($stat_data);
}
private function getStatData(ServerRequestInterface $request)
private function getAmSystemStatData($type, ServerRequestInterface $request)
{
/** @var UserService $auth */
$auth = $this->container->get(UserService::class);
$userId = $auth->getIdentity()->getId();
$campaign_id = $request->getAttribute('id');
/** @var \App\Model\AmSystem\Groups $groupsModel */
$groupsModel = $this->container->get(\App\Model\AmSystem\Groups::class);
$item_id = $request->getAttribute('id');
if ($type == 'campaign') {
/** @var \App\Model\AmSystem\Campaigns $campaignsModel */
$campaignsModel = $this->container->get(\App\Model\AmSystem\Campaigns::class);
$campaign = $campaignsModel->findById($campaign_id);
if ($campaign) {
$group_id = $campaign->getGroupId();
$group = $groupsModel->findOne(['id' => $group_id]);
$item = $campaignsModel->findById($item_id);
} else {
/** @var \App\Model\AmSystem\Groups $groupsModel */
$groupsModel = $this->container->get(\App\Model\AmSystem\Groups::class);
$item = $groupsModel->findById($item_id);
}
if ($group->getUserId() == $userId) {
if ($item) {
/** @var \App\Model\Statistics $stats */
$stats = $this->container->get(\App\Model\Statistics::class);
......@@ -305,28 +466,106 @@ class CabinetAmSystem extends Common
if ($data_request['type'] == 'stat-common') {
$data_stat = [
'stat' => $stats->getCampaignsStat([(int)$campaign_id], $campaign->getTargetAction(), $data_request['period'], true),
'total' => $stats->getCampaignsStat([(int)$campaign_id], $campaign->getTargetAction(), $data_request['period'], false)
'stat' => $stats->getCampaignsStat($type, [(int)$item_id], $item->getTargetAction(), $data_request['period'], true),
'total' => $stats->getCampaignsStat($type, [(int)$item_id], $item->getTargetAction(), $data_request['period'], false)
];
}
if ($data_request['type'] == 'stat-sites') {
$data_stat = $stats->getCampaignsSitesStat((int)$campaign_id, $campaign->getTargetAction(), $data_request['period']);
$sites_stats = $stats->getCampaignsSitesStat($type, (int)$item_id, $item->getTargetAction(), $data_request['period']);
// Добавляем размер зоны в данные по сайтам:
/** @var \App\Model\Zones $zonesModel */
$zonesModel = $this->container->get(\App\Model\Zones::class);
if ($sites_stats && !($sites_stats['status'] && $sites_stats['status'] == 'Error')) {
foreach ($sites_stats as $site_name => $site_data) {
if ($site_data['sub']) {
foreach ($site_data['sub'] as $zone_id => $zone_data) {
$zone = $zonesModel->findById($zone_id);
if ($zone) {
$zone_width = $zone->getWidth();
$zone_height = $zone->getHeight();
$zone_size = $zone_width.'x'.$zone_height;
} else {
$zone_size = null;
}
$sites_stats[$site_name]['sub'][$zone_id]['size'] = $zone_size;
}
}
}
}
$data_stat = $sites_stats;
}
if ($data_request['type'] == 'stat-regions') {
$data_stat = $stats->getCampaignsRegionsStat((int)$campaign_id, $campaign->getTargetAction(), $data_request['period']);
$data_stat = $stats->getCampaignsRegionsStat($type, (int)$item_id, $item->getTargetAction(), $data_request['period']);
$data_stat = $this->prepareRegionsData($data_stat);
}
return new JsonResponse([
return array(
'type' => $data_request['type'],
'data' => $data_stat
]);
);
}
return null;
}
return new JsonResponse(null);
private function prepareRegionsData($data)
{
if ($data) {
// Убираем города у регионов Киев(703447), Севастополь(694422) и empty:
foreach ([703447, 694422, 'empty'] as $region_code) {
unset($data[$region_code]['sub']);
}
$code_regions = $this->getCodeRegions();
$code_cities = $this->getCodeCities();
foreach ($data as $region => $stat) {
if (!$code_regions[$region]) {
unset($data[$region]);
} else {
if ($stat['sub']) {
foreach ($stat['sub'] as $city => $stat_city) {
if (!$code_cities[$city]) {
unset($data[$region]['sub'][$city]);
}
}
}
}
}
}
return $data;
}
private function getCodeRegions()
{
$code_regions = [];
$regions = $this->container->get('config')['amsystem_conf']['region'];
foreach ($regions as $region_item) {
foreach ($region_item['codes'] as $code) {
$code_regions[$code] = str_replace(' область', '', $region_item['name']);
}
}
return $code_regions;
}
private function getCodeCities()
{
$code_cities = [];
$cities = $this->container->get('config')['amsystem_conf']['city'];
foreach ($cities as $city_item) {
foreach ($city_item['codes'] as $code) {
$code_cities[$code] = str_replace(' область', '', $city_item['name']);
}
}
return $code_cities;
}
}
\ No newline at end of file
......@@ -34,6 +34,7 @@ use App\Entity\Common;
*/
class Campaign extends Common
{
/* group_id */
public function getGroupId()
{
......@@ -78,25 +79,25 @@ class Campaign extends Common
return $this;
}
/* url */
public function getUrl()
/* checksum */
public function getChecksum()
{
return $this->url;
return $this->checksum;
}
public function setUrl($url)
public function setChecksum($checksum)
{
$this->url = $url;
$this->checksum = $checksum;
return $this;
}
/* checksum */
public function getChecksum()
/* url */
public function getUrl()
{
return $this->checksum;
return $this->url;
}
public function setChecksum($checksum)
public function setUrl($url)
{
$this->checksum = $checksum;
$this->url = $url;
return $this;
}
......@@ -155,6 +156,28 @@ class Campaign extends Common
return $this;
}
/* order_sum */
public function getOrderSum()
{
return $this->orderSum;
}
public function setOrderSum($orderSum)
{
$this->orderSum = $orderSum;
return $this;
}
/* tracking_action */
public function getTrackingAction()
{
return $this->trackingAction;
}
public function setTrackingAction($trackingAction)
{
$this->trackingAction = $trackingAction;
return $this;
}
/* max_speed */
public function getMaxSpeed()
{
......
......@@ -45,6 +45,17 @@ class Group extends Common
return $this;
}
/* checksum */
public function getChecksum()
{
return $this->checksum;
}
public function setChecksum($checksum)
{
$this->checksum = $checksum;
return $this;
}
/* title */
public function getTitle()
{
......@@ -100,6 +111,28 @@ class Group extends Common
return $this;
}
/* order_sum */
public function getOrderSum()
{
return $this->orderSum;
}
public function setOrderSum($orderSum)
{
$this->orderSum = $orderSum;
return $this;
}
/* tracking_action */
public function getTrackingAction()
{
return $this->trackingAction;
}
public function setTrackingAction($trackingAction)
{
$this->trackingAction = $trackingAction;
return $this;
}
/* visitor_limit */
public function getVisitorLimit()
{
......
......@@ -369,11 +369,48 @@ class Statistics
$stats['money'] = round($stats['money'], 2);
}
// Данные для статистики по баннерам
public function getBannersStat($banners_id_list, $taget_action, $dates)
{
$dataRequest = array(
'method' => ($dates) ? 'banner_day' : 'banner_total',
'data' => array(
'ids' => $banners_id_list,
)
);
if ($dates) {
$dataRequest['data']['start_date'] = $dates[0];
$dataRequest['data']['end_date'] = $dates[1];
}
//return $dataRequest;
try {
$stats = $this->apiRequest($dataRequest);
} catch (\Exception $e) {
$stats['status'] = 'Error';
}
//return $stats;
if ($stats) {
$this->AddSpecialFields($stats);
$dataStats = $stats;
}
return $dataStats;
}
// Данные для статистики по кампании (баннеры)
public function getCampaignsStat($id_list, $taget_action, $dates, $by_days = false)
public function getCampaignsStat($type, $id_list, $taget_action, $dates, $by_days = false)
{
if ($type == 'campaign') {
$method = ($dates) ? 'camp_day' : 'camp_total';
} else {
$method = ($dates) ? 'cgroup_day' : 'cgroup_total';
}
$dataRequest = array(
'method' => ($dates) ? 'camp_day' : 'camp_total',
'method' => $method,
'data' => array(
'ids' => $id_list,
)
......@@ -493,43 +530,17 @@ class Statistics
return $dataStats;
}
// Данные для статистики по баннерам
public function getBannersStat($banners_id_list, $dates)
{
$dataRequest = array(
'method' => ($dates) ? 'banner_day' : 'banner_total',
'data' => array(
'ids' => $banners_id_list,
)
);
if ($dates) {
$dataRequest['data']['start_date'] = $dates[0];
$dataRequest['data']['end_date'] = $dates[1];
}
//return $dataRequest;
try {
$stats = $this->apiRequest($dataRequest);
} catch (\Exception $e) {
$stats['status'] = 'Error';
}
//return $stats;
if ($stats) {
$this->AddSpecialFields($stats);
$dataStats = $stats;
}
return $dataStats;
}
// Данные для статистики кампании по сайтам
public function getCampaignsSitesStat($id, $taget_action, $dates)
public function getCampaignsSitesStat($type, $id, $taget_action, $dates)
{
if ($type == 'campaign') {
$method = 'camp_zone';
} else {
$method = 'cgroup_zone';
}
$dataRequest = array(
'method' => 'camp_zone',
'method' => $method,
'data' => array(
'id' => $id,
'start_date' => $dates[0],
......@@ -564,10 +575,16 @@ class Statistics
}
// Данные для статистики кампании по регионам
public function getCampaignsRegionsStat($id, $taget_action, $dates)
public function getCampaignsRegionsStat($type, $id, $taget_action, $dates)
{
if ($type == 'campaign') {
$method = 'camp_geo';
} else {
$method = 'cgroup_geo';
}
$dataRequest = array(
'method' => 'camp_geo',
'method' => $method,
'data' => array(
'id' => $id,
'start_date' => $dates[0],
......@@ -585,21 +602,15 @@ class Statistics
//return $stats;
if ($stats) {
// Убираем города у регионов Киев(703447) и empty:
foreach ([703447, 'empty'] as $region_code) {
unset($stats[$region_code]['sub']);
}
foreach ($stats as $region => $stat) {
$this->AddSpecialFields($stats[$region]);
if ($stat['sub']) {
foreach ($stat['sub'] as $sub => $stat) {
$this->AddSpecialFields($stats[$region]['sub'][$sub]);
}
}
}
$dataStats = $stats;
}
......
<?php
/*
Функции для форматирования
*/
function formatMoney($val)
{
return number_format((float)$val, 2, ',', ' ') . ' &#8372';
}
?>
<?php
/*
Функции для форматирования
*/
function formatMoney($val)
{
return number_format((float)$val, 2, ',', ' ') . ' &#8372';
}
function formatCPM($val)
{
return number_format((float)$val, 3, ',', ' ') . ' &#8372';
}
function formatCTR($val)
{
return number_format((float)$val, 2, ',', ' ') . '%';
}
function formatIntegerValue($val)
{
return number_format($val, 0, ',', ' ');
}
function formatField($value, $cat)
{
switch ($cat) {
case 'money':
case 'order_money':
case 'cpc':
case 'cpm':
$formatted_value = formatMoney($value);
break;
case 'ctr':
$formatted_value = formatCTR($value);
break;
default:
$formatted_value = formatIntegerValue($value);
}
return $formatted_value;
}
?>
<?php
/**
* Copyright (c) 2016 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*
*/
/** @var $this \Zend\View\Renderer\PhpRenderer */
$this->headScript()
->appendFile('/js/jquery.cookie.js')
->appendFile('/js/c3.min.js')
->appendFile('/js/d3.min.js')
->appendFile('/js/datepicker.min.js')
->appendFile('/js/adm/amsystem-table-sort.js')
->appendFile('/js/adm/amsystem-table-filter.js')
->appendFile('/js/adm/amsystem-campaign-edit.js')
->appendFile('/js/adm/amsystem-campaign-stats.js')
;
$this->headLink()
->appendStylesheet('/css/c3.css')
->appendStylesheet('/css/datepicker.min.css')
->appendStylesheet('/css/styles-amsystem.css')
;
$lang = $this->lang;
$error = $this->error;
if (!$error) {
$campaign = $this->campaign;
$countries = $this->countries;
$regions = $this->regions;
$cities = $this->cities;
$group = $this->group;
$user = $this->user;
$campaign_active = (bool)$campaign->getActive();
$campaign_archive = (bool)$campaign->getArchive();
$campaign_id = $campaign->getId();
$campaign_title = $campaign->getTitle();
$campaign_url = $campaign->getUrl();
$campaign_date_begin = $campaign->getDateBegin();
$campaign_date_end = $campaign->getDateEnd();
$campaign_buy_type = $group->getBuyType();
$campaign_target_action = $group->getTargetAction();
$campaign_price = ($campaign->getPrice()) ? $campaign->getPrice()/10 : null;
$campaign_tracking_action = (bool)$campaign->getTrackingAction();
$campaign_order_sum = ($campaign->getOrderSum()) ? $campaign->getOrderSum()/10 : null;
$campaign_visitor_limit = json_decode($campaign->getVisitorLimit(), true);
$campaign_money_limit = json_decode($campaign->getMoneyLimit(), true);
$campaign_max_speed = (bool)$campaign->getMaxSpeed();
$campaign_tracking_pixels = json_decode($campaign->getTrackingPixels(), true);
$campaign_geo = json_decode($campaign->getTargeting(), true)['geo'];
$banners = $this->banners;
$group_price = ($group->getPrice()) ? $group->getPrice()/10 : null;
$group_order_sum = ($group->getOrderSum()) ? $group->getOrderSum()/10 : null;
$group_visitor_limit = json_decode($group->getVisitorLimit(), true);
$group_money_limit = json_decode($group->getMoneyLimit(), true);
$group_geo = json_decode($group->getTargeting(), true)['geo'];
$sites_stats = $this->sites_stats;
$regions_stats = $this->regions_stats;
$campaign_stat = $this->campaign_stat;
$campaign_stat_total = $this->campaign_stat_total;
$stat_cats = $this->stat_cats;
$banner_stat_cats = $stat_cats;
unset($banner_stat_cats['reach']);
$code_regions = $this->code_regions;
$code_cities = $this->code_cities;
$target_class = ($campaign_target_action == 'load') ? 'load-target' : '';
$link_groups_list = $this->url('user.cabinet.amsystem', ['lang' => $lang]);
$link_group = $this->url('user.cabinet.group', ['lang' => $lang, 'id' => $group->getId()]);
$form_link = $this->url('user.cabinet.campaign', ['lang' => $lang, 'id' => $campaign_id]);
$stat_link = $this->url('user.cabinet.campaigns.stat', ['lang' => $lang, 'id' => $campaign_id]);
$today = date('Y-m-d');
$img_domain = $this->img_domain;
$regexp_money = '^\d+([\.|,]\d+)?$';
}
?>
<?= $this->partial('app::user/amsystem/_format'); ?>
<?php if($error): ?>
<section class="b-content__work error">
<div class="wrapp">
<h1><?= $error?></h1>
</div>
</section>
<?php else: ?>
<section class="b-content__work inner">
<div class="panel panel-info">
<!-- Header -->
<div class="panel-heading">
<h1>
<a href="<?=$link_groups_list ?>">Кампании</a> / <a href="<?=$link_group ?>"><?= $group->getTitle() ?></a> /
<span class="form-group title" data-type="title">
<label class="title-field">Назавние</label>
<span class="value-show"><?= $campaign_title ?></span>
<span class="value-edit">
<input class="form-control campaign-title" type="text" data-field="campaign-title" value="<?= $campaign_title ?>">
</span>
</span>
</h1>
</div>
<div class="panel-body">
<!-- Переключатель вкладок -->
<div class="switch-data" action="<?= $stat_link ?>">
<span class="switch-item" data-type="settings">Настройки кампании</span>
<span class="switch-item" data-type="stat-common">Общая статистика</span>
<span class="switch-item" data-type="stat-sites">По сайтам</span>
<span class="switch-item" data-type="stat-regions">По регионам</span>
</div>
<!-- Настройки кампании -->
<div class="form-group-data settings" data-type="settings">
<form id="campaign-create-form" method="post" action="<?= $form_link ?>">
<fieldset disabled="disabled">
<!-- Активность -->
<div class="form-group active">
<input type="checkbox" id="campaign-active" name="campaign-active" <?php if ($campaign_active): ?>checked<?php endif; ?> <?php if($campaign_archive): ?>disabled<?php endif; ?>>
<label class="title-field" for="campaign-active">Кампания активна</label>
<?php if(!$campaign_date_end || $today <= $campaign_date_end): ?>
<a class="btn btn-danger action-archive send <?php if($campaign_archive): ?>hidden<?php endif; ?>" href="<?= $form_link ?>"><?= _t('Отправить в архив')?></a>
<a class="btn btn-primary action-archive remove <?php if(!$campaign_archive): ?>hidden<?php endif; ?>" href="<?= $form_link ?>"><?= _t('Извлечь из архива')?></a>
<?php endif; ?>
</div>
<!-- Пользователь -->
<div class="form-group">
<label class="title-field"><?= _t('Пользователь')?></label>
<span><?= $user->getFullname() ?></span>
</div>
<!-- Даты проведения -->
<div class="form-group">
<label class="title-field"><?= _t('Даты проведения')?></label>
c:
<input type='text' id="campaign-date-begin" class="form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" autocomplete="off" />
по:
<input type='text' id="campaign-date-end" class="form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" autocomplete="off" />
</div>
<!-- Ссылка -->
<div class="form-group url" data-type="url">
<label class="title-field" for="campaign-url"><?= _t('Ссылка')?></label>
<div class="value-show">
<a href="<?= $campaign_url ?>" target="_blank"><?= $campaign_url ?></a>
</div>
<div class="value-edit">
<input type="text" class="form-control" id="campaign-url" name="url" value="<?= $campaign_url ?>" placeholder="<?= _t('ссылка') ?>">
</div>
</div>
</fieldset>
<div class="b-left">
<fieldset disabled="disabled">
<!-- Тип кампании -->
<div class="form-group">
<label class="title-field"><?= _t('Тип кампании')?></label>
<input type="radio" id="campaign-buy-type-auction" name="buy_type" value="auction" <?php if ($campaign_buy_type == 'auction'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-buy-type-auction">Аукцион</label>
<input type="radio" id="campaign-buy-type-garantee" name="buy_type" value="garantee" <?php if ($campaign_buy_type == 'garantee'): ?>checked<?php endif; ?>>
<label class="select-item disabled" for="campaign-buy-type-garantee">Гарантия</label>
</div>
<!-- Целевое действие -->
<div class="form-group">
<label class="title-field"><?= _t('Целевое действие')?></label>
<input type="radio" id="campaign-view-load" name="target_action" value="load" <?php if ($campaign_target_action == 'load'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-load">Показ</label>
<input type="radio" id="campaign-view-view" name="target_action" value="view" <?php if ($campaign_target_action == 'view'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-view">Реальный показ</label>
<input type="radio" id="campaign-view-click" name="target_action" value="click" <?php if ($campaign_target_action == 'click'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-click">Клик</label>
</div>
<!-- Стоимость -->
<div class="form-group price">
<label class="title-field" for="campaign-price"><?= _t('Стоимость')?></label>
<input id="campaign-price" class="form-control price" name="price" value="<?= $campaign_price ?>" placeholder="<?= $group_price ?>" group-value="<?= $group_price ?>" pattern="<?= $regexp_money ?>" />
грн. за <span class="price-title-mark">1000 показов</span>
<?php if($group_price): ?>
<div class="value-notice">значение для всей группы кампаний</div>
<?php endif; ?>
</div>
<!-- Ограничения на посетителя -->
<div class="form-group campaign-visitor-limit__wrap" data-type="visitor-limit">
<label class="title-field"><?= _t('Ограничения на посетителя')?></label>
<br />
<div class="value-show campaign-value"></div>
<?php if($group_visitor_limit): ?>
<div class="value-show-group">
<?php
function declOfNum($number, $titles)
{
$cases = array (2, 0, 1, 1, 1, 2);
$format = $titles[ ($number%100 > 4 && $number %100 < 20) ? 2 : $cases[min($number%10, 5)] ];
return sprintf($format, $number);
}
foreach ($group_visitor_limit as $action => $data) {
if ($action == 'view') $titles = ['показ', 'показа', 'показов'];
if ($action == 'click') $titles = ['клик', 'клика', 'кликов'];
foreach ($data as $period => $value) {
switch ($period) {
case 'page': $title_mark = 'на странице'; break;
case 'hour': $title_mark = 'в час'; break;
case 'day': $title_mark = 'в сутки'; break;
case 'week': $title_mark = 'в неделю'; break;
case 'month': $title_mark = 'в месяц'; break;
}
if ($value) {
?>
<span><b><?= $value ?></b> <i><?= declOfNum($value, $titles) ?></i> <?= $title_mark ?></span><br />
<?php
} } }
?>
<div class="notice">ограничения для группы</div>
</div>
<?php endif; ?>
<div class="value-edit">
<div class="campaign-visitor-limit view" data-name="view">
<input type="number" min="0" id="campaign-visitor-limit-view-page" class="form-control limit" name="page" data-desc="на странице" value="<?= $campaign_visitor_limit['view']['page'] ?>" /> показов на странице <br />
<input type="number" min="0" id="campaign-visitor-limit-view-hour" class="form-control limit" name="hour" data-desc="в час" value="<?= $campaign_visitor_limit['view']['hour'] ?>" /> показов в час <br />
<input type="number" min="0" id="campaign-visitor-limit-view-day" class="form-control limit" name="day" data-desc="в сутки" value="<?= $campaign_visitor_limit['view']['day'] ?>" /> показов в сутки <br />
<input type="number" min="0" id="campaign-visitor-limit-view-week" class="form-control limit" name="week" data-desc="в неделю" value="<?= $campaign_visitor_limit['view']['week'] ?>" /> показов в неделю <br />
<input type="number" min="0" id="campaign-visitor-limit-view-month" class="form-control limit" name="month" data-desc="в месяц" value="<?= $campaign_visitor_limit['view']['month'] ?>" /> показов в месяц
</div>
<div class="campaign-visitor-limit click" data-name="click">
<input type="number" min="0" id="campaign-visitor-limit-click-page" class="form-control limit" name="page" data-desc="на странице" value="<?= $campaign_visitor_limit['click']['page'] ?>" /> кликов на странице <br />
<input type="number" min="0" id="campaign-visitor-limit-click-hour" class="form-control limit" name="hour" data-desc="в час" value="<?= $campaign_visitor_limit['click']['hour'] ?>" /> кликов в час <br />
<input type="number" min="0" id="campaign-visitor-limit-click-day" class="form-control limit" name="day" data-desc="в сутки" value="<?= $campaign_visitor_limit['click']['day'] ?>" /> кликов в сутки <br />
<input type="number" min="0" id="campaign-visitor-limit-click-week" class="form-control limit" name="week" data-desc="в неделю" value="<?= $campaign_visitor_limit['click']['week'] ?>" /> кликов в неделю <br />
<input type="number" min="0" id="campaign-visitor-limit-click-month" class="form-control limit" name="month" data-desc="в месяц" value="<?= $campaign_visitor_limit['click']['month'] ?>" /> кликов в месяц
</div>
</div>
<div class="b-clear"></div>
</div>
<!-- Бюджет -->
<div class="form-group campaign-money-limit" data-type="money-limit">
<label class="title-field"><?= _t('Бюджет')?></label>
<br />
<div class="value-show campaign-value"></div>
<?php if($group_money_limit): ?>
<div class="value-show-group">
<?php
foreach ($group_money_limit as $period => $value) {
switch ($period) {
case 'total': $title_mark = 'грн. всего'; break;
case 'day': $title_mark = 'грн. в сутки'; break;
case 'week': $title_mark = 'грн. в неделю'; break;
case 'month': $title_mark = 'грн. в месяц'; break;
}
if ($value) {
?>
<span><b><?= $value ?></b> <?= $title_mark ?></span><br />
<?php
} }
?>
<div class="notice">ограничения для группы</div>
</div>
<?php endif; ?>
<div class="value-edit">
<div class="campaign-money-limit-values">
<input id="campaign-money-limit-total" class="form-control limit" name="total" data-desc="всего" value="<?= $campaign_money_limit['total'] ?>" pattern="<?= $regexp_money ?>" /> грн. всего <br />
<input id="campaign-money-limit-day" class="form-control limit" name="day" data-desc="в сутки" value="<?= $campaign_money_limit['day'] ?>" pattern="<?= $regexp_money ?>" /> грн. в сутки <br />
<input id="campaign-money-limit-week" class="form-control limit" name="week" data-desc="в неделю" value="<?= $campaign_money_limit['week'] ?>" pattern="<?= $regexp_money ?>" /> грн. в неделю <br />
<input id="campaign-money-limit-month" class="form-control limit" name="month" data-desc="в месяц" value="<?= $campaign_money_limit['month'] ?>" pattern="<?= $regexp_money ?>" /> грн. в месяц
</div>
</div>
<div class="b-clear"></div>
</div>
<!-- Скорость открута -->
<div class="form-group">
<label class="title-field"><?= _t('Скорость открута')?></label>
<input type="radio" id="campaign-max-speed-true" name="max_speed" value="1" <?php if ($campaign_max_speed): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-max-speed-true">Максимальная</label>
<input type="radio" id="campaign-max-speed-false" name="max_speed" value="0" <?php if (!$campaign_max_speed): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-max-speed-false">Равномерная</label>
</div>
<!-- Гео -->
<div class="form-group geo <?php if ($group_geo): ?>group-geo<?php endif; ?>" data-type="geo">
<label class="title-field"><?= _t('Гео (таргетинг)')?></label>
<div class="value-show"></div>
<?php if ($group_geo): ?>
<div class="value-show-group geo">
<textarea id="group-targeting-value" style="display: none"><?= $group->getTargeting() ?></textarea>
<?php if ($group_geo['country']): ?>
<?php
$title_values = $countries[$group_geo['country']['values'][0]];
if ($group_geo['special']) {
$title_special = '<b>(исключить неподконтрольные территории)</b>';
}
?>
<span><?= 'Страна' ?>: <b><?= $title_values ?></b> <?= $title_special ?></span><br />
<?php endif; ?>
<?php if ($group_geo['region']['values']): ?>
<?php
$title_mark = ($group_geo['region']['exclude']) ? 'кроме': 'только';
$title_values = [];
foreach ($group_geo['region']['values'] as $code) {
$title_values[] = str_replace(' область', '', $regions[$code]['name']);
}
$title_values = implode(", ", $title_values);
?>
<span><?= 'Области' ?> <i><?= $title_mark ?></i>: <b><?= $title_values ?></b></span><br />
<?php endif; ?>
<?php if ($group_geo['city']['values']): ?>
<?php
$title_mark = ($group_geo['city']['exclude']) ? 'кроме': 'только';
$title_values = [];
foreach ($group_geo['city']['values'] as $code) {
$title_values[] = $cities[$code]['name'];
}
$title_values = implode(", ", $title_values);
?>
<span><?= 'Города' ?> <i><?= $title_mark ?></i>: <b><?= $title_values ?></b></span><br />
<?php endif; ?>
<div class="geo-notice">значение для всей группы кампаний</div>
</div>
<?php endif; ?>
<?php
if (!$campaign_geo) {
$campaign_geo = $group_geo;
}
?>
<div class="value-edit">
<div class="targeting_geo">
<!-- country -->
<div class="geo_country">
Страна:
<select class="form-control" id="targeting_geo_country" name="targeting_geo_country" disabled>
<?php foreach($countries as $code=>$title): ?>
<option value="<?= $code ?>" <?php if ($campaign_geo['country']['values'] && in_array($code, $campaign_geo['country']['values'])): ?>selected<?php endif; ?>><?= _t($title) ?></option>
<?php endforeach ?>
</select>
<span class="b-exclude">
<input type="checkbox" id="country-exclude" name="country-exclude" <?php if ($campaign_geo['special']['exclude'] || !$campaign_geo): ?>checked<?php endif; ?>>
<label for="country-exclude"><?= _t('исключить неподконтрольные территории')?></label>
</span>
</div>
<div class="geo_region-city">
<!-- region -->
<div class="geo_region-wrap">
<div class="geo_region">
<div class="form-group">
<label for="region-list"><?= _t('Области')?></label>
<div class="b-exclude">
<input type="checkbox" id="region-exclude" name="region-exclude" <?php if ((bool)$campaign_geo['region']['exclude']): ?>checked<?php endif; ?>>
<label for="region-exclude"><?= _t('исключить')?></label>
</div>
<div>
<div class="filters-select">
<div class="region-val-geo">
<input type="text" class="form-control filter" id="region-filter" name="region-filter" value="" placeholder="фильтр">
</div>
<div class="list-filters-wrap">
<ul class="list-filter">
<?php foreach($regions as $id=>$data): ?>
<li>
<input type="checkbox" id="region-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $data['name'] ?>" <?php if ($campaign_geo['region']['values'] && in_array($id, $campaign_geo['region']['values'])): ?>checked<?php endif; ?>>
<label for="region-id-<?= $id ?>"><?= $data['name'] ?></label>
</li>
<?php endforeach ?>
</ul>
</div>
</div>
<div class="filters-values">
<ul class="values-string-list">
<?php if($campaign_geo['region']['values']): ?>
<?php foreach($campaign_geo['region']['values'] as $id): ?>
<li>
<input type="checkbox" checked id="l-region-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $regions[$id]['name'] ?>">
<label for="l-region-id-<?= $id ?>"><?= $regions[$id]['name'] ?></label>
</li>
<?php endforeach ?>
<?php endif; ?>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- city -->
<div class="geo_city-wrap">
<div class="geo_city">
<div class="form-group">
<label for="city-list"><?= _t('Города')?></label>
<div class="b-exclude">
<input type="checkbox" id="city-exclude" name="city-exclude" <?php if ((bool)$campaign_geo['city']['exclude']): ?>checked<?php endif; ?>>
<label for="city-exclude"><?= _t('исключить')?></label>
</div>
<div>
<div class="filters-select">
<input type="text" class="form-control filter" id="city-filter" name="city-filter" value="" placeholder="фильтр">
<div class="list-filters-wrap">
<ul class="list-filter">
<?php foreach($cities as $id=>$data): ?>
<li>
<input type="checkbox" id="city-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $data['name'] ?>" <?php if ($campaign_geo['city']['values'] && in_array($id, $campaign_geo['city']['values'])): ?>checked<?php endif; ?>>
<label for="city-id-<?= $id ?>"><?= $data['name'] ?></label>
</li>
<?php endforeach ?>
</ul>
</div>
</div>
<div class="filters-values">
<ul class="values-string-list">
<?php if($campaign_geo['city']['values']): ?>
<?php foreach($campaign_geo['city']['values'] as $id): ?>
<li>
<input type="checkbox" checked id="l-city-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $cities[$id]['name'] ?>">
<label for="l-region-id-<?= $id ?>"><?= $cities[$id]['name'] ?></label>
</li>
<?php endforeach ?>
<?php endif; ?>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Трекинг -->
<div class="form-group tracking_pixels" data-type="tracking-pixels" data-value="">
<label class="title-field"><?= _t('Трекинг')?></label>
<div class="value-show"></div>
<div class="value-edit">
<?php
$items = [
'load' => 'Показ',
'view' => 'Реальный показ',
'click' => 'Клик'
]
?>
<?php foreach( $items as $item => $title): ?>
<div class="form-group tracking_pixels_item <?= $item ?>" data-name="<?= $item ?>" data-value="[]">
<label><?= $title ?></label>
<div class="tracking_pixels_urls">
<?php if($campaign_tracking_pixels[$item]): ?>
<?php foreach ($campaign_tracking_pixels[$item] as $url) : ?>
<div class="url-item">
<input type="text" class="form-control" value="<?= $url ?>" placeholder="url">
<div class="delete-item">×</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
<div class="add-row">+ Добавить</div>
</div>
<?php endforeach ?>
</div>
</div>
</fieldset>
</div>
<div class="b-right">
<!-- Баннеры -->
<div class="form-group banners">
<label class="title-field"><?= _t('Баннеры')?></label>
<select class="form-control banners-status">
<option value="all"><?= _t('все') ?></option>
<option value="active"><?= _t('активные') ?></option>
<option value="not-active"><?= _t('не активные') ?></option>
</select>
<div>
<table class="table campaign-banners">
<thead>
<tr>
<th></th>
<th>Размер</th>
<th>Превью</span></th>
<?php foreach ($banner_stat_cats as $cat => $cat_data) : ?>
<th class="stat"><span class="sort" data-sort="<?= $cat ?>" data-sortasc="1"><?= $cat_data['title'] ?></span></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php if($banners): ?>
<?php foreach($banners as $banner): ?>
<?php
$stat = $banners_stats[$banner['id']];
$tr_class = '';
if ((bool)$banner['active']) {
$tr_class.= 'active';
} else {
$tr_class.= 'not-active';
}
?>
<tr data-id="<?= $banner['id'] ?>" class="banner-item <?= $tr_class ?>">
<td class="check"><input type="checkbox" <?php if ((bool)$banner['active']): ?>checked<?php endif; ?>></td>
<td><span class="banner-size"><?= $banner['width'] ?>x<?= $banner['height'] ?></span></td>
<td><span class="banner-preview" src="<?= $img_domain ?><?= $banner['img'] ?>" style="background-image: url(<?= $img_domain ?><?= $banner['img'] ?>)"></span></td>
<?php foreach ($banner_stat_cats as $cat => $cat_data) : ?>
<?php
$target_class_item = (in_array($cat, ['views', 'money'])) ? $target_class : '';
?>
<td class="stat <?= $cat ?> <?= $target_class_item ?>" data-cat="<?= $cat ?>" data-value="<?= $stat[$cat] ?>"><?= formatField($stat[$cat], $cat) ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach ?>
<?php endif ?>
</tbody>
<tfoot>
<tr class="total">
<td colspan="3">Суммарно</td>
<?php foreach ($banner_stat_cats as $cat => $cat_data) : ?>
<?php
$target_class_item = (in_array($cat, ['views', 'money'])) ? $target_class : '';
?>
<td class="stat <?= $cat ?> <?= $target_class_item ?>"></td>
<?php endforeach; ?>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
<div class="b-clear"></div>
<!-- Трекинг действий -->
<fieldset disabled="disabled">
<div class="form-group tracking-action" data-type="tracking-action" >
<input type="checkbox" id="group-tracking-action" name="group-tracking-action" <?php if ($campaign_tracking_action): ?>checked<?php endif; ?>>
<label class="title-field" for="group-active">Трекинг действий</label>
<div class="tracking-action_content">
<div class="tracking-action_link">
http://order.azbne.net/b/order?&campaign_id={CAMPAIGN_ID}&click_id={CLICK_ID}&order_sum={ORDER_SUM}&order_id={ORDER_ID}
</div>
<!-- Цена действия по-умолчанию -->
<div class="form-group order-sum" data-type="order-sum">
<label for="group-order-sum"><?= _t('Цена действия по-умолчанию')?></label>
<input id="campaign-order-sum" class="form-control order-sum" name="order_sum" value="<?= $campaign_order_sum ?>" placeholder="<?= $group_order_sum ?>" pattern="<?= $regexp_money ?>" />
грн.
<?php if($group_order_sum): ?>
<div class="value-notice">значение для всей группы кампаний</div>
<?php endif; ?>
</div>
</div>
</div>
</fieldset>
</form>
</div>
<!-- Общая статистика -->
<div class="form-group-data stat-common" data-type="stat-common">
<div class="b-content__loading"></div>
<div class="campaign-stat">
<textarea id="campaign-stat"><?= ($campaign_stat ? json_encode($campaign_stat) : '')?></textarea>
<textarea id="campaign-stat-total"><?= ($campaign_stat_total ? json_encode($campaign_stat_total) : '')?></textarea>
<textarea id="campaign-stat-cats"><?= ($stat_cats ? json_encode($stat_cats) : '')?></textarea>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin-common" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" autocomplete="off" />
по:
<input type='text' id="campaign-date-end-common" class="campaign-date-end form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" autocomplete="off" />
</div>
<div class="chart-graph-stat-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="chart-graph-stat-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<!-- График -->
<div id="chart-graph-stat" data-colors=<?= ($colors_active_lines ? json_encode($colors_active_lines) : '')?>></div>
<!-- Таблица -->
<div id="table-stat" class="b-table_wrapp">
<table id="table-line-common" class="table table-striped common-stat sortable" data-type="common-stat">
<thead class="sortable">
<tr>
<th class="period" data-id="period">
<b class="sort" id="period">Дата</b>
</th>
<?php foreach($stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<span style="border-color: <?= $cat['color'] ?>;">
<input type="checkbox" data-field="<?= $name ?>" checked />
</span>
<b class="sort" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<!-- По сайтам -->
<div class="form-group-data stat-sites" data-type="stat-sites">
<div class="b-content__loading"></div>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin-sites" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" autocomplete="off" />
по:
<input type='text' id="campaign-date-end-sites" class="campaign-date-end form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" autocomplete="off" />
</div>
<div class="sites-stats">
<textarea id="campaign-sites-stat"><?= ($sites_stats ? json_encode($sites_stats) : '')?></textarea>
<div class="sites-stats-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="sites-stats-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<div class="b-table_wrapp">
<table id="table-line-sites" class="table table-striped table-by-cats sortable" data-type="sites-stat">
<thead class="sortable">
<tr>
<th class="period" data-id="period">
<b>Сайт</b>
</th>
<?php foreach($stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<b class="sort" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<!-- По регионам -->
<div class="form-group-data stat-regions" data-type="stat-regions">
<div class="b-content__loading"></div>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin-regions" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" autocomplete="off" />
по:
<input type='text' id="campaign-date-end-regions" class="campaign-date-end form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" autocomplete="off" />
</div>
<div class="regions-stats">
<textarea id="campaign-regions-stat"><?= ($regions_stats ? json_encode($regions_stats) : '')?></textarea>
<textarea id="regions-codes"><?= ($code_regions ? json_encode($code_regions) : '')?></textarea>
<textarea id="cities-codes"><?= ($code_cities ? json_encode($code_cities) : '')?></textarea>
<div class="regions-stats-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="regions-stats-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<div class="b-table_wrapp">
<table id="table-line-regions" class="table table-striped table-by-cats sortable" data-type="regions-stat">
<thead class="sortable">
<tr>
<th class="period" data-id="period">
<b>Регион</b>
</th>
<?php foreach($stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<b class="sort" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</section>
<?php endif; ?>
\ No newline at end of file
<?php
/**
* Copyright (c) 2016 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*
*/
/** @var $this \Zend\View\Renderer\PhpRenderer */
$this->headScript()
->appendFile('/js/jquery.cookie.js')
->appendFile('/js/c3.min.js')
->appendFile('/js/d3.min.js')
->appendFile('/js/datepicker.min.js')
->appendFile('/js/adm/amsystem-table-sort.js')
->appendFile('/js/adm/amsystem-table-filter.js')
->appendFile('/js/adm/amsystem-group-edit.js')
->appendFile('/js/adm/amsystem-campaign-stats.js')
;
$this->headLink()
->appendStylesheet('/css/c3.css')
->appendStylesheet('/css/datepicker.min.css')
->appendStylesheet('/css/styles-amsystem.css')
;
$lang = $this->lang;
$countries = $this->countries;
$regions = $this->regions;
$cities = $this->cities;
$users = $this->users;
$error = $this->error;
if (!$error) {
$group = $this->group;
$campaigns = $this->campaigns;
$campaigns_stat = $this->campaigns_stat;
$group_id = $group->getId();
$group_active = $group->getActive();
$group_title = $group->getTitle();
$group_user_id = $group->getUserId();
$campaign_buy_type = $group->getBuyType();
$campaign_target_action = $group->getTargetAction();
$campaign_price = $group->getPrice()/10;
$campaign_tracking_action = (bool)$group->getTrackingAction();
$campaign_order_sum = $group->getOrderSum()/10;
$campaign_visitor_limit = json_decode($group->getVisitorLimit(), true);
$campaign_money_limit = json_decode($group->getMoneyLimit(), true);
$campaign_max_speed = (bool)$group->getMaxSpeed();
$campaign_geo = json_decode($group->getTargeting(), true)['geo'];
$sites_stats = $this->sites_stats;
$regions_stats = $this->regions_stats;
$group_stat = $this->group_stat;
$group_stat_total = $this->group_stat_total;
$stat_cats = $this->stat_cats;
$group_date_begin = $this->group_date_begin;
$group_date_end = $this->group_date_end;
$code_regions = $this->code_regions;
$code_cities = $this->code_cities;
$form_link = $this->url('user.cabinet.group', ['lang' => $lang, 'id' => $group_id]);
$link_groups_list = $this->url('user.cabinet.amsystem', ['lang' => $lang]);
$link_cancel = $this->url('user.cabinet.amsystem', ['lang' => $lang]);
$stat_link = $this->url('user.cabinet.groups.stat', ['lang' => $lang, 'id' => $group_id]);
$regexp_money = '^\d+([\.|,]\d+)?$';
}
?>
<?= $this->partial('app::user/amsystem/_format'); ?>
<?php if($error): ?>
<section class="b-content__work error">
<div class="wrapp">
<h1><?= $error?></h1>
</div>
</section>
<?php else: ?>
<section class="b-content__work inner">
<div class="panel panel-info">
<!-- Header -->
<div class="panel-heading">
<h1>
<a class="group-id" data-id="<?= $group_id ?>" href="<?=$link_groups_list ?>">Группы кампаний</a> /
<span class="form-group title" data-type="title">
<label class="title-field">Назавние</label>
<span class="value-show"><?= $group_title ?></span>
<span class="value-edit">
<input class="form-control group-title" type="text" data-field="group-title" value="<?= $group_title ?>">
</span>
</span>
</h1>
</div>
<div class="panel-body">
<!-- Переключатель вкладок -->
<div class="switch-data" action="<?= $stat_link ?>">
<span class="switch-item" data-type="settings">Настройки группы кампаний</span>
<span class="switch-item" data-type="stat-common">Общая статистика</span>
<span class="switch-item" data-type="stat-sites">По сайтам</span>
<span class="switch-item" data-type="stat-regions">По регионам</span>
</div>
<!-- Настройки группы кампаний -->
<div class="form-group-data settings" data-type="settings">
<form id="group-create-form" method="post" action="<?= $form_link ?>">
<fieldset disabled="disabled">
<!-- Активность -->
<div class="form-group active" data-type="active">
<input type="checkbox" id="group-active" name="group-active" <?php if ($group_active): ?>checked<?php endif; ?>>
<label class="title-field" for="group-active">Группа кампаний активна</label>
</div>
<div class="b-left">
<!-- Тип кампании -->
<div class="form-group">
<label class="title-field"><?= _t('Тип кампании')?></label>
<input type="radio" id="campaign-buy-type-auction" name="buy_type" value="auction" <?php if ($campaign_buy_type == 'auction'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-buy-type-auction">Аукцион</label>
<input type="radio" id="campaign-buy-type-garantee" name="buy_type" value="garantee" <?php if ($campaign_buy_type == 'garantee'): ?>checked<?php endif; ?>>
<label class="select-item disabled" for="group-buy-type-garantee">Гарантия</label>
</div>
<!-- Целевое действие -->
<div class="form-group">
<label class="title-field"><?= _t('Целевое действие')?></label>
<input type="radio" id="campaign-view-load" name="target_action" value="load" <?php if ($campaign_target_action == 'load'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-load">Показ</label>
<input type="radio" id="campaign-view-view" name="target_action" value="view" <?php if ($campaign_target_action == 'view'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-view">Реальный показ</label>
<input type="radio" id="campaign-view-click" name="target_action" value="click" <?php if ($campaign_target_action == 'click'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-click">Клик</label>
</div>
<!-- Стоимость -->
<div class="form-group">
<label class="title-field" for="campaign-price"><?= _t('Стоимость')?></label>
<input id="campaign-price" class="form-control price" name="price" value="<?= $campaign_price ?>" pattern="<?= $regexp_money ?>" />
грн. за <span class="price-title-mark">1000 показов</span>
</div>
<!-- Ограничения на посетителя -->
<div class="form-group campaign-visitor-limit__wrap" data-type="visitor-limit">
<label class="title-field"><?= _t('Ограничения на посетителя')?></label>
<br />
<div class="value-show"></div>
<div class="value-edit">
<div class="campaign-visitor-limit view" data-name="view">
<input type="number" min="0" id="campaign-visitor-limit-view-page" class="form-control limit" name="page" data-desc="на странице" value="<?= $campaign_visitor_limit['view']['page'] ?>" /> показов на странице <br />
<input type="number" min="0" id="campaign-visitor-limit-view-hour" class="form-control limit" name="hour" data-desc="в час" value="<?= $campaign_visitor_limit['view']['hour'] ?>" /> показов в час <br />
<input type="number" min="0" id="campaign-visitor-limit-view-day" class="form-control limit" name="day" data-desc="в сутки" value="<?= $campaign_visitor_limit['view']['day'] ?>" /> показов в сутки <br />
<input type="number" min="0" id="campaign-visitor-limit-view-week" class="form-control limit" name="week" data-desc="в неделю" value="<?= $campaign_visitor_limit['view']['week'] ?>" /> показов в неделю <br />
<input type="number" min="0" id="campaign-visitor-limit-view-month" class="form-control limit" name="month" data-desc="в месяц" value="<?= $campaign_visitor_limit['view']['month'] ?>" /> показов в месяц
</div>
<div class="campaign-visitor-limit click" data-name="click">
<input type="number" min="0" id="campaign-visitor-limit-click-page" class="form-control limit" name="page" data-desc="на странице" value="<?= $campaign_visitor_limit['click']['page'] ?>" /> кликов на странице <br />
<input type="number" min="0" id="campaign-visitor-limit-click-hour" class="form-control limit" name="hour" data-desc="в час" value="<?= $campaign_visitor_limit['click']['hour'] ?>" /> кликов в час <br />
<input type="number" min="0" id="campaign-visitor-limit-click-day" class="form-control limit" name="day" data-desc="в сутки" value="<?= $campaign_visitor_limit['click']['day'] ?>" /> кликов в сутки <br />
<input type="number" min="0" id="campaign-visitor-limit-click-week" class="form-control limit" name="week" data-desc="в неделю" value="<?= $campaign_visitor_limit['click']['week'] ?>" /> кликов в неделю <br />
<input type="number" min="0" id="campaign-visitor-limit-click-month" class="form-control limit" name="month" data-desc="в месяц" value="<?= $campaign_visitor_limit['click']['month'] ?>" /> кликов в месяц
</div>
</div>
<div class="b-clear"></div>
</div>
<!-- Бюджет -->
<div class="form-group campaign-money-limit" data-type="money-limit">
<label class="title-field"><?= _t('Бюджет')?></label>
<br />
<div class="value-show"></div>
<div class="value-edit">
<div class="campaign-money-limit-values">
<input id="campaign-money-limit-total" class="form-control limit" name="total" data-desc="всего" value="<?= $campaign_money_limit['total'] ?>" pattern="<?= $regexp_money ?>" /> грн. всего <br />
<input id="campaign-money-limit-day" class="form-control limit" name="day" data-desc="в сутки" value="<?= $campaign_money_limit['day'] ?>" pattern="<?= $regexp_money ?>" /> грн. в сутки <br />
<input id="campaign-money-limit-week" class="form-control limit" name="week" data-desc="в неделю" value="<?= $campaign_money_limit['week'] ?>" pattern="<?= $regexp_money ?>" /> грн. в неделю <br />
<input id="campaign-money-limit-month" class="form-control limit" name="month" data-desc="в месяц" value="<?= $campaign_money_limit['month'] ?>" pattern="<?= $regexp_money ?>" /> грн. в месяц
</div>
</div>
</div>
</div>
<div class="b-right">
<!-- Скорость открута -->
<div class="form-group">
<label class="title-field"><?= _t('Скорость открута')?></label>
<input type="radio" id="campaign-max-speed-true" name="max_speed" value="1" <?php if ($campaign_max_speed): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-max-speed-true">Максимальная</label>
<input type="radio" id="campaign-max-speed-false" name="max_speed" value="0" <?php if (!$campaign_max_speed): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-max-speed-false">Равномерная</label>
</div>
<!-- Гео -->
<div class="form-group geo" data-type="geo">
<label class="title-field"><?= _t('Гео (таргетинг)')?></label>
<div class="value-show"></div>
<div class="value-edit">
<div class="targeting_geo">
<!-- country -->
<div class="geo_country">
Страна:
<select class="form-control" id="targeting_geo_country" name="targeting_geo_country" disabled>
<?php foreach($countries as $code=>$title): ?>
<option value="<?= $code ?>" <?php if ($campaign_geo['country']['values'] && in_array($code, $campaign_geo['country']['values'])): ?>selected<?php endif; ?>><?= _t($title) ?></option>
<?php endforeach ?>
</select>
<span class="b-exclude">
<input type="checkbox" id="country-exclude" name="country-exclude" <?php if ($campaign_geo['special']['exclude'] || !$campaign_geo): ?>checked<?php endif; ?>>
<label for="country-exclude"><?= _t('исключить неподконтрольные территории')?></label>
</span>
</div>
<div class="geo_region-city">
<!-- region -->
<div class="geo_region-wrap">
<div class="geo_region">
<div class="form-group">
<label for="region-list"><?= _t('Области')?></label>
<div class="b-exclude">
<input type="checkbox" id="region-exclude" name="region-exclude" <?php if ((bool)$campaign_geo['region']['exclude']): ?>checked<?php endif; ?>>
<label for="region-exclude"><?= _t('исключить')?></label>
</div>
<div>
<div class="filters-select">
<div class="region-val-geo">
<input type="text" class="form-control filter" id="region-filter" name="region-filter" value="" placeholder="фильтр">
</div>
<div class="list-filters-wrap">
<ul class="list-filter">
<?php foreach($regions as $id=>$data): ?>
<li>
<input type="checkbox" id="region-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $data['name'] ?>" <?php if ($campaign_geo['region']['values'] && in_array($id, $campaign_geo['region']['values'])): ?>checked<?php endif; ?>>
<label for="region-id-<?= $id ?>"><?= $data['name'] ?></label>
</li>
<?php endforeach ?>
</ul>
</div>
</div>
<div class="filters-values">
<ul class="values-string-list">
<?php if($campaign_geo['region']['values']): ?>
<?php foreach($campaign_geo['region']['values'] as $id): ?>
<li>
<input type="checkbox" checked id="l-region-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $regions[$id]['name'] ?>">
<label for="l-region-id-<?= $id ?>"><?= $regions[$id]['name'] ?></label>
</li>
<?php endforeach ?>
<?php endif; ?>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- city -->
<div class="geo_city-wrap">
<div class="geo_city">
<div class="form-group">
<label for="city-list"><?= _t('Города')?></label>
<div class="b-exclude">
<input type="checkbox" id="city-exclude" name="city-exclude" <?php if ((bool)$campaign_geo['city']['exclude']): ?>checked<?php endif; ?>>
<label for="city-exclude"><?= _t('исключить')?></label>
</div>
<div>
<div class="filters-select">
<input type="text" class="form-control filter" id="city-filter" name="city-filter" value="" placeholder="фильтр">
<div class="list-filters-wrap">
<ul class="list-filter">
<?php foreach($cities as $id=>$data): ?>
<li>
<input type="checkbox" id="city-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $data['name'] ?>" <?php if ($campaign_geo['city']['values'] && in_array($id, $campaign_geo['city']['values'])): ?>checked<?php endif; ?>>
<label for="city-id-<?= $id ?>"><?= $data['name'] ?></label>
</li>
<?php endforeach ?>
</ul>
</div>
</div>
<div class="filters-values">
<ul class="values-string-list">
<?php if($campaign_geo['city']['values']): ?>
<?php foreach($campaign_geo['city']['values'] as $id): ?>
<li>
<input type="checkbox" checked id="l-city-id-<?= $id ?>" data-id="<?= $id ?>" data-text="<?= $cities[$id]['name'] ?>">
<label for="l-region-id-<?= $id ?>"><?= $cities[$id]['name'] ?></label>
</li>
<?php endforeach ?>
<?php endif; ?>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="b-clear"></div>
<!-- Трекинг действий -->
<div class="form-group tracking-action" data-type="tracking-action" >
<input type="checkbox" id="group-tracking-action" name="group-tracking-action" <?php if ($campaign_tracking_action): ?>checked<?php endif; ?>>
<label class="title-field" for="group-active">Трекинг действий</label>
<div class="tracking-action_content">
<div class="tracking-action_link">
http://order.azbne.net/b/order?&campaign_id={CAMPAIGN_ID}&click_id={CLICK_ID}&order_sum={ORDER_SUM}&order_id={ORDER_ID}
</div>
<!-- Цена действия по-умолчанию -->
<div class="form-group order-sum" data-type="order-sum">
<label for="group-order-sum"><?= _t('Цена действия по-умолчанию')?></label>
<input id="campaign-order-sum" class="form-control order-sum" name="order_sum" value="<?= ($campaign_order_sum) ? : 1 ?>" pattern="<?= $regexp_money ?>" />
грн.
</div>
</div>
</div>
</fieldset>
</form>
<?php if($campaigns): ?>
<div class="group-campaigns">
<label><?= _t('Кампании')?></label>
<div class="table-filters">
Статус кампании:
<select class="form-control campaign-status">
<option value="all"><?= _t('все') ?></option>
<option value="active"><?= _t('активные') ?></option>
<option value="not-active"><?= _t('не активные') ?></option>
<option value="archive"><?= _t('в архиве') ?></option>
<option value="not-archive"><?= _t('не в архиве') ?></option>
</select>
</div>
<table class="table table-striped campaigns" data-content="campaigns" data-action="/amsystem/campaigns/id/edit/">
<thead>
<tr>
<th class="stat"></th>
<th class="stat">#ID</th>
<th>Название кампании</th>
<th class="stat">Срок действия</th>
<?php foreach ($stat_cats as $cat_name => $cat) : ?>
<th class="stat"><span class="sort" data-sort="<?= $cat_name ?>" data-sortasc="1"><?= $cat['title'] ?></span></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($campaigns as $campaign) : ?>
<?php
$tr_class = '';
if (!$campaign['active']) {
$tr_class.= 'not-active disabled ';
} else {
$tr_class.= 'active ';
}
if ($campaign['archive']) {
$tr_class.= 'archive ';
} else {
$tr_class.= 'not-archive ';
}
?>
<tr class="<?= $tr_class ?>">
<?php
$campaign_id = $campaign['id'];
$stat = $campaigns_stat[$campaign_id];
$target_class = ($campaign['target_action'] == 'load') ? 'load-target' : '';
?>
<td>
<input class="is-active" type="checkbox" data-id="<?= $campaign_id ?>" <?php if ($campaign['active']): ?>checked<?php endif; ?>>
</td>
<td>
<span class="item-id"><?= $campaign_id ?></span>
</td>
<td>
<?php
$btn_link = $this->url('user.cabinet.campaign', [
'lang' => $this->lang,
'id' => $campaign_id,
]);
?>
<span class="item-title"><a href="<?= $btn_link?>"><?= $campaign['title'] ?></a></span>
</td>
<?php
$begin = ($campaign['date_begin']) ? date('d-m-Y', strtotime($campaign['date_begin'])) : '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
$end = ($campaign['date_end']) ? date('d-m-Y', strtotime($campaign['date_end'])) : '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
$today = date('Y-m-d');
$date_begin_class = '';
$date_end_class = '';
if ($campaign['date_begin'] && $today < $campaign['date_begin']) {
$date_begin_class = 'not-active';
}
if ($campaign['date_end'] && $today > $campaign['date_end']) {
$date_end_class = 'not-active';
}
?>
<td class="stat date">
<span class="<?= $date_begin_class ?>"><?= $begin ?></span> &ndash; <span class="<?= $date_end_class ?>"><?= $end ?></span>
</td>
<?php foreach ($stat_cats as $cat => $cat_data) : ?>
<?php
$target_class_item = (in_array($cat, ['views', 'reach'])) ? $target_class : '';
?>
<td class="stat <?= $target_class_item ?>" data-cat="<?= $cat ?>" data-value="<?= $stat[$cat] ?>"><?= formatField($stat[$cat], $cat) ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</div>
<!-- Общая статистика -->
<div class="form-group-data stat-common" data-type="stat-common">
<div class="b-content__loading"></div>
<div class="campaign-stat">
<textarea id="campaign-stat"><?= ($group_stat ? json_encode($group_stat) : '')?></textarea>
<textarea id="campaign-stat-total"><?= ($group_stat_total ? json_encode($group_stat_total) : '')?></textarea>
<textarea id="campaign-stat-cats"><?= ($stat_cats ? json_encode($stat_cats) : '')?></textarea>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin-common" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $group_date_begin ?>" autocomplete="off" />
по:
<input type='text' id="campaign-date-end-common" class="campaign-date-end form-control date-value" name="date_end" value="<?= $group_date_end ?>" autocomplete="off" />
</div>
<div class="chart-graph-stat-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="chart-graph-stat-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<!-- График -->
<div id="chart-graph-stat" data-colors=<?= ($colors_active_lines ? json_encode($colors_active_lines) : '')?>></div>
<!-- Таблица -->
<div id="table-stat" class="b-table_wrapp">
<table id="table-line-common" class="table table-striped common-stat sortable" data-type="common-stat">
<thead>
<tr>
<th class="period" data-id="period">
<b class="sort" id="period">Дата</b>
</th>
<?php foreach($stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<span style="border-color: <?= $cat['color'] ?>;">
<input type="checkbox" data-field="<?= $name ?>" checked />
</span>
<b class="sort" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<!-- По сайтам -->
<div class="form-group-data stat-sites" data-type="stat-sites">
<div class="b-content__loading"></div>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin-sites" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $group_date_begin ?>" autocomplete="off" />
по:
<input type='text' id="campaign-date-end-sites" class="campaign-date-end form-control date-value" name="date_end" value="<?= $group_date_end ?>" autocomplete="off" />
</div>
<div class="sites-stats">
<textarea id="campaign-sites-stat"><?= ($sites_stats ? json_encode($sites_stats) : '')?></textarea>
<div class="sites-stats-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="sites-stats-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<div class="b-table_wrapp">
<table id="table-line-sites" class="table table-striped table-by-cats sortable" data-type="sites-stat">
<thead>
<tr>
<th class="period" data-id="period">
<b>Сайт</b>
</th>
<?php foreach($stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<b class="sort" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<!-- По регионам -->
<div class="form-group-data stat-regions" data-type="stat-regions">
<div class="b-content__loading"></div>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin-regions" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $group_date_begin ?>" autocomplete="off" />
по:
<input type='text' id="campaign-date-end-regions" class="campaign-date-end form-control date-value" name="date_end" value="<?= $group_date_end ?>" autocomplete="off" />
</div>
<div class="regions-stats">
<textarea id="campaign-regions-stat"><?= ($regions_stats ? json_encode($regions_stats) : '')?></textarea>
<textarea id="regions-codes"><?= ($code_regions ? json_encode($code_regions) : '')?></textarea>
<textarea id="cities-codes"><?= ($code_cities ? json_encode($code_cities) : '')?></textarea>
<div class="regions-stats-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="regions-stats-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<div class="b-table_wrapp">
<table id="table-line-regions" class="table table-striped table-by-cats sortable" data-type="regions-stat">
<thead>
<tr>
<th class="period" data-id="period">
<b>Регион</b>
</th>
<?php foreach($stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<b class="sort" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</section>
<?php endif; ?>
\ No newline at end of file
<?php
/**
* Copyright (c) 2016 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*
*/
/** @var $this \Zend\View\Renderer\PhpRenderer */
$this->headScript()
->appendFile('/js/jquery.cookie.js')
->appendFile('/js/adm/amsystem-table-sort.js')
->appendFile('/js/adm/amsystem-table-filter.js')
->appendFile('/js/adm/amsystem.js')
;
$this->headLink()
->appendStylesheet('/css/styles-amsystem.css')
;
$lang = $this->lang;
$groups = $this->groups;
$campaigns = $this->campaigns;
$groups_campaigns = $this->groups_campaigns;
$stat_cats = $this->stat_cats;
$error = $this->error;
?>
<?= $this->partial('app::user/amsystem/_format'); ?>
<?php if($error): ?>
<section class="b-content__work error">
<div class="wrapp">
<h1><?= $error?></h1>
</div>
</section>
<?php else: ?>
<section class="b-content__work">
<div class="panel panel-info">
<div class="panel-heading">
<h1><?= _t('Кампании') ?></h1>
</div>
<div class="panel-body all">
<div class="users-groups">
<div class="table-filters">
Статус кампании:
<select class="form-control campaign-status">
<option value="all"><?= _t('все') ?></option>
<option value="active"><?= _t('активные') ?></option>
<option value="not-active"><?= _t('не активные') ?></option>
<option value="archive"><?= _t('в архиве') ?></option>
<option value="not-archive"><?= _t('не в архиве') ?></option>
</select>
</div>
<table class="table groups" data-content="groups">
<thead>
<tr>
<th>Название кампании</th>
<th class="stat">Срок действия</th>
<?php foreach ($stat_cats as $cat_name => $cat) : ?>
<th class="stat"><span class="sort" data-sort="<?= $cat_name ?>" data-sortasc="1"><?= $cat['title'] ?></span></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($groups as $group) : ?>
<?php
$group_id = $group['id'];
$stat = $groups_stat[$group_id];
$target_class = ($group['target_action'] == 'load') ? 'load-target' : '';
?>
<tr class="group-item <?php if (!$group['active']): ?>disabled<?php endif; ?>" data-id="<?= $group_id ?>">
<td>
<?php
$btn_link = $this->url('user.cabinet.group', [
'lang' => $this->lang,
'id' => $group_id,
]);
?>
<span class="group"><b class="closed">+</b><b class="open">&ndash;</b></span>
<input class="is-active" type="checkbox" data-id="<?= $group_id ?>" <?php if ($group['active']): ?>checked<?php endif; ?>>
<span class="item-title"><a href="<?= $btn_link?>"><?= $group['title'] ?></a></span>
</td>
<td></td>
<?php foreach ($stat_cats as $cat => $cat_data) : ?>
<?php
$target_class_item = (in_array($cat, ['views', 'reach'])) ? $target_class : '';
?>
<td class="stat <?= $target_class_item ?>" data-cat="<?= $cat ?>" data-value="<?= $stat[$cat] ?>"><?= formatField($stat[$cat], $cat) ?></td>
<?php endforeach; ?>
</tr>
<?php if($groups_campaigns[$group_id]): ?>
<?php foreach ($groups_campaigns[$group_id] as $campaign) : ?>
<?php
$tr_class = '';
if (!$campaign['active']) {
$tr_class.= 'disabled ';
}
if (!$group['active']) {
$tr_class.= 'disabled-group ';
}
if (!$campaign['active']) {
$tr_class.= 'not-active ';
} else {
$tr_class.= 'active ';
}
if ($campaign['archive']) {
$tr_class.= 'archive ';
} else {
$tr_class.= 'not-archive ';
}
?>
<tr class="campaign-item <?= $tr_class ?>" data-parent="<?= $group_id ?>">
<?php
$campaign_id = $campaign['id'];
$stat = $campaigns_stat[$campaign_id];
$target_class = ($campaign['target_action'] == 'load') ? 'load-target' : '';
?>
<td class="campaign-item-title">
<?php
$btn_link = $this->url('user.cabinet.campaign', [
'lang' => $this->lang,
'id' => $campaign_id,
]);
?>
<input class="is-active" type="checkbox" data-id="<?= $campaign_id ?>" <?php if ($campaign['active']): ?>checked<?php endif; ?>>
<span><a href="<?= $btn_link?>"><?= $campaign['title'] ?></a></span>
</td>
<?php
$begin = ($campaign['date_begin']) ? date('d-m-Y', strtotime($campaign['date_begin'])) : '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
$end = ($campaign['date_end']) ? date('d-m-Y', strtotime($campaign['date_end'])) : '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
$today = date('Y-m-d');
$date_begin_class = '';
$date_end_class = '';
if ($campaign['date_begin'] && $today < $campaign['date_begin']) {
$date_begin_class = 'not-active';
}
if ($campaign['date_end'] && $today > $campaign['date_end']) {
$date_end_class = 'not-active';
}
?>
<td class="stat date">
<span class="<?= $date_begin_class ?>"><?= $begin ?></span> &ndash; <span class="<?= $date_end_class ?>"><?= $end ?></span>
</td>
<?php foreach ($stat_cats as $cat => $cat_data) : ?>
<?php
$target_class_item = (in_array($cat, ['views', 'reach'])) ? $target_class : '';
?>
<td class="stat <?= $target_class_item ?>" data-cat="<?= $cat ?>" data-value="<?= $stat[$cat] ?>"><?= formatField($stat[$cat], $cat) ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<div class="panel-footer">
</div>
</div>
</section>
<?php endif; ?>
\ No newline at end of file
<?php
/**
* Copyright (c) 2016 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*
*/
/** @var $this \Zend\View\Renderer\PhpRenderer */
$this->headScript()
->appendFile('/js/c3.min.js')
->appendFile('/js/d3.min.js')
->appendFile('/js/datepicker.min.js')
->appendFile('/js/adm/amsystem-campaign.js')
;
$this->headLink()
->appendStylesheet('/css/c3.css')
->appendStylesheet('/css/datepicker.min.css')
->appendStylesheet('/css/styles-amsystem.css')
;
$lang = $this->lang;
$campaign = $this->campaign;
$countries = $this->countries;
$regions = $this->regions;
$cities = $this->cities;
$error = $this->error;
if (!$error) {
$campaign_active = (bool)$campaign->getActive();
$campaign_id = $campaign->getId();
$campaign_title = $campaign->getTitle();
$campaign_url = $campaign->getUrl();
$campaign_date_begin = $campaign->getDateBegin();
$campaign_date_end = $campaign->getDateEnd();
$campaign_url = $campaign->getUrl();
$campaign_buy_type = $campaign->getBuyType();
$campaign_target_action = $campaign->getTargetAction();
$campaign_price = $campaign->getPrice()/10;
$campaign_visitor_limit = json_decode($campaign->getVisitorLimit(), true);
$campaign_money_limit = json_decode($campaign->getMoneyLimit(), true);
$campaign_max_speed = (bool)$campaign->getMaxSpeed();
$campaign_tracking_pixels = json_decode($campaign->getTrackingPixels(), true);
$campaign_geo = json_decode($campaign->getTargeting(), true)['geo'];
$banners = $this->banners;
$banners_stats = $this->banners_stats;
$img_domain = $this->img_domain;
$sites_stats = $this->sites_stats;
$regions_stats = $this->regions_stats;
$campaign_stat = $this->campaign_stat;
$campaign_stat_total = $this->campaign_stat_total;
$campaign_stat_cats = $this->campaign_stat_cats;
$code_regions = [];
foreach ($regions as $region_item) {
foreach ($region_item['codes'] as $code) {
$code_regions[$code] = str_replace(' область', '', $region_item['name']);
}
}
$code_cities = [];
foreach ($cities as $city_item) {
foreach ($city_item['codes'] as $code) {
$code_cities[$code] = str_replace(' область', '', $city_item['name']);
}
}
$target_class = ($campaign_target_action == 'load') ? 'load-target' : '';
$link_campaigns_list = $this->url('user.cabinet.amsystem', ['lang' => $lang]);
$data_request_link = $this->url('user.cabinet.campaign', ['lang' => $lang]);
}
?>
<?= $this->partial('app::user/_format'); ?>
<?php if($error): ?>
<section class="b-content__work error">
<div class="wrapp">
<h1><?= $error?></h1>
</div>
</section>
<?php else: ?>
<section class="b-content__work inner">
<form id="campaign-create-form" method="post" action="<?= $data_request_link ?>">
<div class="panel panel-info">
<!-- Header -->
<div class="panel-heading">
<h1>
<a href="<?=$link_campaigns_list ?>">Кампании</a>/<?= $campaign_title ?>
</h1>
</div>
<div class="panel-body">
<div class="switch-data">
<span class="switch-item" data-type="settings">Настройки кампании</span>
<span class="switch-item" data-type="stat-common">Общая статистика</span>
<span class="switch-item" data-type="stat-sites">По сайтам</span>
<span class="switch-item" data-type="stat-regions">По регионам</span>
</div>
<!-- Настройки кампании -->
<div class="form-group-data settings" data-type="settings">
<fieldset disabled="disabled">
<!-- Статус кампании -->
<div class="form-group active <?php if ($campaign_active): ?>enabled<?php endif; ?>">
<label class="campaign-active">Статус:</label><span><?php if ($campaign_active): ?>активна<?php else: ?>остановлена<?php endif; ?></span>
</div>
<!-- Даты проведения -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Даты проведения')?></label>
c:
<input type='text' id="campaign-date-begin" class="form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" />
по:
<input type='text' id="campaign-date-end" class="form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" />
</div>
<!-- Ссылка -->
<div class="form-group url">
<label for="campaign-url"><?= _t('Ссылка')?></label>
<div class="value-show">
<?= $campaign_url ?>
</div>
</div>
<div class="b-left">
<!-- Тип кампании -->
<div class="form-group">
<label><?= _t('Тип кампании')?></label>
<input type="radio" id="campaign-buy-type-auction" name="buy_type" value="auction" <?php if ($campaign_buy_type == 'auction'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-buy-type-auction">Аукцион</label>
<input type="radio" id="campaign-buy-type-garantee" name="buy_type" value="garantee" <?php if ($campaign_buy_type == 'garantee'): ?>checked<?php endif; ?> disabled>
<label class="select-item disabled" for="campaign-buy-type-garantee">Гарантия</label>
</div>
<!-- Целевое действие -->
<div class="form-group">
<label><?= _t('Целевое действие')?></label>
<input type="radio" id="campaign-view-load" name="target_action" value="load" <?php if ($campaign_target_action == 'load'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-load">Показ</label>
<input type="radio" id="campaign-view-view" name="target_action" value="view" <?php if ($campaign_target_action == 'view'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-view">Реальный показ</label>
<input type="radio" id="campaign-view-click" name="target_action" value="click" <?php if ($campaign_target_action == 'click'): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-view-click">Клик</label>
</div>
<!-- Стоимость -->
<div class="form-group">
<?php
switch ($campaign_target_action) {
case 'load': $title_mark = '1000 показов'; break;
case 'view': $title_mark = '1000 реальных показов'; break;
case 'click': $title_mark = 'клик'; break;
}
?>
<label for="campaign-price"><?= _t('Стоимость')?></label>
<input type="number" min="0" step="0.1" id="campaign-price" class="form-control price" name="price" value="<?= $campaign_price ?>" />
грн. за <span class="price-title-mark"><?= $title_mark ?></span>
</div>
<!-- Ограничения на посетителя -->
<div class="form-group campaign-visitor-limit__wrap">
<label><?= _t('Ограничения на посетителя')?></label><br />
<div class="value-show">
<?php
function declOfNum($number, $titles)
{
$cases = array (2, 0, 1, 1, 1, 2);
$format = $titles[ ($number%100 > 4 && $number %100 < 20) ? 2 : $cases[min($number%10, 5)] ];
return sprintf($format, $number);
}
foreach ($campaign_visitor_limit as $action => $data) {
if ($action == 'view') $titles = ['показ', 'показа', 'показов'];
if ($action == 'click') $titles = ['клик', 'клика', 'кликов'];
foreach ($data as $period => $value) {
switch ($period) {
case 'page': $title_mark = 'на странице'; break;
case 'hour': $title_mark = 'в час'; break;
case 'day': $title_mark = 'в сутки'; break;
case 'week': $title_mark = 'в неделю'; break;
case 'month': $title_mark = 'в месяц'; break;
}
if ($value) {
?>
<span><b><?= $value ?></b> <i><?= declOfNum($value, $titles) ?></i> <?= $title_mark ?></span><br />
<?php
} } }
?>
</div>
</div>
<!-- Бюджет -->
<div class="form-group campaign-money-limit">
<label><?= _t('Бюджет')?></label><br />
<div class="value-show">
<?php
foreach ($campaign_money_limit as $period => $value) {
switch ($period) {
case 'total': $title_mark = 'грн. всего'; break;
case 'day': $title_mark = 'грн. в сутки'; break;
case 'week': $title_mark = 'грн. в неделю'; break;
case 'month': $title_mark = 'грн. в месяц'; break;
}
if ($value) {
?>
<span><b><?= $value ?></b> <?= $title_mark ?></span><br />
<?php
} }
?>
</div>
</div>
<!-- Скорость открута -->
<div class="form-group">
<label><?= _t('Скорость открута')?></label>
<input type="radio" id="campaign-max-speed-true" name="max_speed" value="1" <?php if ($campaign_max_speed): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-max-speed-true">Максимальная</label>
<input type="radio" id="campaign-max-speed-false" name="max_speed" value="0" <?php if (!$campaign_max_speed): ?>checked<?php endif; ?>>
<label class="select-item" for="campaign-max-speed-false">Равномерная</label>
</div>
<!-- Гео -->
<div class="form-group geo">
<?php if ($campaign_geo): ?>
<label><?= _t('Гео (таргетинг)')?></label>
<div class="value-show">
<?php if ($campaign_geo['country']): ?>
<?php
$title_values = $countries[$campaign_geo['country']['values'][0]];
if ($campaign_geo['special']) {
$title_special = '<b>(исключить неподконтрольные территории)</b>';
}
?>
<span><?= 'Страна' ?>: <b><?= $title_values ?></b> <?= $title_special ?></span><br />
<?php endif; ?>
<?php if ($campaign_geo['region']['values']): ?>
<?php
$title_mark = ($campaign_geo['region']['exclude']) ? 'кроме': 'только';
$title_values = [];
foreach ($campaign_geo['region']['values'] as $code) {
$title_values[] = str_replace(' область', '', $regions[$code]['name']);
}
$title_values = implode(", ", $title_values);
?>
<span><?= 'Области' ?> <i><?= $title_mark ?></i>: <b><?= $title_values ?></b></span><br />
<?php endif; ?>
<?php if ($campaign_geo['city']['values']): ?>
<?php
$title_mark = ($campaign_geo['city']['exclude']) ? 'кроме': 'только';
$title_values = [];
foreach ($campaign_geo['city']['values'] as $code) {
$title_values[] = $cities[$code]['name'];
}
$title_values = implode(", ", $title_values);
?>
<span><?= 'Города' ?> <i><?= $title_mark ?></i>: <b><?= $title_values ?></b></span><br />
<?php endif; ?>
</div>
<?php endif; ?>
</div>
<!-- Трекинг -->
<div class="form-group tracking_pixels">
<?php if ($campaign_tracking_pixels): ?>
<label><?= _t('Трекинг')?></label>
<div class="value-show">
<?php
foreach ($campaign_tracking_pixels as $item => $values) {
switch ($item) {
case 'load': $title_mark = 'Показ'; break;
case 'view': $title_mark = 'Реальный показ'; break;
case 'click': $title_mark = 'Клик'; break;
}
if ($values) {
?>
<div><?= $title_mark ?></div>
<?php
foreach ($values as $value_item) {
?>
<div class="url"><?= $value_item ?></div>
<?php
} } }
?>
</div>
<?php endif; ?>
</div>
</div>
<div class="b-right">
<!-- Баннеры -->
<div class="form-group banners">
<label><?= _t('Баннеры')?></label>
<div>
<table class="table table-striped campaign-banners">
<thead>
<tr>
<th></th>
<th><span class="sort">Размер</span></th>
<th><span class="sort">Превью</span></th>
<th><span class="sort">Показы</span></th>
<th><span class="sort">Клики</span></th>
<th><span class="sort">CTR</span></th>
<th><span class="sort">eCPM</span></th>
<th><span class="sort">eCPC</span></th>
<th><span class="sort">Расход</span></th>
<th><span class="sort">Заказы</span></th>
<th><span class="sort">Доход</span></th>
</tr>
</thead>
<tbody>
<?php if($banners): ?>
<?php foreach($banners as $banner): ?>
<?php $stat = $banners_stats[$banner['id']]; ?>
<tr data-id="<?= $banner['id'] ?>">
<td class="check"><input type="checkbox" <?php if ((bool)$banner['active']): ?>checked<?php endif; ?>></td>
<td class="stat"><span class="banner-size"><?= $banner['width'] ?>x<?= $banner['height'] ?></span></td>
<td class="stat"><span class="banner-preview" src="<?= $img_domain ?><?= $banner['img'] ?>" style="background-image: url(<?= $img_domain ?><?= $banner['img'] ?>)"></span></td>
<td class="stat <?= $target_class ?>"><?= $stat['views'] ?></td>
<td class="stat"><?= $stat['clicks'] ?></td>
<td class="stat"><?= $stat['ctr'] ?></td>
<td class="stat"><?= $stat['cpm'] ?> &#8372;</td>
<td class="stat"><?= $stat['cpc'] ?> &#8372;</td>
<td class="stat <?= $target_class ?>"><?= formatMoney($stat['money']) ?></td>
<td class="stat"><?= $stat['order_cnt'] ?></td>
<td class="stat"><?= formatMoney($stat['order_money']) ?></td>
</tr>
<?php endforeach ?>
<?php endif ?>
</tbody>
</table>
</div>
</div>
</div>
</fieldset>
</div>
<!-- Общая статистика -->
<div class="form-group-data stat-common" data-type="stat-common">
<div class="b-content__loading"></div>
<div class="campaign-stat">
<textarea id="campaign-stat"><?= ($campaign_stat ? json_encode($campaign_stat) : '')?></textarea>
<textarea id="campaign-stat-total"><?= ($campaign_stat_total ? json_encode($campaign_stat_total) : '')?></textarea>
<textarea id="campaign-stat-cats"><?= ($campaign_stat_cats ? json_encode($campaign_stat_cats) : '')?></textarea>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" />
по:
<input type='text' id="campaign-date-end" class="campaign-date-end form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" />
</div>
<div class="chart-graph-stat-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="chart-graph-stat-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<!-- График -->
<div id="chart-graph-stat" data-colors=<?= ($colors_active_lines ? json_encode($colors_active_lines) : '')?>></div>
<!-- Таблица -->
<div id="table-stat" class="b-table_wrapp">
<table id="table-line-common" class="table table-striped common-stat">
<thead class="sortable">
<tr>
<th class="period" data-id="period">
<b class="main-cat selected" data-cat="date">Дата</b>
</th>
<?php foreach($campaign_stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<span style="border-color: <?= $cat['color'] ?>;">
<input type="checkbox" data-field="<?= $name ?>" checked />
</span>
<b class="cat" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<!-- По сайтам -->
<div class="form-group-data stat-sites" data-type="stat-sites">
<div class="b-content__loading"></div>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" />
по:
<input type='text' id="campaign-date-end" class="campaign-date-end form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" />
</div>
<div class="sites-stats">
<textarea id="campaign-sites-stat"><?= ($sites_stats ? json_encode($sites_stats) : '')?></textarea>
<div class="sites-stats-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="sites-stats-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<div class="b-table_wrapp">
<table id="table-line-sites" class="table table-striped table-by-cats">
<thead class="sortable">
<tr>
<th class="period" data-id="period">
<b class="main-cat selected" data-cat="date">Сайт</b>
</th>
<?php foreach($campaign_stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<b class="cat" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<!-- По регионам -->
<div class="form-group-data stat-regions" data-type="stat-regions">
<div class="b-content__loading"></div>
<!-- Дата -->
<div class="form-group">
<label for="campaign-date-begin"><?= _t('Дата')?></label>
c:
<input type='text' id="campaign-date-begin" class="campaign-date-begin form-control date-value" name="date_begin" value="<?= $campaign_date_begin ?>" />
по:
<input type='text' id="campaign-date-end" class="campaign-date-end form-control date-value" name="date_end" value="<?= $campaign_date_end ?>" />
</div>
<div class="regions-stats">
<textarea id="campaign-regions-stat"><?= ($regions_stats ? json_encode($regions_stats) : '')?></textarea>
<textarea id="regions-codes"><?= ($code_regions ? json_encode($code_regions) : '')?></textarea>
<textarea id="cities-codes"><?= ($code_cities ? json_encode($code_cities) : '')?></textarea>
<div class="regions-stats-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="regions-stats-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<div class="b-table_wrapp">
<table id="table-line-regions" class="table table-striped table-by-cats">
<thead class="sortable">
<tr>
<th class="period" data-id="period">
<b class="main-cat selected" data-cat="date">Регион</b>
</th>
<?php foreach($campaign_stat_cats as $name => $cat): ?>
<th class="<?= $name ?>" data-id="<?= $name ?>">
<b class="cat" id="<?= $name ?>"><?= $cat['title'] ?></b>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</form>
</section>
<?php endif; ?>
\ No newline at end of file
<?php
/**
* Copyright (c) 2016 Serhii Borodai <clarifying@gmail.com>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*
*/
/** @var $this \Zend\View\Renderer\PhpRenderer */
$this->headScript()
->appendFile('/js/jquery.cookie.js')
->appendFile('/js/adm/amsystem.js')
;
$this->headLink()
->appendStylesheet('/css/styles-amsystem.css')
;
$lang = $this->lang;
$groups = $this->groups;
$campaigns = $this->campaigns;
$groups_campaigns = $this->groups_campaigns;
$error = $this->error;
?>
<?= $this->partial('app::user/_format'); ?>
<?php if($error): ?>
<section class="b-content__work error">
<div class="wrapp">
<h1><?= $error?></h1>
</div>
</section>
<?php else: ?>
<section class="b-content__work">
<div class="panel panel-info">
<div class="panel-heading">
<h1><?= _t('Список кампаний') ?></h1>
</div>
<div class="panel-body all">
<div class="table-filters">
Статус кампании:
<select class="form-control campaign-status">
<option value="all"><?= _t('все') ?></option>
<option value="active"><?= _t('активные') ?></option>
<option value="not-active"><?= _t('не активные') ?></option>
<option value="archive"><?= _t('в архиве') ?></option>
<option value="not-archive"><?= _t('не в архиве') ?></option>
</select>
</div>
<table class="table campaigns" data-content="campaigns" data-action="/amsystem/campaigns/id/edit/">
<thead>
<tr>
<th>Название кампании</th>
<th class="stat">Срок действия</th>
<th class="stat">Показы</th>
<th class="stat">Клики</th>
<th class="stat">CTR</th>
<th class="stat">Охват</th>
<th class="stat">eCPM</th>
<th class="stat">eCPC</th>
<th class="stat">Расход</th>
<th class="stat">Заказы</th>
<th class="stat">Доход</th>
</tr>
</thead>
<tbody>
<?php foreach ($groups as $group) : ?>
<?php
$group_id = $group['id'];
$stat = null;
$target_class = ($group['target_action'] == 'load') ? 'load-target' : '';
?>
<tr class="group-item <?php if (!$group['active']): ?>disabled<?php endif; ?>" data-id="<?= $group_id ?>">
<td>
<?php
/*
$btn_link = $this->url('user.cabinet.campaign', [
'lang' => $this->lang,
'id' => $campaign_id,
]);*/
?>
<span class="group"><b class="closed">+</b><b class="open">&ndash;</b></span>
<input class="is-active" type="checkbox" data-id="<?= $group_id ?>" <?php if ($group['active']): ?>checked<?php endif; ?> disabled>
<span class="item-title"><?= $group['title'] ?></span>
</td>
<td></td>
<td class="stat <?= $target_class ?>"><?= $stat['views'] ?></td>
<td class="stat"><?= $stat['clicks'] ?></td>
<td class="stat"><?= $stat['ctr'] ?></td>
<td class="stat <?= $target_class ?>"><?= $stat['reach'] ?></td>
<td class="stat"><?= $stat['cpm'] ?></td>
<td class="stat"><?= $stat['cpc'] ?></td>
<td class="stat"><?= $stat['money'] ?></td>
<td class="stat"><?= $stat['order_cnt'] ?></td>
<td class="stat"><?= $stat['order_money'] ?></td>
</tr>
<?php if ($groups_campaigns[$group_id]): ?>
<?php foreach ($groups_campaigns[$group_id] as $campaign) : ?>
<?php
$tr_class = '';
if (!$campaign['active']) {
$tr_class.= 'not-active disabled ';
} else {
$tr_class.= 'active ';
}
if ($campaign['archive']) {
$tr_class.= 'archive ';
} else {
$tr_class.= 'not-archive ';
}
?>
<tr class="campaign-item <?= $tr_class ?>" data-parent="<?= $group_id ?>">
<?php
$campaign_id = $campaign['id'];
$stat = $stats[$campaign_id];
$target_class = ($campaign['target_action'] == 'load') ? 'load-target' : '';
?>
<td class="campaign-item-title">
<?php
$btn_link = $this->url('user.cabinet.campaign', [
'lang' => $this->lang,
'id' => $campaign_id,
]);
?>
<input class="is-active" type="checkbox" data-id="<?= $campaign_id ?>" <?php if ($campaign['active']): ?>checked<?php endif; ?> disabled>
<span class="item-title"><a href="<?= $btn_link?>"><?= $campaign['title'] ?></a></span>
</td>
<?php
$begin = ($campaign['date_begin']) ? date('d-m-Y', strtotime($campaign['date_begin'])) : '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
$end = ($campaign['date_end']) ? date('d-m-Y', strtotime($campaign['date_end'])) : '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
$today = date('Y-m-d');
$date_begin_class = '';
$date_end_class = '';
if ($campaign['date_begin'] && $today < $campaign['date_begin']) {
$date_begin_class = 'not-active';
}
if ($campaign['date_end'] && $today > $campaign['date_end']) {
$date_end_class = 'not-active';
}
?>
<td class="stat date">
<span class="<?= $date_begin_class ?>"><?= $begin ?></span> &ndash; <span class="<?= $date_end_class ?>"><?= $end ?></span>
</td>
<td class="stat <?= $target_class ?>"><?= $stat['views'] ?></td>
<td class="stat"><?= $stat['clicks'] ?></td>
<td class="stat"><?= $stat['ctr'] ?></td>
<td class="stat <?= $target_class ?>"><?= $stat['reach'] ?></td>
<td class="stat"><?= $stat['cpm'] ?> &#8372;</td>
<td class="stat"><?= $stat['cpc'] ?> &#8372;</td>
<td class="stat"><?= formatMoney($stat['money']) ?></td>
<td class="stat"><?= $stat['order_cnt'] ?></td>
<td class="stat"><?= formatMoney($stat['order_money']) ?></td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="panel-footer">
</div>
</div>
</section>
<?php endif; ?>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment