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 

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 1-1: Screenshot of how widgets might look, representing tracked information.

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 Pageview, as well as views to specific TYPO3 records via 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.

Installation 

Install the extension as usual via composer or some other way:

composer require danielsiepmann/tracking
Copied!

There is no TypoScript included which needs to be included.

Instead further configuration via Services.yaml is necessary. The extension highly depends on the dependency injection feature introduced with TYPO3 v10.

Ensure you have a dependency from your extension providing configuration via Services.yaml to this extension. Otherwise loading order might be wrong and custom configuration within Services.yaml might not work.

Check corresponding sections about Pageview and Recordview.

The extension should work out of the box, but should be configured to the specific installation.

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 Dependency injection inside of Services.yaml of your Sitepackage.

Screenshot of list view of created "pageview" records.

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 (context.getAspect("frontend.preview").isPreview())
          and traverse(request.getHeader("User-Agent"), '0')
          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/")
Copied!

The first paragraph will not be explained, check out Configuration 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. 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 as well as Context API and aspects.

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 t3dashboard:start instead.

.. program:: DanielSiepmann\Tracking\Dashboard\Provider\NewestPageviews

NewestPageviews 

Provides a list of the newest pageview entries.

Example 

Default widget configuration.

Configuration/Services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  DanielSiepmann\Tracking\Dashboard\Provider\NewestPageviews:
    arguments:
      $queryBuilder: '@querybuilder.tx_tracking_pageview'
      $pagesToExclude: [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'
Copied!

Options 

$maxResults

Integer defining how many results should be displayed. Defaults to 6.

$pagesToExclude

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 Recordview to show the records instead.

$languageLimitation

Array of sys_language_uid's to include. Defaults to empty array, all languages are shown.

Allows to limit results to specific lanuages. All entries tracked when visiting page with this language are shown. If multiple languages are shown, default system language labels are used. If only a single lanugage is allowed, record labels are translated to that language.

.. program:: DanielSiepmann\Tracking\Dashboard\Provider\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 

Default widget configuration.

Configuration/Services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerDay:
    arguments:
      $queryBuilder: '@querybuilder.tx_tracking_pageview'
      $pagesToExclude: [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'
        height: 'medium'
        width: 'small'
Copied!

Options 

$days

Integer defining the number of days to respect.

Defaults to 31.

$pagesToExclude

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 Recordview to show the records instead.

$dateFormat

String defining the format used for labels.

Defaults to 'Y-m-d'.

$languageLimitation

Array of sys_language_uid's to include. Defaults to empty array, all languages are shown.

Allows to limit results to specific lanuages. All entries tracked when visiting page with this language are shown. If multiple languages are shown, default system language labels are used. If only a single lanugage is allowed, record labels are translated to that language.

.. program:: DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerOperatingSystem

PageviewsPerOperatingSystem 

Provides the total calls on a operating system level. This way editors can see which operating systems most visitors use.

Example 

Default widget configuration.

Configuration/Services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  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'
        height: 'medium'
        width: 'small'
Copied!

Options 

$days

Integer defining the number of days to respect.

Defaults to 31.

$maxResults

Integer defining how many pages should be shown. Defaults to 6 because EXT:dashboard only provides 6 colors.

Defaults to 6.

$languageLimitation

Array of sys_language_uid's to include. Defaults to empty array, all languages are shown.

Allows to limit results to specific lanuages. All entries tracked when visiting page with this language are shown. If multiple languages are shown, default system language labels are used. If only a single lanugage is allowed, record labels are translated to that language.

.. program:: DanielSiepmann\Tracking\Dashboard\Provider\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 

Default widget configuration.

Configuration/Services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  DanielSiepmann\Tracking\Dashboard\Provider\PageviewsPerPage:
    arguments:
      $queryBuilder: '@querybuilder.tx_tracking_pageview'
      $pagesToExclude: [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'
        height: 'medium'
        width: 'small'
Copied!

Options 

$days

Integer defining the number of days to respect.

Defaults to 31.

$maxResults

Integer defining how many pages should be shown. Defaults to 6 because EXT:dashboard only provides 6 colors.

Defaults to 6.

$pagesToExclude

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 Recordview to show the records instead.

$languageLimitation

Array of sys_language_uid's to include. Defaults to empty array, all languages are shown.

Allows to limit results to specific lanuages. All entries tracked when visiting page with this language are shown. If multiple languages are shown, default system language labels are used. If only a single lanugage is allowed, record labels are translated to that language.

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 Dependency injection inside of Services.yaml of your Sitepackage.

Screenshot of list view of created "recordview" records.

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:
        news:
          matches: >
              traverse(request.getQueryParams(), "tx_news_pi1/news") > 0
              and not (context.getAspect("backend.user").isLoggedIn())
              and not (context.getAspect("frontend.preview").isPreview())
              and traverse(request.getHeader("User-Agent"), '0')
              and not (request.getHeader("User-Agent")[0] matches "/^TYPO3|TYPO3 linkvalidator/")
              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: 'traverse(request.getQueryParams(), "tx_news_pi1/news")'
          tableName: 'tx_news_domain_model_news'
Copied!

The first paragraph will not be explained, check out Configuration 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 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.
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 t3dashboard:start instead.

.. program:: DanielSiepmann\Tracking\Dashboard\Provider\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 

Example widget configuration.

Configuration/Services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  dashboard.provider.danielsiepmann.tracking.records.news:
    class: 'DanielSiepmann\Tracking\Dashboard\Provider\Recordviews'
    arguments:
      $queryBuilder: '@querybuilder.tx_tracking_recordview'
      $recordTableLimitation: ['tx_news_domain_model_news']

  dashboard.widget.danielsiepmann.tracking.records.news:
    class: 'TYPO3\CMS\Dashboard\Widgets\DoughnutChartWidget'
    arguments:
      $view: '@dashboard.views.widget'
      $dataProvider: '@dashboard.provider.danielsiepmann.tracking.records.news'
    tags:
      - name: 'dashboard.widget'
        identifier: 'newsDoughnut'
        groupNames: 'tracking'
        iconIdentifier: 'content-widget-chart-pie'
        title: 'News'
        description: 'Shows which news are called most'
        height: 'medium'
        width: 'small'
Copied!

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 

$days

Integer defining the number of days to respect.

Defaults to 31.

$maxResults

Integer defining how many pages should be shown. Defaults to 6 because EXT:dashboard only provides 6 colors.

Defaults to 6.

$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.

$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.

$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.

$languageLimitation

Array of sys_language_uid's to include. Defaults to empty array, all languages are shown.

Allows to limit results to specific lanuages. All entries tracked when visiting page with this language are shown. If multiple languages are shown, default system language labels are used. If only a single lanugage is allowed, record labels are translated to that language.

Maintenance 

List of changes that need to be done for maintenance reasons. Those affect the extension itself, not users of the extension.

E.g. changes once we drop a certain TYPO3 version. We might have new code backported for compatibility in older TYPO3 versions. Those changes are documented so we know what to do once we drop an older version.

V12 

Remove new DataHandler() calls.

Changelog 

3.2.0 

Breaking 

Nothing

Features 

  • Add PHP 8.5 support.

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

3.1.2 

Breaking 

Nothing

Features 

Nothing

Fixes 

  • Fix TYPO3 13.4.14 breaking change leading to Invalid service "*": method "TYPO3\CMS\Dashboard\Widgets\WidgetConfiguration::__construct()" has no argument named "$additionalCssClasses". Check your service definition.

    Manual changes might be necessary. Remove the no longer existing $additionalCssClasses from your own service configuration in case you have any. See related core Git commit introducing the change: https://git.typo3.org/typo3/typo3/-/commit/b05a0d5d01c

Tasks 

Nothing

Deprecation 

Nothing

3.1.1 

Breaking 

Nothing

Features 

Nothing

Fixes 

  • Exclude tables from reference index.

    The tables can grow very fast depending on the number of visiting. Also some installations keep the records for a long time. That would make it nearly impossible to properly update the reference index. Therefore the extension now excludes their tables by default.

    One can prevent this, by removing the event listener e.g. via custom Services.* files.

Tasks 

Nothing

Deprecation 

Nothing

3.1.0 

Breaking 

Nothing

Features 

  • Add support for PHP 8.4.

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

3.0.0 

Breaking 

  • Drop support for TYPO3 v11. We only support last two TYPO3 versions.
  • Drop ext_emconf.php this probably will remove support for none composer setups.

Features 

  • Add Support for TYPO3 v13.

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

2.5.1 

Breaking 

Nothing

Features 

Fixes 

Nothing

Tasks 

  • Ignore PHP version when executing cs fixer. As cs fixer officially does not seem to support PHP 8.2 yet.
  • Make sql within tests on CI more robust. Wait until server has started before executing tests.
  • Migrate test fixtures to PHP Data Sets using codappix/typo3-php-datasets
  • Remove false positives of extension scanner in v12.
  • Remove TCA migrations in v12. Stay compatible with v11 via condition within code.

Deprecation 

Nothing

2.5.0 

Breaking 

Nothing

Features 

  • Ignore Uptime-Kuma bot by default. Thanks to Kay Strobach. Add tests to cover default ignores.

Fixes 

Nothing

Tasks 

  • Add shell.nix to ease local development.
  • Streamline composer.json Ensure packages are sorted. Ensure no composer.lock is created.
  • Remove leftovers of rector We don't need to carry those files if we don't use them right now.
  • Migrate to php-cs-fixer That way this projects follows best practices and is streamlined to other projects.

Deprecation 

Nothing

2.4.0 

Breaking 

Nothing

Features 

  • Support TYPO3 12.4.

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

2.3.0 

Breaking 

Nothing

Features 

  • Support TYPO3 12.3.

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

2.2.0 

Breaking 

Nothing

Features 

  • Support TYPO3 12.2.

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

2.1.0 

Breaking 

Nothing

Features 

  • Support PHP 8.2

Fixes 

Nothing

Tasks 

  • Remove further files from distribution to not clutter target systems.

Deprecation 

Nothing

2.0.0 

Breaking 

  • Support TYPO3 v12.1, drop v10. We only support last two TYPO3 versions. Bugfixes and Security will be available for v10 and v11. New features and breaking changes will only be available for v12.1 and v11.5 from now on.
  • searchFields for records got removed. This should speed up your instance TYPO3 backend search. Feel free to add necessary fields by overwriting TCA yourself.

Features 

Nothing

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

1.4.0 

Breaking 

Nothing

Features 

  • Support PHP 8.1

Fixes 

Nothing

Tasks 

  • Prevent unnecessary files from distribution

    Use .gitattributes to tell git what to ignore during exports. This will prevent GitHub from adding those files to an archive.

    Composer will use the GitHub archive as distribution while downloading.

    This prevents none necessary files on production systems. This also reduces file size of archive and should save disk space and other resources.

Deprecation 

Nothing

1.3.0 

Breaking 

Nothing

Features 

  • Introduce new traverse() function for rules. The function is taken from TYPO3, documentation can be found here: https://docs.typo3.org/m/typo3/reference-typoscript/11.5/en-us/Conditions/Index.html#traverse Rules provided by extension are adjusted.

    The new function allows for save array access in order to prevent issues in recent PHP versions with undefined array keys.

    The important change was:

    diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml
    index 1aaec24..df8bb13 100644
    --- a/Configuration/Services.yaml
    +++ b/Configuration/Services.yaml
    @@ -59,7 +59,7 @@ services:
           $rule: >
               not (context.getAspect("backend.user").isLoggedIn())
               and not (context.getAspect("frontend.preview").isPreview())
    -          and request.getHeader("User-Agent")[0]
    +          and traverse(request.getHeader("User-Agent"), '0')
               and not (request.getHeader("User-Agent")[0] matches "/^TYPO3|TYPO3 linkvalidator/")
               and not (request.getHeader("User-Agent")[0] matches "/Wget|curl|Go-http-client/")
               and not (request.getHeader("User-Agent")[0] matches "/Googlebot|Bingbot|bingbot|Slurp|DuckDuckBot|Baiduspider|YandexBot|Sogou|Exabot|NextCloud-News|Feedly|XING FeedReader|CCBot|SemrushBot|SEOkicks|Twitterbot|Seekport Crawler|SemanticScholarBot|ia_archiver|PaperLiBot|TrendsmapResolver|AhrefsBot|Nuzzel/")
    Copied!

    Same for other array accesses, e.g recordUid of Recordview:

    recordUid: 'traverse(request.getQueryParams(), "tx_news_pi1/news")'
    Copied!

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

1.2.0 

Breaking 

Nothing

Features 

  • Ignore UptimeRobot and Pingdom requests by default. Those requests were added to the Services.yaml file, preventing default installations from being spammed by those requests.

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

1.1.6 

Breaking 

Nothing

Features 

Nothing

Fixes 

  • Do not break Symfony Expression Language in case no user agent is provided. Some requests might ommit the user agent header. The default configuration for tracking pageviews would result in an error raised from Symfony Expression Language.

    This got fixed as the existence is checked first, before comparing against agents that should not be tracked.

    You should check your own rules if you defined any, see: Pageview as well as Recordview.

    The raised error looks like this on my own website:

    Core: Exception handler (WEB): Uncaught TYPO3 Exception: Argument 2 passed to SymfonyComponentExpressionLanguageNodeBinaryNode::evaluateMatches() must be of the type string, null given, called in vendor/symfony/expression-language/Node/BinaryNode.php on line 167 | TypeError thrown in file vendor/symfony/expression-language/Node/BinaryNode.php in line 176. Requested URL: https://daniel-siepmann.localhost/

Tasks 

Nothing

Deprecation 

Nothing

1.1.5 

Breaking 

Nothing

Features 

Nothing

Fixes 

  • Fix broken performance of list module. TYPO3 queries information of translations. The fix adds database indices which are also applied for tt_content by TYPO3 itself. This fixes slow loading times of the list module.

Tasks 

Nothing

Deprecation 

Nothing

1.1.4 

Breaking 

  • No longer support v11.4 but v11.5

    As this is now LTS version of v11. Only LTS public release is supported.

Features 

Nothing

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

1.1.3 

Breaking 

  • No longer support v11.3 but v11.4

    As this is latest release of v11 dev. Only latest public release is supported.

Features 

Nothing

Fixes 

Nothing

Tasks 

Nothing

Deprecation 

Nothing

1.1.2 

Breaking 

  • No longer support v11.2 but v11.3

    As this is latest release of v11 dev. Only latest public release is supported.

Features 

  • Support TYPO3 v10 running PHP version 7.3. CI is extended to execute tests and checks with new possible combinations.

    CI is also extended to test with multiple MySQL versions which depend on concrete PHP version.

    Resolves: forge#69.

    Sponsored by: https://www.werkraum-media.de/

Fixes 

  • Improve performance of widgets with large datasets

    A new database index is added which is used by widget queries. This can reduce the calculation time of database based on dataset. One concrete project reduced from > 5 seconds to below 0.2 seconds.

    This mainly improves the PageviewsPerPage widget.

    PageviewsPerDay is fixed by altering the whole query to fetch all data in a performant way. A single query with native group by date is issued, instead of a single query per day.

    Resolves: forge#63.

    Sponsored by: https://www.werkraum-media.de/

Tasks 

Nothing

Deprecation 

Nothing

1.1.1 

Breaking 

Nothing

Features 

Nothing

Fixes 

  • Allow copy of pages

    Pages can not be copied by administrators as DataHandler will copy all pages, including tx_tracking_* tables. Those are not allowed on tables which will result in error messages.

    A test is added to simulate the action and ensure it doesn't fail with errors.

    Resolves: forge#52.

Tasks 

  • Mark extension as stable within extension manager

    This extension is already stable. It is used since a year in multiple production systems. Don't provide a bad feeling to integrators and users.

  • Add missing changelog for 1.1.0
  • Always use TestCase of testing framework

    That way the framework can add extra logic like cleanup. We don't have to worry about such things.

  • Switch to ECS for coding style

    This allows configuration via PHP. It also combines code sniffer and php cs fixer.

  • Remove --no-suggest from CI

    This is no longer supported by composer V2.

Deprecation 

Nothing

1.1.0 

Breaking 

Nothing

Features 

  • Add Support for TYPO3 v11.2 and PHP 8.0. Existing support is kept. CI is extended to execute tests and checks with new possible combinations.

Fixes 

Tasks 

Nothing

Deprecation 

Nothing

1.0.1 

Breaking 

Nothing

Features 

  • Add icons for extension #40

    • Add Icons for extension itself.
    • Add Icons for custom records.

    Contributed by https://www.werkraum-media.de/

  • Add default and docs to not track preview #44

    Preview is also active if a preview link is shared via EXT:workspace. Those views should probably not be tracked, just like active backend sessions.

Fixes 

Nothing

Tasks 

  • Remove allowTableOnStandardPages for records #43

Deprecation 

Nothing