Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
BIN
Documentation/Images/ListViewRecordviews.png
Normal file
After Width: | Height: | Size: 173 KiB |
BIN
Documentation/Images/RecordPageview.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
Documentation/Images/RecordRecordview.png
Normal file
After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 132 KiB |
BIN
Documentation/Images/Widgets/NewestPageviews.png
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
Documentation/Images/Widgets/PageviewsPerDay.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
Documentation/Images/Widgets/PageviewsPerOperatingSystem.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
Documentation/Images/Widgets/PageviewsPerPage.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
Documentation/Images/Widgets/Recordviews.png
Normal file
After Width: | Height: | Size: 26 KiB |
92
Documentation/Index.rst
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
.. _start:
|
||||||
|
|
||||||
|
==================
|
||||||
|
Tracking Extension
|
||||||
|
==================
|
||||||
|
|
||||||
|
A very simple server side tracking extension.
|
||||||
|
Initially developed for demonstration purposes.
|
||||||
|
Soon requested by customers in order to have privacy focused minimal tracking inside of TYPO3.
|
||||||
|
|
||||||
|
The extension provides built in tracking.
|
||||||
|
All requests are tracked right within TYPO3 as custom records.
|
||||||
|
|
||||||
|
The extension also delivers widgets for EXT:dashboard to visualize tracked information.
|
||||||
|
|
||||||
|
.. _goal:
|
||||||
|
|
||||||
|
Goal
|
||||||
|
----
|
||||||
|
|
||||||
|
This extension only provides very basic features and is not intended to resolve complex solutions like Google Analytics.
|
||||||
|
Yet it should provide the very minimum requirements to remove the need of such complex solutions on small websites.
|
||||||
|
|
||||||
|
.. figure:: /Images/Widgets.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Figure 1-1: Screenshot of how widgets might look, representing tracked information.
|
||||||
|
|
||||||
|
.. figure:: /Images/ListViewPageviews.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Figure 1-2: Screenshot of TYPO3 list view, showing records of tracked data.
|
||||||
|
|
||||||
|
Integrators should be able to configure more or less everything.
|
||||||
|
From collection to displaying via widgets.
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
The extension allows to track :ref:`pageview`,
|
||||||
|
as well as views to specific TYPO3 records via :ref:`recordview`,
|
||||||
|
e.g. records from EXT:news or EXT:tt_address.
|
||||||
|
|
||||||
|
Missing features
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Features that will not make it:
|
||||||
|
|
||||||
|
The extension does not limit reporting based on user access.
|
||||||
|
Foreign systems like Google Analytics also wouldn't know which pages or records an editor has access to.
|
||||||
|
|
||||||
|
Features that might be implemented in the future:
|
||||||
|
|
||||||
|
* Remove tracked records based on adjusted rule.
|
||||||
|
Right now results tracked will be kept.
|
||||||
|
If rules are adjusted, e.g. another bot is excluded, old entries will be kept.
|
||||||
|
In the future there might be an command that will reduce existing records based on current rules.
|
||||||
|
|
||||||
|
* Collecting information about referrers.
|
||||||
|
|
||||||
|
* Collecting information based on Events.
|
||||||
|
|
||||||
|
* Collecting information about URL parameters like campaigns or utm.
|
||||||
|
|
||||||
|
* Does not extract device types out of User Agents.
|
||||||
|
|
||||||
|
* Does not extract version of operating system.
|
||||||
|
|
||||||
|
* Has a very rough bot detection.
|
||||||
|
|
||||||
|
Differences to typical tracking solutions
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
This extension does not need any JavaScript or Cookies.
|
||||||
|
Tracking is happening on server side.
|
||||||
|
|
||||||
|
Therefore Client caching can prevent "requests" from being tracked.
|
||||||
|
But that can be seen as an "unique visitor" feature.
|
||||||
|
|
||||||
|
Also information like "how long did the user visit the page" are not available.
|
||||||
|
|
||||||
|
Therefore no data is passed to any 3rd Party or kept and made available.
|
||||||
|
Only internal information of TYPO3, such as Page or records, are tracked.
|
||||||
|
The only foreign information being tracked is the User Agent and URL,
|
||||||
|
in order to extract further information from them with future updates.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:hidden:
|
||||||
|
|
||||||
|
Installation
|
||||||
|
Pageview
|
||||||
|
Recordview
|
20
Documentation/Installation.rst
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
.. highlight:: bash
|
||||||
|
.. _installation:
|
||||||
|
|
||||||
|
============
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
Install the extension as usual via composer or some other way::
|
||||||
|
|
||||||
|
composer require danielsiepmann/tracking
|
||||||
|
|
||||||
|
There is no TypoScript included which needs to be included.
|
||||||
|
|
||||||
|
Instead further configuration via :file:`Services.yaml` is necessary.
|
||||||
|
The extension highly depends on the dependency injection feature introduced with TYPO3 v10.
|
||||||
|
|
||||||
|
Check corresponding sections about :ref:`pageview` and :ref:`recordview`.
|
||||||
|
|
||||||
|
The extension should work out of the box,
|
||||||
|
but should be configured to the specific installation.
|
86
Documentation/Pageview.rst
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
.. highlight:: yaml
|
||||||
|
.. _pageview:
|
||||||
|
|
||||||
|
========
|
||||||
|
Pageview
|
||||||
|
========
|
||||||
|
|
||||||
|
Each view of a TYPO3 page is tracked by default.
|
||||||
|
Requests can be ignored by configuring a rule that has to match the current request.
|
||||||
|
|
||||||
|
All configuration happens via :ref:`t3coreapi:DependencyInjection` inside of :file:`Services.yaml` of your Sitepackage.
|
||||||
|
|
||||||
|
.. figure:: /Images/ListViewPageviews.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Screenshot of list view of created "pageview" records.
|
||||||
|
|
||||||
|
.. figure:: /Images/RecordPageview.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Screenshot of edit form view of created "pageview" records.
|
||||||
|
|
||||||
|
Saved record
|
||||||
|
------------
|
||||||
|
|
||||||
|
Whenever a pageview is tracked, a new record is created.
|
||||||
|
The record can be viewed via TYPO3 list module. That way all collected information can be checked.
|
||||||
|
|
||||||
|
Configure tracking
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Let us examine an concrete example::
|
||||||
|
|
||||||
|
services:
|
||||||
|
_defaults:
|
||||||
|
autowire: true
|
||||||
|
autoconfigure: true
|
||||||
|
public: false
|
||||||
|
|
||||||
|
DanielSiepmann\Tracking\Middleware\Pageview:
|
||||||
|
public: true
|
||||||
|
arguments:
|
||||||
|
$rule: >
|
||||||
|
not (context.getAspect("backend.user").isLoggedIn())
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/^TYPO3|TYPO3 linkvalidator/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/^Codeception Testing/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/Wget|curl|Go-http-client/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/bot|spider|Slurp|Sogou|NextCloud-News|Feedly|XING FeedReader|SEOkicks|Seekport Crawler|ia_archiver|TrendsmapResolver|Nuzzel/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/mattermost|Slackbot|WhatsApp/")
|
||||||
|
|
||||||
|
The first paragraph will not be explained, check out :ref:`t3coreapi:configure-dependency-injection-in-extensions` instead.
|
||||||
|
|
||||||
|
The second paragraph is where the tracking is configured.
|
||||||
|
The PHP class ``DanielSiepmann\Tracking\Middleware\Pageview`` is registered as PHP middleware and will actually track the request.
|
||||||
|
Therefore this class is configured.
|
||||||
|
The only interesting argument to configure is ``$rule``,
|
||||||
|
which is a `Symfony Expression <https://symfony.com/doc/current/components/expression_language/syntax.html>`__.
|
||||||
|
The same is used by TYPO3 for TypoScript conditions and is not explained here.
|
||||||
|
|
||||||
|
This rule is evaluated to either ``true`` or ``false``,
|
||||||
|
where ``true`` means that the current request should be tracked.
|
||||||
|
|
||||||
|
The current request is available as ``Psr\Http\Message\ServerRequestInterface`` via ``request``,
|
||||||
|
while ``TYPO3\CMS\Core\Context\Context`` is available via ``context``.
|
||||||
|
That way it is possible to check all kind of information like frontend user, backend user or cookies and parameters,
|
||||||
|
as well as request header.
|
||||||
|
|
||||||
|
Check `PSR-7: HTTP message interfaces <https://www.php-fig.org/psr/psr-7/#321-psrhttpmessageserverrequestinterface>`__
|
||||||
|
as well as
|
||||||
|
:ref:`t3coreapi:context-api`.
|
||||||
|
|
||||||
|
The above example blocks tracking for requests with logged in backend user,
|
||||||
|
as well as specific user agents like bots, TYPO3 itself and other systems.
|
||||||
|
|
||||||
|
Widgets
|
||||||
|
-------
|
||||||
|
|
||||||
|
The extension does not provide any widgets, but providers for widgets of EXT:dashboard.
|
||||||
|
That way widgets of EXT:dashboard can be combined with all providers of this extension.
|
||||||
|
|
||||||
|
The concepts are not documented here, check :ref:`t3dashboard:start` instead.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
PageviewWidgets/*
|
58
Documentation/PageviewWidgets/NewestPageviews.rst
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
.. php:namespace:: DanielSiepmann\Tracking\Dashboard\Provider
|
||||||
|
.. program:: DanielSiepmann\Tracking\Dashboard\Provider\NewestPageviews
|
||||||
|
|
||||||
|
.. _newestpageviews:
|
||||||
|
|
||||||
|
===============
|
||||||
|
NewestPageviews
|
||||||
|
===============
|
||||||
|
|
||||||
|
Provides a list of the newest pageview entries.
|
||||||
|
|
||||||
|
Example
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. figure:: /Images/Widgets/NewestPageviews.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Default widget configuration.
|
||||||
|
|
||||||
|
:file:`Configuration/Services.yaml`::
|
||||||
|
|
||||||
|
services:
|
||||||
|
DanielSiepmann\Tracking\Dashboard\Provider\NewestPageviews:
|
||||||
|
arguments:
|
||||||
|
$queryBuilder: '@querybuilder.tx_tracking_pageview'
|
||||||
|
$blackListedPages: [1, 11, 38]
|
||||||
|
|
||||||
|
dashboard.widget.danielsiepmann.tracking.newestPageviews:
|
||||||
|
class: 'TYPO3\CMS\Dashboard\Widgets\ListWidget'
|
||||||
|
arguments:
|
||||||
|
$view: '@dashboard.views.widget'
|
||||||
|
$dataProvider: '@DanielSiepmann\Tracking\Dashboard\Provider\NewestPageviews'
|
||||||
|
tags:
|
||||||
|
- name: 'dashboard.widget'
|
||||||
|
identifier: 'newestPageviewsList'
|
||||||
|
groupNames: 'tracking'
|
||||||
|
iconIdentifier: 'content-widget-list'
|
||||||
|
title: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.newestPageviewsList.title'
|
||||||
|
description: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.newestPageviewsList.description'
|
||||||
|
height: 'medium'
|
||||||
|
width: 'small'
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. option:: $maxResults
|
||||||
|
|
||||||
|
Integer defining how many results should be displayed.
|
||||||
|
Defaults to 6.
|
||||||
|
|
||||||
|
.. option:: $blackListedPages
|
||||||
|
|
||||||
|
Array of page uids that should not be collected.
|
||||||
|
Defaults to empty array, all pages are shown.
|
||||||
|
|
||||||
|
This becomes handy if certain pages are called in order to show specific records.
|
||||||
|
In those cases the pages will be called very often but don't provide much benefit and can be excluded.
|
||||||
|
Use this in combination with :ref:`recordview` to show the records instead.
|
67
Documentation/PageviewWidgets/PageviewsPerDay.rst
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
.. php:namespace:: DanielSiepmann\Tracking\Dashboard\Provider
|
||||||
|
.. program:: DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerDay
|
||||||
|
|
||||||
|
.. _pageviewsperday:
|
||||||
|
|
||||||
|
===============
|
||||||
|
PageviewsPerDay
|
||||||
|
===============
|
||||||
|
|
||||||
|
Provides the total page calls on the last x days.
|
||||||
|
This way editors can see how many total requests were made at specific dates.
|
||||||
|
|
||||||
|
Example
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. figure:: /Images/Widgets/PageviewsPerDay.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Default widget configuration.
|
||||||
|
|
||||||
|
:file:`Configuration/Services.yaml`::
|
||||||
|
|
||||||
|
services:
|
||||||
|
DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerDay:
|
||||||
|
arguments:
|
||||||
|
$queryBuilder: '@querybuilder.tx_tracking_pageview'
|
||||||
|
$blackListedPages: [1, 11, 38]
|
||||||
|
|
||||||
|
dashboard.widget.danielsiepmann.tracking.pageViewsPerDay:
|
||||||
|
class: 'TYPO3\CMS\Dashboard\Widgets\BarChartWidget'
|
||||||
|
arguments:
|
||||||
|
$view: '@dashboard.views.widget'
|
||||||
|
$dataProvider: '@DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerDay'
|
||||||
|
tags:
|
||||||
|
- name: 'dashboard.widget'
|
||||||
|
identifier: 'pageViewsBar'
|
||||||
|
groupNames: 'tracking'
|
||||||
|
iconIdentifier: 'content-widget-chart-bar'
|
||||||
|
title: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.pageViewsBar.title'
|
||||||
|
description: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.pageViewsBar.description'
|
||||||
|
additionalCssClasses: 'dashboard-item--chart'
|
||||||
|
height: 'medium'
|
||||||
|
width: 'small'
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. option:: $days
|
||||||
|
|
||||||
|
Integer defining the number of days to respect.
|
||||||
|
|
||||||
|
Defaults to 31.
|
||||||
|
|
||||||
|
.. option:: $blackListedPages
|
||||||
|
|
||||||
|
Array of page uids that should not be collected.
|
||||||
|
Defaults to empty array, all pages are shown.
|
||||||
|
|
||||||
|
This becomes handy if certain pages are called in order to show specific records.
|
||||||
|
In those cases the pages will be called very often but don't provide much benefit and can be excluded.
|
||||||
|
Use this in combination with :ref:`recordview` to show the records instead.
|
||||||
|
|
||||||
|
.. option:: $dateFormat
|
||||||
|
|
||||||
|
String defining the format used for labels.
|
||||||
|
|
||||||
|
Defaults to 'Y-m-d'.
|
|
@ -0,0 +1,59 @@
|
||||||
|
.. php:namespace:: DanielSiepmann\Tracking\Dashboard\Provider
|
||||||
|
.. program:: DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerOperatingSystem
|
||||||
|
|
||||||
|
.. _pageviewsperoperatingsystem:
|
||||||
|
|
||||||
|
===========================
|
||||||
|
PageviewsPerOperatingSystem
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Provides the total calls on a operating system level.
|
||||||
|
This way editors can see which operating systems most visitors use.
|
||||||
|
|
||||||
|
Example
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. figure:: /Images/Widgets/PageviewsPerOperatingSystem.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Default widget configuration.
|
||||||
|
|
||||||
|
:file:`Configuration/Services.yaml`::
|
||||||
|
|
||||||
|
services:
|
||||||
|
DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerOperatingSystem:
|
||||||
|
arguments:
|
||||||
|
$queryBuilder: '@querybuilder.tx_tracking_pageview'
|
||||||
|
$days: 62
|
||||||
|
|
||||||
|
dashboard.widget.danielsiepmann.tracking.operatingSystems:
|
||||||
|
class: 'TYPO3\CMS\Dashboard\Widgets\DoughnutChartWidget'
|
||||||
|
arguments:
|
||||||
|
$view: '@dashboard.views.widget'
|
||||||
|
$dataProvider: '@DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerOperatingSystem'
|
||||||
|
tags:
|
||||||
|
- name: 'dashboard.widget'
|
||||||
|
identifier: 'operatingSystemsDoughnut'
|
||||||
|
groupNames: 'tracking'
|
||||||
|
iconIdentifier: 'content-widget-chart-pie'
|
||||||
|
title: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.operatingSystemsDoughnut.title'
|
||||||
|
description: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.operatingSystemsDoughnut.description'
|
||||||
|
additionalCssClasses: 'dashboard-item--chart'
|
||||||
|
height: 'medium'
|
||||||
|
width: 'small'
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. option:: $days
|
||||||
|
|
||||||
|
Integer defining the number of days to respect.
|
||||||
|
|
||||||
|
Defaults to 31.
|
||||||
|
|
||||||
|
.. option:: $maxResults
|
||||||
|
|
||||||
|
Integer defining how many pages should be shown.
|
||||||
|
Defaults to 6 because EXT:dashboard only provides 6 colors.
|
||||||
|
|
||||||
|
Defaults to 6.
|
68
Documentation/PageviewWidgets/PageviewsPerPage.rst
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
.. php:namespace:: DanielSiepmann\Tracking\Dashboard\Provider
|
||||||
|
.. program:: DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerPage
|
||||||
|
|
||||||
|
.. _pageviewsperpage:
|
||||||
|
|
||||||
|
================
|
||||||
|
PageviewsPerPage
|
||||||
|
================
|
||||||
|
|
||||||
|
Provides the total calls on a per page level.
|
||||||
|
This way editors can see which pages were requested the most during a specified period.
|
||||||
|
|
||||||
|
Example
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. figure:: /Images/Widgets/PageviewsPerPage.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Default widget configuration.
|
||||||
|
|
||||||
|
:file:`Configuration/Services.yaml`::
|
||||||
|
|
||||||
|
services:
|
||||||
|
DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerPage:
|
||||||
|
arguments:
|
||||||
|
$queryBuilder: '@querybuilder.tx_tracking_pageview'
|
||||||
|
$blackListedPages: [1, 11, 38]
|
||||||
|
|
||||||
|
dashboard.widget.danielsiepmann.tracking.pageViewsPerPage:
|
||||||
|
class: 'TYPO3\CMS\Dashboard\Widgets\DoughnutChartWidget'
|
||||||
|
arguments:
|
||||||
|
$view: '@dashboard.views.widget'
|
||||||
|
$dataProvider: '@DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerPage'
|
||||||
|
tags:
|
||||||
|
- name: 'dashboard.widget'
|
||||||
|
identifier: 'pageViewsPerPageDoughnut'
|
||||||
|
groupNames: 'tracking'
|
||||||
|
iconIdentifier: 'content-widget-chart-bar'
|
||||||
|
title: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.pageViewsPerPageDoughnut.title'
|
||||||
|
description: 'LLL:EXT:tracking/Resources/Private/Language/locallang.xlf:dashboard.widgets.pageViewsPerPageDoughnut.description'
|
||||||
|
additionalCssClasses: 'dashboard-item--chart'
|
||||||
|
height: 'medium'
|
||||||
|
width: 'small'
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. option:: $days
|
||||||
|
|
||||||
|
Integer defining the number of days to respect.
|
||||||
|
|
||||||
|
Defaults to 31.
|
||||||
|
|
||||||
|
.. option:: $maxResults
|
||||||
|
|
||||||
|
Integer defining how many pages should be shown.
|
||||||
|
Defaults to 6 because EXT:dashboard only provides 6 colors.
|
||||||
|
|
||||||
|
Defaults to 6.
|
||||||
|
|
||||||
|
.. option:: $blackListedPages
|
||||||
|
|
||||||
|
Array of page uids that should not be collected.
|
||||||
|
Defaults to empty array, all pages are shown.
|
||||||
|
|
||||||
|
This becomes handy if certain pages are called in order to show specific records.
|
||||||
|
In those cases the pages will be called very often but don't provide much benefit and can be excluded.
|
||||||
|
Use this in combination with :ref:`recordview` to show the records instead.
|
100
Documentation/Recordview.rst
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
.. _recordview:
|
||||||
|
|
||||||
|
==========
|
||||||
|
Recordview
|
||||||
|
==========
|
||||||
|
|
||||||
|
Many installations will have custom records beside TYPO3 pages.
|
||||||
|
E.g. one uses EXT:news or EXT:tt_address to display news or personal information.
|
||||||
|
|
||||||
|
Those typically are displayed via a Plugin content element leading to the same Page
|
||||||
|
for all records.
|
||||||
|
This part allows to track views of individual records.
|
||||||
|
|
||||||
|
All configuration happens via :ref:`t3coreapi:DependencyInjection` inside of :file:`Services.yaml` of your Sitepackage.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
In contrast to :ref:`pageview`, there is no default rule.
|
||||||
|
No record is tracked by default as no TYPO3 installation has any default records to track.
|
||||||
|
|
||||||
|
In order to start tracking records, the rules need to be configured.
|
||||||
|
|
||||||
|
.. figure:: /Images/ListViewRecordviews.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Screenshot of list view of created "recordview" records.
|
||||||
|
|
||||||
|
.. figure:: /Images/RecordRecordview.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Screenshot of edit form view of created "recordview" records.
|
||||||
|
|
||||||
|
Saved record
|
||||||
|
------------
|
||||||
|
|
||||||
|
Whenever a recordview is tracked, a new record is created.
|
||||||
|
The record can be viewed via TYPO3 list module. That way all collected information can be checked.
|
||||||
|
|
||||||
|
Configure tracking
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Let us examine an concrete example::
|
||||||
|
|
||||||
|
services:
|
||||||
|
_defaults:
|
||||||
|
autowire: true
|
||||||
|
autoconfigure: true
|
||||||
|
public: false
|
||||||
|
|
||||||
|
DanielSiepmann\Tracking\Middleware\Recordview:
|
||||||
|
public: true
|
||||||
|
arguments:
|
||||||
|
$rules:
|
||||||
|
topics:
|
||||||
|
matches: >
|
||||||
|
request.getQueryParams()["topic_id"] > 0
|
||||||
|
and not (context.getAspect("backend.user").isLoggedIn())
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/^TYPO3|TYPO3 linkvalidator/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/^Codeception Testing/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/Wget|curl|Go-http-client/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/bot|spider|Slurp|Sogou|NextCloud-News|Feedly|XING FeedReader|SEOkicks|Seekport Crawler|ia_archiver|TrendsmapResolver|Nuzzel/")
|
||||||
|
and not (request.getHeader("User-Agent")[0] matches "/mattermost|Slackbot|WhatsApp/")
|
||||||
|
recordUid: 'request.getQueryParams()["topic_id"]'
|
||||||
|
tableName: 'sys_category'
|
||||||
|
|
||||||
|
The first paragraph will not be explained, check out :ref:`t3coreapi:configure-dependency-injection-in-extensions` instead.
|
||||||
|
|
||||||
|
The second paragraph is where the tracking is configured.
|
||||||
|
The PHP class ``DanielSiepmann\Tracking\Middleware\Recordview`` is registered as PHP middleware and will actually track the request.
|
||||||
|
Therefore this class is configured.
|
||||||
|
The only interesting argument to configure is ``$rules``.
|
||||||
|
The argument itself is an array. That way one can configure multiple rules, e.g. one per record.
|
||||||
|
The above example includes a single rule for ``topics``, but further can be added.
|
||||||
|
|
||||||
|
Each rule has the following options which are all mandatory:
|
||||||
|
|
||||||
|
``matches``
|
||||||
|
A Symfony Expression, which is used to check whether the current rule should be processed for current request.
|
||||||
|
Check :ref:`pageview` to get further information, as it is the same implementation and concept.
|
||||||
|
|
||||||
|
``recordUid``
|
||||||
|
A Symfony Expression, which is used to fetch the UID of the actual record from current request.
|
||||||
|
Only the request itself is provided within the expression.
|
||||||
|
Check `PSR-7: HTTP message interfaces <https://www.php-fig.org/psr/psr-7/#321-psrhttpmessageserverrequestinterface>`__.
|
||||||
|
|
||||||
|
``tableName``
|
||||||
|
A simple string which defines the actual database table name where records are stored.
|
||||||
|
|
||||||
|
Widgets
|
||||||
|
-------
|
||||||
|
|
||||||
|
The extension does not provide any widgets, but providers for widgets of EXT:dashboard.
|
||||||
|
That way widgets of EXT:dashboard can be combined with all providers of this extension.
|
||||||
|
|
||||||
|
The concepts are not documented here, check :ref:`t3dashboard:start` instead.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
RecordviewWidgets/*
|
103
Documentation/RecordviewWidgets/Recordviews.rst
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
.. php:namespace:: DanielSiepmann\Tracking\Dashboard\Provider
|
||||||
|
.. program:: DanielSiepmann\Tracking\Dashboard\Provider\Recordviews
|
||||||
|
|
||||||
|
.. _recordviews:
|
||||||
|
|
||||||
|
===========
|
||||||
|
Recordviews
|
||||||
|
===========
|
||||||
|
|
||||||
|
Provides the total views of configured records.
|
||||||
|
This way editors can see which records were requested the most during a specified period.
|
||||||
|
|
||||||
|
Example
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. figure:: /Images/Widgets/Recordviews.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
In contrast to :ref:`pageview`, there is no default rule.
|
||||||
|
No record is tracked by default as no TYPO3 installation has any default records to track.
|
||||||
|
|
||||||
|
In order to start tracking records, the rules need to be configured.
|
||||||
|
|
||||||
|
Example widget configuration.
|
||||||
|
|
||||||
|
:file:`Configuration/Services.yaml`::
|
||||||
|
|
||||||
|
services:
|
||||||
|
dashboard.provider.danielsiepmann.tracking.records.topics:
|
||||||
|
class: 'DanielSiepmann\Tracking\Dashboard\Provider\Recordviews'
|
||||||
|
arguments:
|
||||||
|
$queryBuilder: '@querybuilder.tx_tracking_recordview'
|
||||||
|
$recordTableLimitation: ['sys_category']
|
||||||
|
|
||||||
|
dashboard.widget.danielsiepmann.tracking.records.topics:
|
||||||
|
class: 'TYPO3\CMS\Dashboard\Widgets\DoughnutChartWidget'
|
||||||
|
arguments:
|
||||||
|
$view: '@dashboard.views.widget'
|
||||||
|
$dataProvider: '@dashboard.provider.danielsiepmann.tracking.records.topics'
|
||||||
|
tags:
|
||||||
|
- name: 'dashboard.widget'
|
||||||
|
identifier: 'topicsDoughnut'
|
||||||
|
groupNames: 'tracking'
|
||||||
|
iconIdentifier: 'content-widget-chart-pie'
|
||||||
|
title: 'Topics'
|
||||||
|
description: 'Shows which topics are called most'
|
||||||
|
additionalCssClasses: 'dashboard-item--chart'
|
||||||
|
height: 'medium'
|
||||||
|
width: 'small'
|
||||||
|
|
||||||
|
Each widget should be a combination of an configured provider as well as an widget from EXT:dashboard.
|
||||||
|
The provider delivers results for all chart widgets.
|
||||||
|
|
||||||
|
The above example configures the provider first,
|
||||||
|
followed by an widget using the provider to display top topics.
|
||||||
|
|
||||||
|
Only the provider is documented, as the widget is part of EXT:dashboard.
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. option:: $days
|
||||||
|
|
||||||
|
Integer defining the number of days to respect.
|
||||||
|
|
||||||
|
Defaults to 31.
|
||||||
|
|
||||||
|
.. option:: $maxResults
|
||||||
|
|
||||||
|
Integer defining how many pages should be shown.
|
||||||
|
Defaults to 6 because EXT:dashboard only provides 6 colors.
|
||||||
|
|
||||||
|
Defaults to 6.
|
||||||
|
|
||||||
|
.. option:: $pagesToExclude
|
||||||
|
|
||||||
|
Array of page uids that should not be collected.
|
||||||
|
Defaults to empty array, all pages are shown.
|
||||||
|
|
||||||
|
This can be used if records are delivered through different pages.
|
||||||
|
This way news records can be filtered e.g. by limiting to press or internal news plugin pages.
|
||||||
|
|
||||||
|
.. option:: $recordTableLimitation
|
||||||
|
|
||||||
|
Array of database table names.
|
||||||
|
Defaults to empty array, records from all tables are shown.
|
||||||
|
|
||||||
|
Allows to limit the resulting records to specific tables.
|
||||||
|
E.g. only show records of ``sys_category`` or ``tt_address``.
|
||||||
|
|
||||||
|
.. option:: $recordTypeLimitation
|
||||||
|
|
||||||
|
Array of record types.
|
||||||
|
Defaults to empty array, records of all types are shown.
|
||||||
|
|
||||||
|
TYPO3 allows to define a types field per database table.
|
||||||
|
E.g. ``doktype`` for ``pages`` table, or ``CType`` for ``tt_content``.
|
||||||
|
That way different sub types of the same record can be stored.
|
||||||
|
|
||||||
|
Using this option offers a way to limit records e.g. to specific types of news or
|
||||||
|
address records.
|
16
Documentation/Settings.cfg
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[general]
|
||||||
|
project = Tracking Extension
|
||||||
|
release = 1.0.0
|
||||||
|
copyright = since 2020 by Daniel Siepmann
|
||||||
|
|
||||||
|
[html_theme_options]
|
||||||
|
github_branch = main
|
||||||
|
github_repository = DanielSiepmann/tracking
|
||||||
|
|
||||||
|
project_home = https://daniel-siepmann.de/projects/typo3-extension-tracking.html
|
||||||
|
project_issues = https://github.com/DanielSiepmann/tracking/issues/
|
||||||
|
project_repository = https://github.com/DanielSiepmann/tracking/
|
||||||
|
|
||||||
|
[intersphinx_mapping]
|
||||||
|
t3coreapi = https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/
|
||||||
|
t3dashboard = https://docs.typo3.org/c/typo3/cms-dashboard/master/en-us/
|
31
readme.rst
|
@ -37,35 +37,8 @@ EXT:dashboard
|
||||||
Todos
|
Todos
|
||||||
=====
|
=====
|
||||||
|
|
||||||
#. Add 100% code coverage (Widgets are missing)
|
|
||||||
|
|
||||||
#. Add version matrix to test with multiple PHP versions.
|
#. Add version matrix to test with multiple PHP versions.
|
||||||
|
|
||||||
#. Add campaigns if possible (twitter parameter, etc.)
|
|
||||||
|
|
||||||
#. Add referrer if available.
|
|
||||||
|
|
||||||
#. Add device type phone, tablet, desktop?
|
|
||||||
|
|
||||||
#. Add operating system version?
|
|
||||||
|
|
||||||
#. Add further widgets.
|
|
||||||
|
|
||||||
#. Grouped by user agents (bar).
|
|
||||||
|
|
||||||
#. Top 404 requests (Collect them to show them, doughnut).
|
|
||||||
|
|
||||||
#. 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 command that will iterate over all DB entries and remove ones matching the black list rule.
|
|
||||||
E.g. if rule is adjusted in meanwhile.
|
|
||||||
|
|
||||||
Example
|
Example
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
@ -75,4 +48,6 @@ The following widgets are added and could look like:
|
||||||
|
|
||||||
A new record is added which looks like:
|
A new record is added which looks like:
|
||||||
|
|
||||||
.. image:: Documentation/Images/ListView.png
|
.. image:: Documentation/Images/ListViewPageviews.png
|
||||||
|
|
||||||
|
.. image:: Documentation/Images/RecordRecordview.png
|
||||||
|
|