diff --git a/Classes/Dashboard/Widgets/PageViewsBar.php b/Classes/Dashboard/Widgets/PageViewsBar.php index 1755b89..b98ac75 100644 --- a/Classes/Dashboard/Widgets/PageViewsBar.php +++ b/Classes/Dashboard/Widgets/PageViewsBar.php @@ -22,8 +22,7 @@ namespace DanielSiepmann\Tracking\Dashboard\Widgets; */ use TYPO3\CMS\Core\Database\Connection; -use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Database\Query\QueryBuilder; use TYPO3\CMS\Dashboard\Widgets\AbstractBarChartWidget; class PageViewsBar extends AbstractBarChartWidget @@ -36,6 +35,18 @@ class PageViewsBar extends AbstractBarChartWidget protected $height = 4; + /** + * @var QueryBuilder + */ + protected $queryBuilder; + + public function __construct(string $identifier, QueryBuilder $queryBuilder) + { + parent::__construct($identifier); + $this->queryBuilder = $queryBuilder; + $this->identifier = $identifier; + } + protected function prepareChartData(): void { list($labels, $data) = $this->calculateDataForLastDays(31); @@ -57,18 +68,15 @@ class PageViewsBar extends AbstractBarChartWidget protected function getPageViewsInPeriod(int $start, int $end): int { - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) - ->getQueryBuilderForTable('tx_tracking_pageview'); - - return (int)$queryBuilder + return (int)$this->queryBuilder ->count('*') ->from('tx_tracking_pageview') ->where( - $queryBuilder->expr()->gte('tstamp', $start), - $queryBuilder->expr()->lte('tstamp', $end), - $queryBuilder->expr()->notIn( + $this->queryBuilder->expr()->gte('tstamp', $start), + $this->queryBuilder->expr()->lte('tstamp', $end), + $this->queryBuilder->expr()->notIn( 'tx_tracking_pageview.pid', - $queryBuilder->createNamedParameter([ + $this->queryBuilder->createNamedParameter([ 1, 11, 38, diff --git a/Classes/Dashboard/Widgets/PageViewsPerPageDoughnut.php b/Classes/Dashboard/Widgets/PageViewsPerPageDoughnut.php index a3d5e84..54776e3 100644 --- a/Classes/Dashboard/Widgets/PageViewsPerPageDoughnut.php +++ b/Classes/Dashboard/Widgets/PageViewsPerPageDoughnut.php @@ -23,9 +23,7 @@ namespace DanielSiepmann\Tracking\Dashboard\Widgets; use Doctrine\DBAL\ParameterType; use TYPO3\CMS\Core\Database\Connection; -use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\QueryBuilder; -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Dashboard\Widgets\AbstractDoughnutChartWidget; class PageViewsPerPageDoughnut extends AbstractDoughnutChartWidget @@ -34,6 +32,17 @@ class PageViewsPerPageDoughnut extends AbstractDoughnutChartWidget protected $description = 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.pageViewsPerPageDoughnut.description'; + /** + * @var QueryBuilder + */ + protected $queryBuilder; + + public function __construct(string $identifier, QueryBuilder $queryBuilder) + { + parent::__construct($identifier); + $this->queryBuilder = $queryBuilder; + } + protected function prepareChartData(): void { list($labels, $data) = $this->getPageViewsPerPage(31); @@ -53,9 +62,8 @@ class PageViewsPerPageDoughnut extends AbstractDoughnutChartWidget { $labels = []; $data = []; - $queryBuilder = $this->getQueryBuilder(); - $result = $queryBuilder + $result = $this->queryBuilder ->selectLiteral('count(tx_tracking_pageview.pid) as total') ->addSelect('pages.title', 'pages.uid') ->from('tx_tracking_pageview') @@ -63,12 +71,15 @@ class PageViewsPerPageDoughnut extends AbstractDoughnutChartWidget 'tx_tracking_pageview', 'pages', 'pages', - $queryBuilder->expr()->eq('tx_tracking_pageview.pid', $queryBuilder->quoteIdentifier('pages.uid')) + $this->queryBuilder->expr()->eq( + 'tx_tracking_pageview.pid', + $this->queryBuilder->quoteIdentifier('pages.uid') + ) ) ->where( - $queryBuilder->expr()->notIn( + $this->queryBuilder->expr()->notIn( 'tx_tracking_pageview.pid', - $queryBuilder->createNamedParameter([ + $this->queryBuilder->createNamedParameter([ 1, 11, 38, @@ -91,9 +102,4 @@ class PageViewsPerPageDoughnut extends AbstractDoughnutChartWidget $data, ]; } - - private function getQueryBuilder(): QueryBuilder - { - return GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_tracking_pageview'); - } } diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index af77272..0d66960 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -7,17 +7,27 @@ services: DanielSiepmann\Tracking\: resource: '../Classes/*' - DanielSiepmann\DI\DatabaseConnection\Pageview: + # Virtual services + + DanielSiepmann\Tracking\DI\DatabaseConnection\Pageview: factory: - '@TYPO3\CMS\Core\Database\ConnectionPool' - 'getConnectionForTable' arguments: - 'tx_tracking_pageview' + DanielSiepmann\Tracking\DI\QueryBuilder\PageView: + factory: + - '@TYPO3\CMS\Core\Database\ConnectionPool' + - 'getQueryBuilderForTable' + arguments: + - 'tx_tracking_pageview' + + # Existing classes DanielSiepmann\Tracking\Domain\Repository\Pageview: public: true arguments: - - '@DanielSiepmann\DI\DatabaseConnection\Pageview' + - '@DanielSiepmann\Tracking\DI\DatabaseConnection\Pageview' DanielSiepmann\Tracking\Middleware\Pageview: public: true @@ -30,17 +40,21 @@ services: # Dashboard Widgets DanielSiepmann\Tracking\Dashboard\Widgets\PageViewsBar: - class: DanielSiepmann\Tracking\Dashboard\Widgets\PageViewsBar - arguments: [pageViewsBar] + class: 'DanielSiepmann\Tracking\Dashboard\Widgets\PageViewsBar' + arguments: + - 'pageViewsBar' + - '@DanielSiepmann\Tracking\DI\QueryBuilder\PageView' tags: - - name: dashboard.widget - identifier: pageViewsBar - widgetGroups: tracking + - name: 'dashboard.widget' + identifier: 'pageViewsBar' + widgetGroups: 'tracking' DanielSiepmann\Tracking\Dashboard\Widgets\PageViewsPerPageDoughnut: - class: DanielSiepmann\Tracking\Dashboard\Widgets\PageViewsPerPageDoughnut - arguments: [pageViewsPerPageDoughnut] + class: 'DanielSiepmann\Tracking\Dashboard\Widgets\PageViewsPerPageDoughnut' + arguments: + - 'pageViewsPerPageDoughnut' + - '@DanielSiepmann\Tracking\DI\QueryBuilder\PageView' tags: - - name: dashboard.widget - identifier: pageViewsPerPageDoughnut - widgetGroups: tracking + - name: 'dashboard.widget' + identifier: 'pageViewsPerPageDoughnut' + widgetGroups: 'tracking' diff --git a/readme.rst b/readme.rst new file mode 100644 index 0000000..a30f73b --- /dev/null +++ b/readme.rst @@ -0,0 +1,23 @@ +Todos +===== + +#. Add command that will iterate over all DB entries and remove ones matching the black list rule. + E.g. if rule is adjusted in meanwhile. + +#. Add further widgets. + + #. Top 404 requests (Collect them to show them). + + #. Grouped by user agents. + +#. Move bot detection to another rule. + + #. Keep indexing those requests, but mark them as bot and separate them in widgets. + + #. Provide an overview of crawls as widgets. E.g. to allow fine grained robots.txt. + +#. Add information to Admin Panel. + +#. Add operating System + + #. Another Symfony Expression which returns the OS ("Ubuntu", "Macintosh", "Android", "iPhone", "Windows")