Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
A
addcpm-json
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Александр Чаплыгин
addcpm-json
Commits
8635c101
Commit
8635c101
authored
Nov 15, 2018
by
Александр Чаплыгин
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Обработка ajax- запроса для данных feed-статистики, обработка post-action
parent
b6363793
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
274 additions
and
602 deletions
+274
-602
countries.global.php
src/config/autoload/countries.global.php
+0
-261
offers.global.php
src/config/autoload/offers.global.php
+0
-26
reports.global.php
src/config/autoload/reports.global.php
+0
-116
routes.global.php
src/config/autoload/routes.global.php
+2
-2
sites.global.php
src/config/autoload/sites.global.php
+0
-45
users-segment.global.php
src/config/autoload/users-segment.global.php
+0
-10
styles-feeds-stat.css
src/public/css/styles-feeds-stat.css
+12
-1
script-feeds-stat-charts.js
src/public/js/script-feeds-stat-charts.js
+0
-6
script-feeds-stat.js
src/public/js/script-feeds-stat.js
+54
-4
Cabinet.php
src/src/App/Action/User/Cabinet.php
+197
-126
Transactions.php
src/src/App/Model/Feeds/Transactions.php
+2
-2
cabinet-feed.phtml
src/templates/app/user/cabinet-feed.phtml
+7
-3
No files found.
src/config/autoload/countries.global.php
deleted
100644 → 0
View file @
b6363793
<?php
return
[
'country_codes'
=>
[
'AC'
=>
'о-в Вознесения'
,
'AD'
=>
'Андорра'
,
'AE'
=>
'ОАЭ'
,
'AF'
=>
'Афганистан'
,
'AG'
=>
'Антигуа и Барбуда'
,
'AI'
=>
'Ангилья'
,
'AL'
=>
'Албания'
,
'AM'
=>
'Армения'
,
'AO'
=>
'Ангола'
,
'AQ'
=>
'Антарктида'
,
'AR'
=>
'Аргентина'
,
'AS'
=>
'Американское Самоа'
,
'AT'
=>
'Австрия'
,
'AU'
=>
'Австралия'
,
'AW'
=>
'Аруба'
,
'AX'
=>
'Аландские о-ва'
,
'AZ'
=>
'Азербайджан'
,
'BA'
=>
'Босния и Герцеговина'
,
'BB'
=>
'Барбадос'
,
'BD'
=>
'Бангладеш'
,
'BE'
=>
'Бельгия'
,
'BF'
=>
'Буркина-Фасо'
,
'BG'
=>
'Болгария'
,
'BH'
=>
'Бахрейн'
,
'BI'
=>
'Бурунди'
,
'BJ'
=>
'Бенин'
,
'BL'
=>
'Сен-Бартелеми'
,
'BM'
=>
'Бермуды'
,
'BN'
=>
'Бруней-Даруссалам'
,
'BO'
=>
'Боливия'
,
'BQ'
=>
'Бонэйр, Синт-Эстатиус и Саба'
,
'BR'
=>
'Бразилия'
,
'BS'
=>
'Багамы'
,
'BT'
=>
'Бутан'
,
'BW'
=>
'Ботсвана'
,
'BY'
=>
'Беларусь'
,
'BZ'
=>
'Белиз'
,
'CA'
=>
'Канада'
,
'CC'
=>
'Кокосовые о-ва'
,
'CD'
=>
'Конго - Киншаса'
,
'CF'
=>
'ЦАР'
,
'CG'
=>
'Конго - Браззавиль'
,
'CH'
=>
'Швейцария'
,
'CI'
=>
'Кот-д’Ивуар'
,
'CK'
=>
'Острова Кука'
,
'CL'
=>
'Чили'
,
'CM'
=>
'Камерун'
,
'CN'
=>
'Китай'
,
'CO'
=>
'Колумбия'
,
'CR'
=>
'Коста-Рика'
,
'CU'
=>
'Куба'
,
'CV'
=>
'Кабо-Верде'
,
'CW'
=>
'Кюрасао'
,
'CX'
=>
'о-в Рождества'
,
'CY'
=>
'Кипр'
,
'CZ'
=>
'Чехия'
,
'DE'
=>
'Германия'
,
'DG'
=>
'Диего-Гарсия'
,
'DJ'
=>
'Джибути'
,
'DK'
=>
'Дания'
,
'DM'
=>
'Доминика'
,
'DO'
=>
'Доминиканская Республика'
,
'DZ'
=>
'Алжир'
,
'EA'
=>
'Сеута и Мелилья'
,
'EC'
=>
'Эквадор'
,
'EE'
=>
'Эстония'
,
'EG'
=>
'Египет'
,
'EH'
=>
'Западная Сахара'
,
'ER'
=>
'Эритрея'
,
'ES'
=>
'Испания'
,
'ET'
=>
'Эфиопия'
,
'EU'
=>
'Европа'
,
'FI'
=>
'Финляндия'
,
'FJ'
=>
'Фиджи'
,
'FK'
=>
'Фолклендские о-ва'
,
'FM'
=>
'Федеративные Штаты Микронезии'
,
'FO'
=>
'Фарерские о-ва'
,
'FR'
=>
'Франция'
,
'GA'
=>
'Габон'
,
'GB'
=>
'Великобритания'
,
'GD'
=>
'Гренада'
,
'GE'
=>
'Грузия'
,
'GF'
=>
'Французская Гвиана'
,
'GG'
=>
'Гернси'
,
'GH'
=>
'Гана'
,
'GI'
=>
'Гибралтар'
,
'GL'
=>
'Гренландия'
,
'GM'
=>
'Гамбия'
,
'GN'
=>
'Гвинея'
,
'GP'
=>
'Гваделупа'
,
'GQ'
=>
'Экваториальная Гвинея'
,
'GR'
=>
'Греция'
,
'GS'
=>
'Южная Георгия и Южные Сандвичевы о-ва'
,
'GT'
=>
'Гватемала'
,
'GU'
=>
'Гуам'
,
'GW'
=>
'Гвинея-Бисау'
,
'GY'
=>
'Гайана'
,
'HK'
=>
'Гонконг (специальный административный район)'
,
'HN'
=>
'Гондурас'
,
'HR'
=>
'Хорватия'
,
'HT'
=>
'Гаити'
,
'HU'
=>
'Венгрия'
,
'IC'
=>
'Канарские о-ва'
,
'ID'
=>
'Индонезия'
,
'IE'
=>
'Ирландия'
,
'IL'
=>
'Израиль'
,
'IM'
=>
'о-в Мэн'
,
'IN'
=>
'Индия'
,
'IO'
=>
'Британская территория в Индийском океане'
,
'IQ'
=>
'Ирак'
,
'IR'
=>
'Иран'
,
'IS'
=>
'Исландия'
,
'IT'
=>
'Италия'
,
'JE'
=>
'Джерси'
,
'JM'
=>
'Ямайка'
,
'JO'
=>
'Иордания'
,
'JP'
=>
'Япония'
,
'KE'
=>
'Кения'
,
'KG'
=>
'Киргизия'
,
'KH'
=>
'Камбоджа'
,
'KI'
=>
'Кирибати'
,
'KM'
=>
'Коморы'
,
'KN'
=>
'Сент-Китс и Невис'
,
'KP'
=>
'КНДР'
,
'KR'
=>
'Республика Корея'
,
'KW'
=>
'Кувейт'
,
'KY'
=>
'Каймановы о-ва'
,
'KZ'
=>
'Казахстан'
,
'LA'
=>
'Лаос'
,
'LB'
=>
'Ливан'
,
'LC'
=>
'Сент-Люсия'
,
'LI'
=>
'Лихтенштейн'
,
'LK'
=>
'Шри-Ланка'
,
'LR'
=>
'Либерия'
,
'LS'
=>
'Лесото'
,
'LT'
=>
'Литва'
,
'LU'
=>
'Люксембург'
,
'LV'
=>
'Латвия'
,
'LY'
=>
'Ливия'
,
'MA'
=>
'Марокко'
,
'MC'
=>
'Монако'
,
'MD'
=>
'Молдова'
,
'ME'
=>
'Черногория'
,
'MF'
=>
'Сен-Мартен'
,
'MG'
=>
'Мадагаскар'
,
'MH'
=>
'Маршалловы Острова'
,
'MK'
=>
'Македония'
,
'ML'
=>
'Мали'
,
'MM'
=>
'Мьянма (Бирма)'
,
'MN'
=>
'Монголия'
,
'MO'
=>
'Макао (специальный административный район)'
,
'MP'
=>
'Северные Марианские о-ва'
,
'MQ'
=>
'Мартиника'
,
'MR'
=>
'Мавритания'
,
'MS'
=>
'Монтсеррат'
,
'MT'
=>
'Мальта'
,
'MU'
=>
'Маврикий'
,
'MV'
=>
'Мальдивы'
,
'MW'
=>
'Малави'
,
'MX'
=>
'Мексика'
,
'MY'
=>
'Малайзия'
,
'MZ'
=>
'Мозамбик'
,
'NA'
=>
'Намибия'
,
'NC'
=>
'Новая Каледония'
,
'NE'
=>
'Нигер'
,
'NF'
=>
'о-в Норфолк'
,
'NG'
=>
'Нигерия'
,
'NI'
=>
'Никарагуа'
,
'NL'
=>
'Нидерланды'
,
'NO'
=>
'Норвегия'
,
'NP'
=>
'Непал'
,
'NR'
=>
'Науру'
,
'NU'
=>
'Ниуэ'
,
'NZ'
=>
'Новая Зеландия'
,
'OM'
=>
'Оман'
,
'PA'
=>
'Панама'
,
'PE'
=>
'Перу'
,
'PF'
=>
'Французская Полинезия'
,
'PG'
=>
'Папуа – Новая Гвинея'
,
'PH'
=>
'Филиппины'
,
'PK'
=>
'Пакистан'
,
'PL'
=>
'Польша'
,
'PM'
=>
'Сен-Пьер и Микелон'
,
'PN'
=>
'острова Питкэрн'
,
'PR'
=>
'Пуэрто-Рико'
,
'PS'
=>
'Палестинские территории'
,
'PT'
=>
'Португалия'
,
'PW'
=>
'Палау'
,
'PY'
=>
'Парагвай'
,
'QA'
=>
'Катар'
,
'RE'
=>
'Реюньон'
,
'RO'
=>
'Румыния'
,
'RS'
=>
'Сербия'
,
'RU'
=>
'Россия'
,
'RW'
=>
'Руанда'
,
'SA'
=>
'Саудовская Аравия'
,
'SB'
=>
'Соломоновы Острова'
,
'SC'
=>
'Сейшельские Острова'
,
'SD'
=>
'Судан'
,
'SE'
=>
'Швеция'
,
'SG'
=>
'Сингапур'
,
'SH'
=>
'о-в Св. Елены'
,
'SI'
=>
'Словения'
,
'SJ'
=>
'Шпицберген и Ян-Майен'
,
'SK'
=>
'Словакия'
,
'SL'
=>
'Сьерра-Леоне'
,
'SM'
=>
'Сан-Марино'
,
'SN'
=>
'Сенегал'
,
'SO'
=>
'Сомали'
,
'SR'
=>
'Суринам'
,
'SS'
=>
'Южный Судан'
,
'ST'
=>
'Сан-Томе и Принсипи'
,
'SV'
=>
'Сальвадор'
,
'SX'
=>
'Синт-Мартен'
,
'SY'
=>
'Сирия'
,
'SZ'
=>
'Свазиленд'
,
'TA'
=>
'Тристан-да-Кунья'
,
'TC'
=>
'о-ва Тёркс и Кайкос'
,
'TD'
=>
'Чад'
,
'TF'
=>
'Французские Южные территории'
,
'TG'
=>
'Того'
,
'TH'
=>
'Таиланд'
,
'TJ'
=>
'Таджикистан'
,
'TK'
=>
'Токелау'
,
'TL'
=>
'Восточный Тимор'
,
'TM'
=>
'Туркменистан'
,
'TN'
=>
'Тунис'
,
'TO'
=>
'Тонга'
,
'TR'
=>
'Турция'
,
'TT'
=>
'Тринидад и Тобаго'
,
'TV'
=>
'Тувалу'
,
'TW'
=>
'Тайвань'
,
'TZ'
=>
'Танзания'
,
'UA'
=>
'Украина'
,
'UG'
=>
'Уганда'
,
'UM'
=>
'Внешние малые о-ва (США)'
,
'US'
=>
'США'
,
'UY'
=>
'Уругвай'
,
'UZ'
=>
'Узбекистан'
,
'VA'
=>
'Ватикан'
,
'VC'
=>
'Сент-Винсент и Гренадины'
,
'VE'
=>
'Венесуэла'
,
'VG'
=>
'Виргинские о-ва (Британские)'
,
'VI'
=>
'Виргинские о-ва (США)'
,
'VN'
=>
'Вьетнам'
,
'VU'
=>
'Вануату'
,
'WF'
=>
'Уоллис и Футуна'
,
'WS'
=>
'Самоа'
,
'XK'
=>
'Косово'
,
'YE'
=>
'Йемен'
,
'YT'
=>
'Майотта'
,
'ZA'
=>
'ЮАР'
,
'ZM'
=>
'Замбия'
,
'ZW'
=>
'Зимбабве'
,
],
];
src/config/autoload/offers.global.php
deleted
100644 → 0
View file @
b6363793
<?php
return
[
'offer_conf'
=>
[
'lang'
=>
array
(
'RU'
=>
'Русский'
,
),
'raiting'
=>
[
'A'
,
'B'
,
'C'
,
'D'
],
'landing_geo'
=>
array
(
'UA'
=>
'Украина'
,
'RU'
=>
'Россия'
,
'BY'
=>
'Беларусь'
,
'KZ'
=>
'Казахстан'
,
)
],
'cpa_stat_conf'
=>
[
'periods'
=>
array
(
'total'
=>
'всего'
,
'today'
=>
'сегодня'
,
'yesterday'
=>
'вчера'
,
'24h'
=>
'сутки'
,
'7d'
=>
'7 дней'
,
'30d'
=>
'30 дней'
,
),
]
];
src/config/autoload/reports.global.php
deleted
100644 → 0
View file @
b6363793
<?php
return
[
'metrics'
=>
[
// DateStat
'pagestat'
=>
array
(
'title'
=>
'страницам'
,
'type'
=>
'pages'
,
'fields_to_show'
=>
array
(
'loadCnt'
=>
'load'
,
'startCnt'
=>
'start'
,
'runCnt'
=>
'run'
,
'runRatio'
=>
'runRatio'
,
// runCnt/loadCnt * 100, в %
),
'fields'
=>
[
'loadCnt'
,
'startCnt'
,
'runCnt'
],
'filters'
=>
[
'SiteID'
,
'Country'
],
),
'minstat'
=>
array
(
'title'
=>
'зонам RTB'
,
'type'
=>
'zones'
,
'fields_to_show'
=>
array
(
'sspViewsCnt'
=>
'Показы'
,
'sspClicksCnt'
=>
'Клики'
,
'ctr'
=>
'CTR'
,
// sspClicksCnt/sspViewsCnt * 100, в %
'sspMoney'
=>
'Деньги'
,
'cpm'
=>
'CPM'
,
// sspMoney/sspViewsCnt * 1000
'siteCpm'
=>
'SiteCPM'
,
// sspSiteMoney/sspViewsCnt * 1000
'systemCpm'
=>
'SystemCPM'
,
// (sspMoney - sspSiteMoney)/sspViewsCnt * 1000
'cpc'
=>
'CPC'
,
// sspMoney/sspClicksCnt * 100
'siteCpc'
=>
'SiteCPC'
,
// sspSiteMoney/sspClicksCnt * 100
'systemCpc'
=>
'SystemCPC'
,
// (sspMoney - sspSiteMoney)/sspClicksCnt * 100
'sumRatio'
=>
'SumRatio'
,
// sspMoney/sspMoney * 100, в %
'siteRatio'
=>
'SiteRatio'
,
// sspSiteMoney/sspMoney * 100, в %
'systemRatio'
=>
'SystemRatio'
,
// sspSiteMoney/(sspMoney - sspSiteMoney) * 100, в %
'sspSiteMoney'
=>
'Деньги сайта'
,
'sspSystemMoney'
=>
'Деньги системы'
,
// sspMoney - sspSiteMoney
),
'fields'
=>
[
'sspViewsCnt'
,
'sspClicksCnt'
,
'sspMoney'
,
'sspSiteMoney'
],
'filters'
=>
[
'SiteID'
,
'Country'
,
'ZoneID'
],
),
'blockstat'
=>
array
(
'title'
=>
'блокам'
,
'type'
=>
'zones'
,
'fields_to_show'
=>
array
(
'blockViewsCnt'
=>
'Показы блоков'
,
'blockClicksCnt'
=>
'Клики по блокам'
,
'sspViewsCnt'
=>
'Показы rtb'
,
'sspClicksCnt'
=>
'Клики rtb'
,
//'sum' => 'Сумма', // blockViewsCnt+sspViewsCnt
//'ctr' => 'CTR', // blockClicksCnt/blockViewsCnt * 100, в %
'sumViews'
=>
'Сумма показов'
,
// blockViewsCnt+sspViewsCnt
'sumClicks'
=>
'Сумма кликов'
,
// blockClicksCnt+sspClicksCnt
'ctr'
=>
'CTR'
,
// blockClicksCnt/blockViewsCnt * 100, в %
'ctrRtb'
=>
'CTR rtb'
,
// sspClicksCnt/sspViewsCnt * 100, в %
),
'fields'
=>
[
'blockViewsCnt'
,
'blockClicksCnt'
,
'sspViewsCnt'
,
'sspClicksCnt'
],
'filters'
=>
[
'SiteID'
,
'Country'
,
'ZoneID'
],
),
'ndspstat'
=>
array
(
'title'
=>
'провайдерам ndsp'
,
'type'
=>
'ndsp'
,
'fields_to_show'
=>
array
(
'adViewsCnt'
=>
'Показы'
,
'adClicksCnt'
=>
'Клики'
,
'adMoney'
=>
'Деньги'
,
'ctr'
=>
'CTR'
,
// adClicksCnt/adViewsCnt * 100, в %
'cpm'
=>
'CPM'
,
// adMoney/adViewsCnt * 1000
'cpc'
=>
'CPC'
,
// adMoney/adClicksCnt * 100
),
'fields'
=>
[
'ndspProvider'
,
'adViewsCnt'
,
'adClicksCnt'
,
'adMoney'
],
'filters'
=>
[
'SiteID'
,
'Country'
,
'ZoneID'
],
),
// ProviderStat
'bidstat'
=>
array
(
'title'
=>
'ставкам SSP'
,
'type'
=>
'bids'
,
'fields_to_show'
=>
array
(
'bidCnt'
=>
'Кол-во ставок'
,
'bidMoney'
=>
'Деньги'
,
'cpm'
=>
'CPM'
,
// bidMoney/bidCnt * 1000
),
'fields'
=>
[
'sspProvider'
,
'bidCnt'
,
'bidMoney'
],
'filters'
=>
[
'SiteID'
,
'Country'
,
'ZoneID'
],
),
'winstat'
=>
array
(
'title'
=>
'выиграшам SSP'
,
'type'
=>
'zones'
,
'fields_to_show'
=>
array
(
'sspViewsCnt'
=>
'Показы'
,
'sspClicksCnt'
=>
'Клики'
,
'sspMoney'
=>
'Деньги'
,
'ctr'
=>
'CTR'
,
// sspClicksCnt/sspViewsCnt * 100, в %
'cpm'
=>
'CPM'
,
// sspMoney/sspViewsCnt * 1000
'cpc'
=>
'CPC'
,
// sspMoney/sspClicksCnt * 100
),
'fields'
=>
[
'sspProvider'
,
'sspViewsCnt'
,
'sspClicksCnt'
,
'sspMoney'
],
'filters'
=>
[
'SiteID'
,
'Country'
,
'ZoneID'
],
),
'providersblockstat'
=>
array
(
'title'
=>
'провайдерам блоков'
,
'type'
=>
'zones'
,
'fields_to_show'
=>
array
(
'blockViewsCnt'
=>
'Показы блоков'
,
'blockClicksCnt'
=>
'Клики по блокам'
,
//'sspViewsCnt' => 'Показы rtb',
'sum'
=>
'Сумма'
,
// blockViewsCnt+sspViewsCnt
'ctr'
=>
'CTR'
,
// blockClicksCnt/blockViewsCnt * 100, в %
),
'fields'
=>
[
'argonProvider'
,
'blockViewsCnt'
,
'blockClicksCnt'
,
'sspViewsCnt'
,
'sspClicksCnt'
],
'filters'
=>
[
'SiteID'
,
'Country'
,
'ZoneID'
],
),
]
];
src/config/autoload/routes.global.php
View file @
8635c101
...
@@ -316,12 +316,11 @@ return [
...
@@ -316,12 +316,11 @@ return [
]
]
],
],
],
],
[
[
'name'
=>
'user.cabinet'
,
'name'
=>
'user.cabinet'
,
'path'
=>
'/[:lang/]cabinet/[:report]'
,
'path'
=>
'/[:lang/]cabinet/[:report]'
,
'middleware'
=>
App\Action\User\Cabinet
::
class
,
'middleware'
=>
App\Action\User\Cabinet
::
class
,
'allowed_methods'
=>
[
'GET'
],
'allowed_methods'
=>
[
'GET'
,
'POST'
],
'options'
=>
[
'options'
=>
[
'constraints'
=>
[
'constraints'
=>
[
'lang'
=>
'[a-z]{2,3}'
,
'lang'
=>
'[a-z]{2,3}'
,
...
@@ -329,6 +328,7 @@ return [
...
@@ -329,6 +328,7 @@ return [
],
],
'defaults'
=>
[
'defaults'
=>
[
'lang'
=>
\App\Model\Locales
::
DEFAULT_LANG
,
'lang'
=>
\App\Model\Locales
::
DEFAULT_LANG
,
'action'
=>
App\Action\User\Cabinet
::
ACTION_STAT
,
'report'
=>
'common'
,
'report'
=>
'common'
,
]
]
],
],
...
...
src/config/autoload/sites.global.php
deleted
100644 → 0
View file @
b6363793
<?php
return
[
'site_categories'
=>
[
'IAB12'
=>
'Новости'
,
'IAB2'
=>
'Авто'
,
'IAB13'
=>
'Финансы'
,
'IAB15-10'
=>
'Погода'
,
'IAB-19'
=>
'HiTech'
,
'IAB3-1'
=>
'Объявления'
,
'IAB17'
=>
'Спорт'
,
'IAB29'
=>
'Торренты'
,
'IAB1-5'
=>
'Кино'
,
'IAB1'
=>
'Развлекательный'
,
'IAB1-2'
=>
'Глянец'
,
'IAB24'
=>
'Портал'
,
'IAB14'
=>
'Знакомства'
,
'IAB9-30'
=>
'Другое'
,
'IAB5'
=>
'Образование'
,
'IAB6'
=>
'Семья'
,
'IAB7'
=>
'Здоровье'
,
'IAB15'
=>
'Наука'
,
'IAB8'
=>
'Еда и напитки'
,
'IAB21'
=>
'Недвижимость'
,
'IAB1-1'
=>
'Литература'
,
'IAB9'
=>
'Хобби'
,
'IAB9-23'
=>
'Фотография'
,
'IAB16'
=>
'Животные'
],
'zone_sizes'
=>
[
'300x250'
,
'300x600'
,
'728x90'
,
'300x300'
,
],
'site_countries'
=>
[
'UA'
=>
'Украина'
,
'RU'
=>
'Россия'
,
'US'
=>
'США'
,
'EU'
=>
'Европа'
,
'DE'
=>
'Германия'
,
'NL'
=>
'Нидерланды'
,
],
];
src/config/autoload/users-segment.global.php
deleted
100644 → 0
View file @
b6363793
<?php
return
[
'users_segment'
=>
[
'A+'
=>
'A+'
,
'A'
=>
'A'
,
'B'
=>
'B'
,
'C'
=>
'C'
,
]
];
src/public/css/styles-feeds-stat.css
View file @
8635c101
...
@@ -98,7 +98,18 @@ input[type="checkbox"]
...
@@ -98,7 +98,18 @@ input[type="checkbox"]
background-size
:
10px
;
background-size
:
10px
;
cursor
:
pointer
;
cursor
:
pointer
;
}
}
.b-feeds-stat_data-loading
{
display
:
none
;
position
:
absolute
;
width
:
100%
;
height
:
100%
;
background
:
#FFF
url(../img/gif-load.gif)
center
200px
no-repeat
;
opacity
:
0.5
;
z-index
:
10
;
}
.b-feeds-stat_controls
.b-feeds-stat_controls
{
{
margin-bottom
:
25px
;
margin-bottom
:
25px
;
...
...
src/public/js/script-feeds-stat-charts.js
View file @
8635c101
...
@@ -42,12 +42,6 @@ $(document).ready(function(){
...
@@ -42,12 +42,6 @@ $(document).ready(function(){
return
date
.
getFullYear
()
+
'-'
+
pad
(
date
.
getMonth
()
+
1
)
+
'-'
+
pad
(
date
.
getDate
());
return
date
.
getFullYear
()
+
'-'
+
pad
(
date
.
getMonth
()
+
1
)
+
'-'
+
pad
(
date
.
getDate
());
}
}
// Форматирование времени
function
formatTime
(
time
)
{
return
pad
(
time
.
getHours
())
+
':'
+
pad
(
time
.
getMinutes
());
}
function
valueFormat
(
value
,
ratio
,
id
)
function
valueFormat
(
value
,
ratio
,
id
)
{
{
var
var
...
...
src/public/js/script-feeds-stat.js
View file @
8635c101
...
@@ -8,7 +8,9 @@ $(document).ready(function(){
...
@@ -8,7 +8,9 @@ $(document).ready(function(){
var
var
nowDate
=
new
Date
(),
nowDate
=
new
Date
(),
isChangePeriod
=
false
,
isChangePeriod
=
false
,
datepicker1
=
$
(
'#date-value-1'
).
datepicker
({
$dateFrom
=
$
(
'#date-value-1'
),
$dateTo
=
$
(
'#date-value-2'
),
datepicker1
=
$dateFrom
.
datepicker
({
dateFormat
:
"yyyy-mm-dd"
,
dateFormat
:
"yyyy-mm-dd"
,
autoClose
:
true
,
autoClose
:
true
,
maxDate
:
nowDate
,
maxDate
:
nowDate
,
...
@@ -20,7 +22,7 @@ $(document).ready(function(){
...
@@ -20,7 +22,7 @@ $(document).ready(function(){
}
}
},
},
}).
data
(
'datepicker'
),
}).
data
(
'datepicker'
),
datepicker2
=
$
(
'#date-value-2'
)
.
datepicker
({
datepicker2
=
$
dateTo
.
datepicker
({
dateFormat
:
"yyyy-mm-dd"
,
dateFormat
:
"yyyy-mm-dd"
,
autoClose
:
true
,
autoClose
:
true
,
maxDate
:
nowDate
,
maxDate
:
nowDate
,
...
@@ -33,9 +35,9 @@ $(document).ready(function(){
...
@@ -33,9 +35,9 @@ $(document).ready(function(){
}).
data
(
'datepicker'
),
}).
data
(
'datepicker'
),
$chartStat
=
$
(
'#chart-graph-stat'
),
$chartStat
=
$
(
'#chart-graph-stat'
),
$chartTable
=
$
(
'#table-stat'
),
$chartTable
=
$
(
'#table-stat'
),
$loading
=
$
(
'.b-feeds-stat_data-loading'
),
$chartStatInfo
=
$
(
'.chart-graph-stat-info'
),
$chartStatInfo
=
$
(
'.chart-graph-stat-info'
),
$chartStatError
=
$
(
'.chart-graph-stat-error'
),
$chartStatError
=
$
(
'.chart-graph-stat-error'
),
$chartStatLoading
=
$
(
'.chart-graph-stat-loading'
),
$chartStatErrorMessage
=
$
(
'.chart-graph-stat-error .message'
),
$chartStatErrorMessage
=
$
(
'.chart-graph-stat-error .message'
),
periodStatsData
,
periodStatsData
,
companyStatsData
,
companyStatsData
,
...
@@ -167,7 +169,40 @@ $(document).ready(function(){
...
@@ -167,7 +169,40 @@ $(document).ready(function(){
// Запрос данных за временной период:
// Запрос данных за временной период:
function
requestDataPeriod
()
function
requestDataPeriod
()
{
{
console
.
log
(
'AAA requestDataPeriod'
);
var
dataRequest
=
{
period
:
[
$dateFrom
.
val
(),
$dateTo
.
val
()]};
EnableLoadingState
(
true
);
$
.
ajax
({
url
:
$periodSelect
.
attr
(
'data-link'
),
method
:
'POST'
,
data
:
dataRequest
,
success
:
function
(
res
)
{
EnableLoadingState
(
false
);
if
(
res
==
null
)
{
console
.
log
(
"AAA requestDataStat success res: NULL"
);
$chartStatInfo
.
show
();
$chartStatError
.
hide
();
}
else
if
(
res
.
status
==
'Error'
)
{
console
.
log
(
"AAA requestDataStat error"
);
$chartStatError
.
show
();
$chartStatInfo
.
hide
();
}
else
{
//console.log("AAA requestDataStat SUCCESS res: ", res);
$chartStatInfo
.
hide
();
$chartStatError
.
hide
();
periodStatsData
=
res
.
period
;
companyStatsData
=
res
.
company
;
dataLineChartStat
=
periodStatsData
;
renderLineChart
();
renderHourTable
();
}
},
error
:
function
(
e
)
{
console
.
log
(
'error: '
,
e
);
EnableLoadingState
(
false
);
}
});
}
}
function
setPeriodSelectEmpty
()
function
setPeriodSelectEmpty
()
...
@@ -175,4 +210,18 @@ $(document).ready(function(){
...
@@ -175,4 +210,18 @@ $(document).ready(function(){
$periodSelect
.
val
(
''
);
$periodSelect
.
val
(
''
);
}
}
function
setPeriodSelectEmpty
()
{
$periodSelect
.
val
(
''
);
}
function
EnableLoadingState
(
isLoading
)
{
if
(
isLoading
)
{
$loading
.
show
();
}
else
{
$loading
.
hide
();
}
}
});
});
\ No newline at end of file
src/src/App/Action/User/Cabinet.php
View file @
8635c101
...
@@ -47,10 +47,7 @@ use Zend\Diactoros\Response\RedirectResponse;
...
@@ -47,10 +47,7 @@ use Zend\Diactoros\Response\RedirectResponse;
*/
*/
class
Cabinet
extends
Common
class
Cabinet
extends
Common
{
{
/**
const
ACTION_STAT
=
'stat'
;
* @var Mailer
*/
protected
$mailer
;
/**
/**
* @param ServerRequestInterface $request
* @param ServerRequestInterface $request
...
@@ -60,140 +57,213 @@ class Cabinet extends Common
...
@@ -60,140 +57,213 @@ class Cabinet extends Common
*/
*/
function
__invoke
(
ServerRequestInterface
$request
,
ResponseInterface
$response
,
callable
$next
=
null
)
function
__invoke
(
ServerRequestInterface
$request
,
ResponseInterface
$response
,
callable
$next
=
null
)
{
{
try
{
/** @var UserService $auth */
if
(
$request
->
getMethod
()
==
'POST'
)
{
$auth
=
$this
->
container
->
get
(
UserService
::
class
);
/** @var Statistics $stats */
$stats
=
$this
->
container
->
get
(
Statistics
::
class
);
/** @var Users $usersModel */
$usersModel
=
$this
->
container
->
get
(
Users
::
class
);
$userId
=
$auth
->
getIdentity
()
->
getId
();
try
{
$user
=
$usersModel
->
findById
(
$userId
);
switch
(
$request
->
getAttribute
(
'action'
))
{
case
self
::
ACTION_STAT
:
// Выводим стр. по фидам, если за пользователем закреплен фид:
$response
=
$this
->
getStatData
(
$request
);
/** @var \App\Model\Feeds $feedsModel */
break
;
$feedsModel
=
$this
->
container
->
get
(
Feeds
::
class
);
default
:
$feeds
=
$feedsModel
->
findAll
([
'clientid'
=>
$userId
])
->
toArray
();
$feed_id_list
=
[];
foreach
(
$feeds
as
$feed_item
)
{
$feed_id
=
$feed_item
[
'id'
];
if
(
!
in_array
(
$feed_id
,
$feed_id_list
))
{
$feed_id_list
[]
=
$feed_id
;
}
}
}
}
catch
(
\Exception
$e
)
{
$data
=
[
'result'
=>
false
,
'msg'
=>
$e
->
getMessage
(),
];
$response
=
new
JsonResponse
(
$data
);
}
return
$response
;
$report_type
=
$request
->
getAttribute
(
'report'
);
}
else
{
// Текущий месяц:
try
{
$current_period
=
'current_month'
;
$dates
=
[
date
(
'Y-m-01'
),
date
(
'Y-m-d'
)];
/** @var UserService $auth */
$auth
=
$this
->
container
->
get
(
UserService
::
class
);
switch
(
$report_type
)
{
$userId
=
$auth
->
getIdentity
()
->
getId
();
case
'common'
:
/** @var \App\Model\Feeds $statDaysModel */
/** @var \App\Model\Feeds $feedsModel */
$statsDaysModel
=
$this
->
container
->
get
(
StatsDays
::
class
);
$feedsModel
=
$this
->
container
->
get
(
Feeds
::
class
);
//$stats = $statsDaysModel->findAll(['FeedID' => $feed_id_list])->toArray();
$feeds
=
$feedsModel
->
findAll
([
'clientid'
=>
$userId
])
->
toArray
();
$periodStats
=
$statsDaysModel
->
getStatsByDate
(
$feed_id_list
,
$dates
);
$companyStats
=
$statsDaysModel
->
getStatsByFeeds
(
$feed_id_list
,
$dates
);
// Фиды пользователя:
$cats
=
[
'shows'
,
'clicks'
,
'transactions'
,
'salemoney'
,
'admoney'
];
$feed_id_list
=
[];
//return new JsonResponse($periodStats);
foreach
(
$feeds
as
$feed_item
)
{
break
;
$feed_id
=
$feed_item
[
'id'
];
case
'transaction'
:
if
(
!
in_array
(
$feed_id
,
$feed_id_list
))
{
/** @var \App\Model\Feeds $transactionsModel */
$feed_id_list
[]
=
$feed_id
;
$transactionsModel
=
$this
->
container
->
get
(
Transactions
::
class
);
}
$periodStats
=
$transactionsModel
->
getStatsByDate
(
$feed_id_list
,
$dates
);
}
$companyStats
=
$transactionsModel
->
getStatsByFeeds
(
$feed_id_list
,
$dates
);
$cats
=
[
'localmoney'
,
'usdollarmoney'
];
$report_type
=
$request
->
getAttribute
(
'report'
);
break
;
default
:
// Текущий месяц:
$data
[
'error'
]
=
_t
(
'Извините, тип отчета "'
.
$report_type
.
'" недоступен'
);
$current_period
=
'current_month'
;
break
;
$dates
=
[
date
(
'Y-m-01'
),
date
(
'Y-m-d'
)];
switch
(
$report_type
)
{
case
'common'
:
/** @var \App\Model\Feeds $statDaysModel */
$statsDaysModel
=
$this
->
container
->
get
(
StatsDays
::
class
);
//$stats = $statsDaysModel->findAll(['FeedID' => $feed_id_list])->toArray();
$periodStats
=
$statsDaysModel
->
getStatsByDate
(
$feed_id_list
,
$dates
);
$companyStats
=
$statsDaysModel
->
getStatsByFeeds
(
$feed_id_list
,
$dates
);
$cats
=
[
'shows'
,
'clicks'
,
'transactions'
,
'salemoney'
,
'admoney'
];
break
;
case
'transaction'
:
/** @var \App\Model\Feeds $transactionsModel */
$transactionsModel
=
$this
->
container
->
get
(
Transactions
::
class
);
$periodStats
=
$transactionsModel
->
getStatsByDate
(
$feed_id_list
,
$dates
);
$companyStats
=
$transactionsModel
->
getStatsByFeeds
(
$feed_id_list
,
$dates
);
$cats
=
[
'localmoney'
,
'usdollarmoney'
];
//return new JsonResponse($periodStats);
break
;
default
:
$data
[
'error'
]
=
_t
(
'Извините, тип отчета "'
.
$report_type
.
'" недоступен'
);
break
;
}
$periodStats
[
'type'
]
=
'interval'
;
$periodStats
[
'report'
]
=
$report_type
;
$companyStats
[
'type'
]
=
'interval'
;
$companyStats
[
'report'
]
=
$report_type
;
$data
[
'feeds'
]
=
$feeds
;
$data
[
'report'
]
=
$report_type
;
$data
[
'current_period'
]
=
$current_period
;
$data
[
'dates'
]
=
$dates
;
$data
[
'periodStats'
]
=
$periodStats
;
$data
[
'companyStats'
]
=
$companyStats
;
$data
[
'cats'
]
=
$cats
;
/*
$response = new HtmlResponse($this->template->render('app::user/feeds', [
'lang' => $request->getAttribute('layoutInfo')->getLang(),
'feeds' => $feeds,
'stats' => $stats,
]));
return $response;
*/
/*
$allDomains = $listDomains;
$subdomains = true;
$allStat = false;
$group = false;
$summaryReport = $stats->getSummuryReport($allDomains, $user->getCurrencyCode(), $subdomains, $allStat, $group);
list($periodStats, $periodDates) = $stats->getPeriodReport(date('Y-m'), $allDomains, $user->getCurrencyCode(), $subdomains, $allStat, $group);
$dateIterval = new \DateInterval('P1M');
$dateStart = \DateTime::createFromFormat('Y-m-d', $periodDates['min'] ?: date('Y-m-01'));
$dateEnd = \DateTime::createFromFormat('Y-m-d', $periodDates['max'] ?: date('Y-m-01'));
$dateRange = array();
if($dateStart != $dateEnd) {
$_dateRange = new \DatePeriod($dateStart, $dateIterval, $dateEnd);
foreach($_dateRange as $dt) {
$dateRange[] = $dt;
}
}
$dateRange[] = $dateEnd;
$dateRange = array_reverse($dateRange);
$currencyModel = $this->container->get(\App\Model\Currencies::class);
$currencies = array();
foreach($currencyModel->findAll() as $currency) {
$currencies[$currency->getCode()] = $currency->getName();
}
$currentCurencyCode = $user->getCurrencyCode();
$data['sites'] = $listSites;
$data['accessSites'] = $listAccessSites;
$data['summaryStats'] = $summaryStats;
$data['periodStats'] = $periodStats;
$data['summaryReport'] = $summaryReport;
$data['listDomains'] = $listDomains;
$data['dateRange'] = $dateRange;
$data['currencies'] = $currencies;
$data['currency'] = ['code' => $currentCurencyCode, 'name' => $currencies[$currentCurencyCode]];
$data['userId'] = $userId;
*/
}
catch
(
\Exception
$e
)
{
$data
[
'error'
]
=
_t
(
'Извините, статистика временно не работает'
);
}
}
$periodStats
[
'type'
]
=
'interval'
;
$data
=
array_merge
(
$data
,
[
$periodStats
[
'report'
]
=
$report_type
;
$companyStats
[
'type'
]
=
'interval'
;
$companyStats
[
'report'
]
=
$report_type
;
$data
[
'feeds'
]
=
$feeds
;
$data
[
'report'
]
=
$report_type
;
$data
[
'current_period'
]
=
$current_period
;
$data
[
'dates'
]
=
$dates
;
$data
[
'periodStats'
]
=
$periodStats
;
$data
[
'companyStats'
]
=
$companyStats
;
$data
[
'cats'
]
=
$cats
;
/*
$response = new HtmlResponse($this->template->render('app::user/feeds', [
'lang'
=>
$request
->
getAttribute
(
'layoutInfo'
)
->
getLang
(),
'lang'
=>
$request
->
getAttribute
(
'layoutInfo'
)
->
getLang
(),
'feeds' => $feeds,
'layoutInfo'
=>
$request
->
getAttribute
(
'layoutInfo'
),
'stats' => $stats,
]);
]));
return $response;
return
new
HtmlResponse
(
$this
->
template
->
render
(
'app::user/cabinet-feed'
,
$data
));
*/
}
/*
}
$allDomains = $listDomains;
private
function
getStatData
(
ServerRequestInterface
$request
)
$subdomains = true;
{
$allStat = false;
/** @var UserService $auth */
$group = false;
$auth
=
$this
->
container
->
get
(
UserService
::
class
);
$userId
=
$auth
->
getIdentity
()
->
getId
();
$summaryReport = $stats->getSummuryReport($allDomains, $user->getCurrencyCode(), $subdomains, $allStat, $group);
list($periodStats, $periodDates) = $stats->getPeriodReport(date('Y-m'), $allDomains, $user->getCurrencyCode(), $subdomains, $allStat, $group);
$dateIterval = new \DateInterval('P1M');
// Выводим стр. по фидам, если за пользователем закреплен фид:
$dateStart = \DateTime::createFromFormat('Y-m-d', $periodDates['min'] ?: date('Y-m-01'));
/** @var \App\Model\Feeds $feedsModel */
$dateEnd = \DateTime::createFromFormat('Y-m-d', $periodDates['max'] ?: date('Y-m-01'));
$feedsModel
=
$this
->
container
->
get
(
Feeds
::
class
);
$feeds
=
$feedsModel
->
findAll
([
'clientid'
=>
$userId
])
->
toArray
();
$dateRange = array();
// Фиды пользователя:
if($dateStart != $dateEnd) {
$feed_id_list
=
[];
$_dateRange = new \DatePeriod($dateStart, $dateIterval, $dateEnd);
foreach
(
$feeds
as
$feed_item
)
{
foreach($_dateRange as $dt) {
$feed_id
=
$feed_item
[
'id'
];
$dateRange[] = $dt;
if
(
!
in_array
(
$feed_id
,
$feed_id_list
))
{
}
$feed_id_list
[]
=
$feed_id
;
}
$dateRange[] = $dateEnd;
$dateRange = array_reverse($dateRange);
$currencyModel = $this->container->get(\App\Model\Currencies::class);
$currencies = array();
foreach($currencyModel->findAll() as $currency) {
$currencies[$currency->getCode()] = $currency->getName();
}
}
$currentCurencyCode = $user->getCurrencyCode();
}
$data['sites'] = $listSites;
$report_type
=
$request
->
getAttribute
(
'report'
);
$data['accessSites'] = $listAccessSites;
$data_request
=
$request
->
getParsedBody
();
$data['summaryStats'] = $summaryStats;
$dates
=
$data_request
[
'period'
];
$data['periodStats'] = $periodStats;
$data['summaryReport'] = $summaryReport;
switch
(
$report_type
)
{
$data['listDomains'] = $listDomains;
case
'common'
:
$data['dateRange'] = $dateRange;
/** @var \App\Model\Feeds $statDaysModel */
$data['currencies'] = $currencies;
$statsDaysModel
=
$this
->
container
->
get
(
StatsDays
::
class
);
$data['currency'] = ['code' => $currentCurencyCode, 'name' => $currencies[$currentCurencyCode]];
$periodStats
=
$statsDaysModel
->
getStatsByDate
(
$feed_id_list
,
$dates
);
$data['userId'] = $userId;
$companyStats
=
$statsDaysModel
->
getStatsByFeeds
(
$feed_id_list
,
$dates
);
break
;
*/
case
'transaction'
:
/** @var \App\Model\Feeds $transactionsModel */
}
catch
(
\Exception
$e
)
{
$transactionsModel
=
$this
->
container
->
get
(
Transactions
::
class
);
$data
[
'error'
]
=
_t
(
'Извините, статистика временно не работает'
);
$periodStats
=
$transactionsModel
->
getStatsByDate
(
$feed_id_list
,
$dates
);
$companyStats
=
$transactionsModel
->
getStatsByFeeds
(
$feed_id_list
,
$dates
);
break
;
default
:
$periodStats
=
null
;
$companyStats
=
null
;
break
;
}
}
$data
=
array_merge
(
$data
,
[
$periodStats
[
'type'
]
=
'interval'
;
'lang'
=>
$request
->
getAttribute
(
'layoutInfo'
)
->
getLang
(),
$periodStats
[
'report'
]
=
$report_type
;
'layoutInfo'
=>
$request
->
getAttribute
(
'layoutInfo'
),
]);
$companyStats
[
'type'
]
=
'interval'
;
$companyStats
[
'report'
]
=
$report_type
;
return
new
HtmlResponse
(
$this
->
template
->
render
(
'app::user/cabinet-feed'
,
$data
));
if
(
$periodStats
||
$companyStats
)
{
$data
=
array
(
'period'
=>
$periodStats
,
'company'
=>
$companyStats
,
);
}
else
{
$data
=
null
;
}
return
new
JsonResponse
(
$data
);
}
}
}
}
\ No newline at end of file
src/src/App/Model/Feeds/Transactions.php
View file @
8635c101
...
@@ -35,7 +35,7 @@ use App\Model\Common;
...
@@ -35,7 +35,7 @@ use App\Model\Common;
class
Transactions
extends
Common
class
Transactions
extends
Common
{
{
public
function
getStatsByFeeds
(
$feeds
)
public
function
getStatsByFeeds
(
$feeds
,
$dates
)
{
{
$adapter
=
$this
->
tableGateway
->
getAdapter
();
$adapter
=
$this
->
tableGateway
->
getAdapter
();
...
@@ -62,7 +62,7 @@ class Transactions extends Common
...
@@ -62,7 +62,7 @@ class Transactions extends Common
return
$stats
;
return
$stats
;
}
}
public
function
getStatsByDate
(
$feeds
)
public
function
getStatsByDate
(
$feeds
,
$dates
)
{
{
$adapter
=
$this
->
tableGateway
->
getAdapter
();
$adapter
=
$this
->
tableGateway
->
getAdapter
();
...
...
src/templates/app/user/cabinet-feed.phtml
View file @
8635c101
...
@@ -80,6 +80,9 @@ $colors_active_lines = array(
...
@@ -80,6 +80,9 @@ $colors_active_lines = array(
'admoney'
=>
'#9467BD'
,
'admoney'
=>
'#9467BD'
,
);
);
$data_request_link
=
$this
->
url
(
'user.cabinet'
,
[
'lang'
=>
$this
->
lang
,
'report'
=>
$report
]);
?>
?>
...
@@ -111,7 +114,9 @@ $colors_active_lines = array(
...
@@ -111,7 +114,9 @@ $colors_active_lines = array(
<textarea
id=
"company-stats"
>
<?=
(
$companyStats
?
json_encode
(
$companyStats
)
:
''
)
?>
</textarea>
<textarea
id=
"company-stats"
>
<?=
(
$companyStats
?
json_encode
(
$companyStats
)
:
''
)
?>
</textarea>
<section
class=
"b-content__work"
>
<section
class=
"b-content__work"
>
<div
class=
"wrapp"
>
<div
class=
"wrapp"
style=
"position: relative;"
>
<div
class=
"b-feeds-stat_data-loading"
></div>
<div
class=
"b-feeds-stat_controls form-group"
>
<div
class=
"b-feeds-stat_controls form-group"
>
...
@@ -139,7 +144,7 @@ $colors_active_lines = array(
...
@@ -139,7 +144,7 @@ $colors_active_lines = array(
<input
type=
'text'
id=
"date-value-2"
class=
"btn btn-default date-value"
value=
"
<?=
$dates
[
1
]
?>
"
/>
<input
type=
'text'
id=
"date-value-2"
class=
"btn btn-default date-value"
value=
"
<?=
$dates
[
1
]
?>
"
/>
<span>
период:
</span>
<span>
период:
</span>
<select
class=
"form-control stat-period"
name=
"period"
>
<select
class=
"form-control stat-period"
name=
"period"
data-link=
"
<?=
$data_request_link
?>
"
>
<option
value=
""
disabled
>
--
</option>
<option
value=
""
disabled
>
--
</option>
<?php
foreach
(
$periods_conf
as
$period
=>
$title
)
:
?>
<?php
foreach
(
$periods_conf
as
$period
=>
$title
)
:
?>
<option
value=
"
<?=
$period
?>
"
<?php
if
(
$period
==
$current_period
)
:
?>
selected
<?php
endif
;
?>
>
<?=
$title
?>
</option>
<option
value=
"
<?=
$period
?>
"
<?php
if
(
$period
==
$current_period
)
:
?>
selected
<?php
endif
;
?>
>
<?=
$title
?>
</option>
...
@@ -159,7 +164,6 @@ $colors_active_lines = array(
...
@@ -159,7 +164,6 @@ $colors_active_lines = array(
<?php
/* График */
?>
<?php
/* График */
?>
<?php
if
(
$report
==
'common'
)
:
?>
<?php
if
(
$report
==
'common'
)
:
?>
<div
id=
"chart-graph-stat"
style=
"height: 370px;"
></div>
<div
id=
"chart-graph-stat"
style=
"height: 370px;"
></div>
<div
class=
"chart-graph-stat-loading"
></div>
<?php
endif
?>
<?php
endif
?>
<?php
/* Таблица */
?>
<?php
/* Таблица */
?>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment