Skip to content

Commit

Permalink
reformat code, fix appId
Browse files Browse the repository at this point in the history
  • Loading branch information
akiraz2 committed May 23, 2019
1 parent 96177a7 commit 2df82a9
Show file tree
Hide file tree
Showing 15 changed files with 307 additions and 246 deletions.
39 changes: 22 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,29 @@
# Yii2 Multi Web Statistic Module [![Packagist Version](https://img.shields.io/packagist/v/akiraz2/yii2-stat.svg?style=flat-square)](https://packagist.org/packages/akiraz2/yii2-stat) [![Total Downloads](https://img.shields.io/packagist/dt/akiraz2/yii2-stat.svg?style=flat-square)](https://packagist.org/packages/akiraz2/yii2-stat) [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md)

> **NOTE:** Module is in initial development. Anything may change at any time.
На данный момент текущая рабочая версия v0.2 - есть только счетчики яндекса и google и собственный счетчик в DB
На данный момент текущая рабочая версия v0.3 - есть только счетчики яндекса и google и собственный счетчик в DB

Модуль статистики и аналитики для вашего сайта. Много систем на ваш выбор, подключаются либо в конфиге модуля либо в админке:
Statistics and Analytics module for your website. Many systems of your choice, connect either in the config module or in the admin panel:

* **Яндекс-Метрика**
* **Google Analytics**
* Liveinternet
* TopMail
* **Bigmir** *(для украинской аудитории)*
* Bigmir *(для украинской аудитории)*
* Alexa
* Hotlog
* Rambler
* Openstat
* и даже на выбор **собственная** система для отслеживания посетителей по их IP-адресам и cookie.

> **NOTE:** Используются самые свежие версии кода счетчика (yandex-metrika2, gtag.js).


Для разработки модуля Yii2 Stat были использованы наработки данных модулей:
To develop the Yii2 Stat module, the developments of these modules were used:
* [klisl/yii2-statistics](https://github.com/klisl/yii2-statistics) (inspired)
* [hiqdev/yii2-yandex-metrika](https://github.com/hiqdev/yii2-yandex-metrika) (code)

Иногда не все посещения сайта фиксируются счетчиками Яндекса или Google.
Чтобы посещение точно было засчитано (а это очень важно для отслеживания рекламных источников),
используют серверные логи или в нашем случае можно использовать минимально рабочий счетчик на PHP.
Sometimes not all site visits are recorded by Yandex or Google counters.
To visit was accurately counted (and this is very important for tracking advertising sources),
use server logs or in our case you can use the minimum working counter in PHP.


## Features
Expand All @@ -37,14 +35,14 @@
* можно посмотреть страну, **город**, какой браузер и расширение, **referer**
* **источник перехода** (inner, search, direct, ads (from UTM-tags), unknown)
* **отсеивание поисковых ботов** (11шт)
* есть возможность добавления IP, которые не нужны в статистике в черный спискок
* есть возможность добавления IP, которые не нужны в статистике, в черный спискок
* удобная фильтрация вывода результатов статистики (за день, период, по определенному IP)


Какая информация выводится по каждому отдельному посетителю:
* его уникальный IP адрес с возможностью получения информации о его местонахождении
* URL просматриваемой страницы и количество переходов
* время посещения определенной страницы
What information is displayed for each individual visitor:
* its unique IP address with the ability to obtain information about its location
* URL of the page being viewed and number of clicks
* time to visit a particular page



Expand Down Expand Up @@ -100,7 +98,7 @@ Config common modules in common/config/main.php
'onlyGuestUsers' => true, // true default
'countBot' => false, // false default
'appId' => ['app-frontend'], // by default count visits only from Frontend App (in backend app we dont need it)
'blackIpList' => [] // ['127.0.0.1'] by default
'blackIpList' => [], // ['127.0.0.1'] by default

// размещаем нашу админ панель на backend с проверкой доступа или ролями (здесь используется dektrium/user)
'controllerMap' => [
Expand All @@ -125,7 +123,7 @@ Config common modules in common/config/main.php
```

## Usage
// переработать
//


Для перехода на страницу статистики
Expand All @@ -137,6 +135,13 @@ Config common modules in common/config/main.php

## Development

### TODO
1. Optimize db usage (for inner db-counter)
2. Real dashboard, analytics
3. Remove unnecessary code from previous packages
4. Add other services (Hotlog, Openstat, etc)
5. Translate dashboard

Please translate to your language! Edit config `@vendor/akiraz2/yii2-stat/src/messages/config.php`, add your language and run script:
```php
php ./yii message/extract @akiraz2/stat/messages/config.php
Expand All @@ -160,4 +165,4 @@ I can apply patch, PR in 2-3 days! If not, please write me `akiraz@bk.ru`
## Licensing

Yii2-Stat is released under the MIT License. See the bundled [LICENSE.md](LICENSE.md)
for details.
for details.
25 changes: 13 additions & 12 deletions src/Bootstrap.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
*
* @package akiraz2\stat
*/
class Bootstrap implements BootstrapInterface{
class Bootstrap implements BootstrapInterface
{

/**
* Метод, который вызывается автоматически при каждом запросе
Expand All @@ -44,26 +45,26 @@ public function bootstrap($app)
* 'statistics' => 'akiraz2\stat\Module'
* ],
*/
//$app->setModule('stat', 'akiraz2\stat\Module');
if(! ($app instanceof ConsoleApplication)) {
$app->get('view')->attachBehavior('ViewBehavior',[
'class' => ViewBehavior::class,
]);
$app->attachBehavior('ControllerBehavior',[
'class' => ControllerBehavior::class,
]);
}
//$app->setModule('stat', 'akiraz2\stat\Module');
if (!($app instanceof ConsoleApplication)) {
$app->get('view')->attachBehavior('ViewBehavior', [
'class' => ViewBehavior::class,
]);
$app->attachBehavior('ControllerBehavior', [
'class' => ControllerBehavior::class,
]);
}

// Add module I18N category.
if (!isset($app->i18n->translations['akiraz2/stat'])) {
$app->i18n->translations['akiraz2/stat'] = [
'class' => PhpMessageSource::class,
'basePath' => __DIR__ .'/messages',
'basePath' => __DIR__ . '/messages',
'forceTranslation' => true,
'fileMap' => [
'akiraz2/stat' => 'stat.php',
]
];
}
}
}
}
4 changes: 2 additions & 2 deletions src/CodeBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public function prepareData($counter_name)

return [
'id' => $module_property['id'],
'params' => isset($module_property['params'])?$this->prepareParams($module_property): [],
'params' => isset($module_property['params']) ? $this->prepareParams($module_property) : [],
];
}

Expand All @@ -52,4 +52,4 @@ public function prepareParams($module_property)
$module_property['params']
));
}
}
}
120 changes: 80 additions & 40 deletions src/ControllerBehavior.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,73 @@ class ControllerBehavior extends Behavior
{
use ModuleTrait;

/**
* Проверяет, является ли посетитель роботом поисковой системы из перечня.
*
* @param string $botname
* @return bool|string
*/
public static function isBot1(&$botname = '')
{
$bots = array(
'rambler',
'googlebot',
'aport',
'yahoo',
'msnbot',
'turtle',
'mail.ru',
'omsktele',
'yetibot',
'picsearch',
'sape.bot',
'sape_context',
'gigabot',
'snapbot',
'alexa.com',
'megadownload.net',
'askpeter.info',
'igde.ru',
'ask.com',
'qwartabot',
'yanga.co.uk',
'scoutjet',
'similarpages',
'oozbot',
'shrinktheweb.com',
'aboutusbot',
'followsite.com',
'dataparksearch',
'google-sitemaps',
'appEngine-google',
'feedfetcher-google',
'liveinternet.ru',
'xml-sitemaps.com',
'agama',
'metadatalabs.com',
'h1.hrn.ru',
'googlealert.com',
'seo-rus.com',
'yaDirectBot',
'yandeG',
'yandex',
'yandexSomething',
'Copyscape.com',
'AdsBot-Google',
'domaintools.com',
'Nigma.ru',
'bing.com',
'dotnetdotcom'
);
foreach ($bots as $bot) {
if (stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false) {
$botname = $bot;
return $botname;
}
}
return false;
}

public function events()
{
return [
Expand All @@ -42,12 +109,13 @@ public function ownCounter($event)
if (!$module->ownStat
|| (in_array($request->userIP, $module->blackIpList))
|| !in_array(Yii::$app->id, $module->appId)
//|| YII_DEBUG || YII_ENV == 'dev'
|| YII_DEBUG || YII_ENV == 'dev'
|| $request->isAjax
|| ($module->onlyGuestUsers && !Yii::$app->user->isGuest)
|| !$module->countBot && self::isBot()
)
) {
return;
}

$cookies = Yii::$app->request->getCookies();
$cookie_id_name = $module->ownStatCookieId;
Expand All @@ -61,17 +129,15 @@ public function ownCounter($event)
} else {
$cookie_id = $cookies->get($cookie_id_name);
}

$visitor = new WebVisitor();
$visitor->ip_address = $request->userIP;
$visitor->source = self::identitySource($request);
$visitor->cookie_id = $cookie_id->value;
$visitor->url = $request->getAbsoluteUrl();
$visitor->referrer = $request->getReferrer();
$visitor->user_id = !Yii::$app->user->isGuest ? Yii::$app->user->identity->id : null;
$visitor->user_agent = Yii::$app->request->userAgent;
$visitor->save();
//var_dump($visitor->getErrors());
Yii::$app->db->createCommand()->insert('{{%webstat_visitor}}', [
'ip_address' => $request->userIP,
'source' => self::identitySource($request),
'cookie_id' => $cookie_id->value,
'url' => $request->getAbsoluteUrl(),
'referrer' => $request->getReferrer(),
'user_id' => !Yii::$app->user->isGuest ? Yii::$app->user->identity->id : null,
'user_agent' => Yii::$app->request->userAgent,
])->execute();
}

/**
Expand All @@ -86,32 +152,6 @@ public static function isBot()
return $is_bot;
}

/**
* Проверяет, является ли посетитель роботом поисковой системы из перечня.
*
* @param string $botname
* @return bool|string
*/
public static function isBot1(&$botname = ''){
$bots = array(
'rambler','googlebot','aport','yahoo','msnbot','turtle','mail.ru','omsktele',
'yetibot','picsearch','sape.bot','sape_context','gigabot','snapbot','alexa.com',
'megadownload.net','askpeter.info','igde.ru','ask.com','qwartabot','yanga.co.uk',
'scoutjet','similarpages','oozbot','shrinktheweb.com','aboutusbot','followsite.com',
'dataparksearch','google-sitemaps','appEngine-google','feedfetcher-google',
'liveinternet.ru','xml-sitemaps.com','agama','metadatalabs.com','h1.hrn.ru',
'googlealert.com','seo-rus.com','yaDirectBot','yandeG','yandex',
'yandexSomething','Copyscape.com','AdsBot-Google','domaintools.com',
'Nigma.ru','bing.com','dotnetdotcom'
);
foreach($bots as $bot)
if(stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false){
$botname = $bot;
return $botname;
}
return false;
}

/**
* @param $request Request
* @return int
Expand All @@ -137,4 +177,4 @@ public static function identitySource($request)

return WebVisitor::TYPE_UNKNOWN;
}
}
}
11 changes: 9 additions & 2 deletions src/ViewBehavior.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,15 @@ public function events()

public function onEndBody($event)
{
$module = $this->getModule();
$request = Yii::$app->request;
// зачем нам счетчики в дев режиме- отключаем
if (YII_DEBUG || YII_ENV == 'dev' || Yii::$app->request->isAjax) {
if (Yii::$app->request->isAjax
|| (in_array($request->userIP, $module->blackIpList))
|| !in_array(Yii::$app->id, $module->appId)
|| YII_DEBUG || YII_ENV == 'dev'
|| $request->isAjax
|| ($module->onlyGuestUsers && !Yii::$app->user->isGuest)) {
return;
}

Expand All @@ -49,4 +56,4 @@ public function getBuilder()

return $this->builder;
}
}
}
12 changes: 9 additions & 3 deletions src/controllers/DashboardController.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ public function actionForms()
//Валидация формы входа
if (isset($count_model['enter'])) {
$validate = $this->validatePassword($request, $session);
if (!$validate) return false;
if (!$validate) {
return false;
}
}

/*
Expand Down Expand Up @@ -85,7 +87,9 @@ public function actionForms()
$condition = ["ip" => $count_model['ip']];
$stat_ip = true;

if (!$count_model['ip']) $session->setFlash('danger', 'Укажите IP для поиска');
if (!$count_model['ip']) {
$session->setFlash('danger', 'Укажите IP для поиска');
}
}


Expand All @@ -98,7 +102,9 @@ public function actionForms()

} else {

if (!isset($count_model['comment'])) $count_model['comment'] = '';
if (!isset($count_model['comment'])) {
$count_model['comment'] = '';
}
$model->set_black_list($count_model['ip'], $count_model['comment']);
}
}
Expand Down
Loading

0 comments on commit 2df82a9

Please sign in to comment.