How-To
Target group: Developers, Integrators
TrackingObjects
What are TrackingObjects?
A TrackingObject is an array which includes one or more tracking items (usually cookies).
For example, the TrackingObject Google contains five cookies which are used
by this service. They are listed inside the show array.
Depending on the purpose a TrackingObject has, you need to inject HTML code after the user has given his consent (see next section).
How to load tracking code only after user consent?
A web analytics service like Matomo or Google Analytics needs the user's active consent before the website starts with tracking. Therefore, you'll need to ensure that the tracking code is not executed automatically at page load.
You need to remove all existing tracking codes from your website and let Cookieman manage them. Cookieman will inject the tracking codes after user consent with the inject configuration.
Example:
plugin.tx_cookieman.settings.trackingObjects {
Matomo {
inject = TEXT
inject {
insertData = 1
value = (
<script nonce="{request : nonce | value}">
var _paq = window._paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//{$PIWIK_URL}/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', {$IDSITE}]);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
</script>
)
}
}
}
Adding a preconfigured TrackingObject
Cookieman already provides some preconfigured TrackingObjects.
You can add selected TrackingObjects with two (or three) steps in TypoScript:
- Import the provided definitions.
- Add the key (name) of the TrackingObject.
# 1. Include provided definitions of TrackingObjects:
@import 'EXT:cookieman/Configuration/TypoScript/TrackingObjects/*.typoscript'
# 2. Add the TrackingObject key to a group:
plugin.tx_cookieman.settings.groups {
mandatory {
trackingObjects {
10 = fe_typo_user
}
}
}
- If a TrackingObject needs to inject HTML code, you'll have to add this in a third step:
# 1. Include provided definitions of TrackingObjects:
@import 'EXT:cookieman/Configuration/TypoScript/TrackingObjects/*.typoscript'
# 2. Add the TrackingObject key to a group (see below how to configure a new group):
plugin.tx_cookieman.settings.groups {
analytics {
trackingObjects {
10 = GoogleAnalytics
}
}
}
# 3. Add the tracking code to the TrackingObject:
plugin.tx_cookieman.settings.trackingObjects {
GoogleAnalytics {
inject {
insertData = 1
value = (
<script nonce="{request : nonce | value}">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
</script>
)
}
}
}
Attention
If your website sets the HTTP header Content-, you'll need to use <script> with external sources (see below).
Only add the used tracking items (cookies)
The provided TrackingObject definitions contain commonly used cookies of a service. You'll need to check it your website really uses all these cookies!
For example, Matomo will only use the _pk_ cookie if the Heatmap & Session recording plugin is enabled!
You can remove any default tracking item like this:
plugin.tx_cookieman.settings.trackingObjects.Matomo.show._pk_hsr >
Important
It's important that you only list cookies in the consent popup which your website really sets.
Adding a new custom TrackingObject
A new TrackingObject of course needs some additional configuration:
- Configure the new TrackingObject.
- Add the new TrackingObject to a group.
- Provide necessary localization labels which are shown in the consent popup.
plugin.tx_cookieman {
settings {
# 1. Configure the new TrackingObject:
trackingObjects {
PHPsession {
# 1a. Configure the table row information:
show {
PHPSESSID {
duration =
durationUnit = session
type = cookie_http+html
provider = Website
# 1b. Set a Regular Expression pattern that matches the name of the cookie,
# if the cookie name or parts of it are dynamic, so the cookie can be automatically
# removed in case the user revokes the consent. (optional)
# Please note that you must not provide regex delimiters and can not set options
# htmlCookieRemovalPattern = ^regex\.\d+\.[a-fA-F0-9]+$
}
}
# 1c. Add the tracking code (optional):
#inject (
# <!-- optional HTML tracking code -->
#)
}
}
# 2. Add the new TrackingObject to a group:
groups.mandatory.trackingObjects {
20 = PHPsession
}
}
# 3. Provide necessary localization labels:
_LOCAL_LANG {
default {
trackingobject.PHPSESSID.desc = This temporary cookie is set by PHP to store current session data (e.g. form data).
}
de {
trackingobject.PHPSESSID.desc = Dieser temporäre Cookie wird von PHP gesetzt, um aktuelle Sitzungsdaten zu speichern (z.B. Formulardaten).
}
}
}
Important
If you provide a Regular Expression in the html option, please be aware of Catastrophic Backtracking and make sure that your pattern is safe. Otherwise your page might slow down or even crash the users browser.
Groups
What are Groups?
TrackingObjects can be arranged in groups that fit their purpose (technically necessary, statistics, marketing, …).
You can configure that a group is mandatory (and therefore preselected and disabled) or that the "Do-not-track" setting of your browser is respected.
Adding a new custom group
A new group needs the following configuration:
- Add the new group.
- Add the desired TrackingObjects to the group.
- Add settings to the group (optional).
- Provide necessary localization labels.
plugin.tx_cookieman {
settings {
groups {
# 1. Add the new group:
statistics {
# 2. Add TrackingObjects to this group:
trackingObjects {
10 = Matomo
20 = GoogleAnalytics
}
# 3. Optional settings: respect the 'Do Not Track' browser setting:
respectDnt = 1
showDntMessage = 1
}
}
}
# 4. Provide necessary localization labels:
_LOCAL_LANG {
default {
group.statistics = Statistics
group.statistics.desc = Explain the general purpose of the cookies here.
}
de {
group.statistics = Statistiken
group.statistics.desc = Beschreibe hier den allgemeinen Einsatzzweck der Cookies.
}
}
}
Tip
Whether Google Analytics can be considered a statistics or marketing TrackingObject depends on its individual configuration.
In case of doubt, ask your Data Security Officer.
Other topics
Content Security Policy
If your website sets the HTTP header Content-Security-Policy (without the unrecommended option 'unsafe-),
it will block all inline code – including your tracking codes.
In order to use tracking within such an environment, you have to move your tracking codes to external files and load them from there.
Important
Some tracking codes have to be adjusted to work from within external files, e.g. Matomo.
Cookieman allows to add external sources with the inject configuration:
plugin.tx_cookieman.settings.trackingObjects {
Matomo {
inject = TEXT
inject {
insertData = 1
value (
<script nonce="{request : nonce | value}"
src="{asset : EXT:your_sitepackage/Resources/Public/JavaScript/matomo-trackingcode.js}?{date : U}"
></script>
<script nonce="{request : nonce | value}"
src="https://your-matomo-server.com/path/to/matomo.js" async defer
></script>
)
}
}
}
Tip
Read more about the Content Security Policy on the Mozilla Developer Network.
Configuration of the cookie used by the extension itself
There are a few TypoScript constants to configure the cookie which is required by the exension (see TypoScript constants).
plugin.tx_cookieman {
settings {
cookie {
# cookie expire time in days (default: 365)
cookieLifetimeDays =
# domain without protocol like www.example.com, .example.com (default: Typo3 site name)
domain =
# sameSite Options: Lax, Strict or None (default: Strict)
sameSite =
# send the cookie via https only (default: on). Cookieman sets it only on https pages.
secure =
}
}
}
Note
Before cookieman 5.0.0 the default for sameSite was Lax. Set
sameSite = Lax to keep that behaviour.
The SameSite attribute on the Mozilla Developer Network
explains what the values do.
Note
secure is on. It is safe to leave it on, also for an http website: cookieman
sets the attribute only when the page is served via https.
The Secure attribute on the Mozilla Developer Network
explains what it does.
Set secure = 0 only if you have http/https subdomains that must be covered by the cookie
(see the tip on domain below). This is the only reason to switch it off.
Browsers also discard a cookie with sameSite = None if it is not secure.
Tip
If you have multiple TYPO3 sites running on one instance with multiple subdomains you propably do not want to have multiple cookieman cookies. This would also mean that the cookieman banner is displayed on both domains and that every website user has to configure it for every subdomain again. To avoid this just set the domain setting to the domain with a starting dot.
plugin.tx_cookieman.settings.cookie.domain = .example.com
Show the consent popup again after a configuration change
A user who gave consent does not see the popup again. If you add a tracking object or change your groups, that user keeps the old consent and does not see the new configuration.
Change consentConfigurationVersion every time you change your cookie
configuration. The default is 1, so your first change sets it to 2:
plugin.tx_cookieman.settings.consentConfigurationVersion = 2
Cookieman writes the version into the consent cookie. If the version in the cookie of a user is not the same as the configured one, cookieman shows the popup again. The selections of the user stay in the checkboxes, so they only must confirm them.
You can use any value, for example a date or the number of your release.
Important
Until the user saves again, the old consent does not count: cookieman injects no tracking objects. This makes sure that a new tracking object does not start before the user consented to it.
Note
Consent that cookieman before 5.0.0 saved holds no version. Cookieman adds the current version to such a cookie without a change for the user ("silent upgrade"). Nobody is asked again because of the upgrade to 5.0.0. Only your next change of the version shows the popup again.