Giter VIP home page Giter VIP logo

kaufmanndigital / kaufmanndigital.gdpr.cookieconsent Goto Github PK

View Code? Open in Web Editor NEW
26.0 3.0 11.0 1.37 MB

A ready-to-run package, that integrates an advanced cookie consent banner into your Neos CMS site.

Home Page: https://www.kaufmann.digital/neos-cms/plugins/dsgvo-gdpr-cookie-consent

License: GNU General Public License v3.0

PHP 36.51% JavaScript 42.10% SCSS 21.39%
neoscms neos neos-cms neos-plugin cookies cookie-consent cookie-consent-plugin hacktoberfest

kaufmanndigital.gdpr.cookieconsent's Introduction

KaufmannDigital.GDPR.CookieConsent

A ready-to-run package, that integrates an advanced cookie consent banner into your Neos CMS site.
This is a further development of our previous cookie consent package. Through the individual configuration per service (cookie), this package is a perfect basis for creating GDPR compliant websites.

Versions

This package is available in multiple Version. Here you can check compatibility and maintenance-state.

Composer-Version Neos-Compatibility Maintenance
^1.0 < 5.0
^2.0 >= 5.0
^3.0 >= 5.0
^4.0 >= 5.0
^5.0 >= 5.0 🐛 ✨ (⚠️ Note changed rendering and Styling)

Installation

It's easier than you probably think!
Just run composer require kaufmanndigital/gdpr-cookieconsent (or require one of the versions from above)

After the installation it's necessary to run doctrine migrations: ./flow doctrine:migrate

Configuration

Since this package is ready-to-run, you can configure your cookie banner in just a few Steps.

  1. Create a new Cookie-Settings Page (shipped inside the Package) somewhere inside your Site-Tree.
  2. Switch to the newly created page and edit the cookie banner contents to your wishes.
  3. Add cookie-groups and cookies to the banner.

Consent per dimension

If you've configured one or multiple dimensions in Neos and you need to save different consents per dimension(-combination), you can just configure it using Settings.yaml:

KaufmannDigital:
  GDPR:
    CookieConsent:
      consentDimensions:
        - country

This example would save different consents per country for each user. This means, the user will see the CookieConsent again the first time he switches to another country.
It also influences the way the content is stored in the cookie. Instead of a key "default" there are now multiple entries within "consents"` for each dimension(-combination). A short example:

{
  "consents": {
    "deu": [
      "necessary",
      "analytics",
      "marketing"
    ],
    "dnk": [
      "necessary",
      "analytics",
      "marketing"
    ]
  },
  "consentDate": "Tue, 11 Feb 2020 11:35:23 GMT",
  "expireDate": "Wed, 10 Feb 2021 23:00:00 GMT"
}

If you configured multiple dimensions in consentDimensions, they get connected here using underscores. Example: deu_de

Exclude special pages (like imprint)

You have 2 options to exclude special pages from displaying the Cookie-Settings. If you have a special NodeType, you want to exclude, you can set it as general rule by Settings.yaml:

KaufmannDigital:
  GDPR:
    CookieConsent:
      excludeDocumentNodeTypes:
        - 'Vendor.Package:Document.Imprint'

Alternatively, you can choose all kind of Document-Nodes in the Backend:
excluded documents

Show banner after first interaction

For example in SEO-aspects it makes sense to show the banner after users first interaction. You can easily configure the Package to behave like this:

KaufmannDigital:
  GDPR:
    CookieConsent:
      hideBeforeInteraction: true

Auto-Accept necessary cookies

In some cases, you may need to accept necessary cookies without an user-interaction. For such a case you can easily add the following to your HTML:

<script>var KD_GDPR_CC_ACCEPT_NECESSARY = true;</script>

This makes the Package to auto-accept necessary cookies without showing the consent-window. The user of course can open the window by hand anyways to adjust the decision.

Accept by Headers

If you are loading site-contents from other websites or in apps, you already have your needed consent. If so, you can configure Headers, which should accept your consents by default.

KaufmannDigital:
  GRDPR:
    CookieConsent:
      headerConsent:
        acceptAll:
          'User-Agent': 'Accepting-All-Agent*'
        acceptNecessary:
          'User-Agent': 'Accepting-needed-Agent*'

Here you can use the syntax of fnmatch() for wildcards or similar.

Accept by URL-Params

You can also accept all cookies or necessary ones by URL-parameters. See, how to configure:

KaufmannDigital:
  GRDPR:
    CookieConsent:
      parameterConsent:
        acceptAll:
          'gdpr': 'accept-all'
        acceptNecessary:
          'gdpr': 'accept-needed'

In this example, you can accept all cookies by calling every page you want with param ?gdpr=accept-all and accept necessary with param ?gdpr=accept-needed.
You can also define multiple param/value combinations for each case.

React to the user's cookie decision

You can use one of these Methods to react on the user's decision on which Cookies are accepted:

Load JavaScript dynamically

You can paste your JavaScript-Code while adding Cookies to the banner. The package will evaluate the user's decision and merge the required JavaScript dynamically for each user on the fly. You don't have to take care of anything. JavaScript gets loaded completely automatic. Cool, isn't it? 😎
Ah! And don't worry about performance. All JS gets minified and cached for every single visitor individually.

Read cookie-identifiers from cookie

If you are already using another way to include your JavaScript, you can depend on the value of the Choice-Cookie.
It's named KD_GDPR_CC and contains all identifiers of groups and cookies you defined in Backend while configuration. The payload of that cookie could look like this:

{
  "consents": {
    "default": [
      "necessary",
      "analytics",
      "marketing"
    ]
  },
  "consentDate": "Tue, 11 Feb 2020 11:35:23 GMT",
  "expireDate": "Wed, 10 Feb 2021 23:00:00 GMT"
}

If you configured Consent per Dimensions, there are entries per dimension in "consents", instead of default. See example.

So just check consents and load the needed JavaScript.
Pro-Tip: If you are using Google Tag Manager to add your JS-Tags, you can define a custom datalayer-variable of type First-Party-Cookie, which can be used as condition inside triggers then.

Google Tag Manager Integration

There are two ways to interact between CookieConsent and Google's Tag-Manager. Also the new "Consent Mode" is supported. We provided a full Guide here. You can use the "old" way (also described in the link above) in alternative Tag-Managers, too.

Add a Re-open link

To create a link for reopening the banner, you only have to place a link with #GDPR-CC-open-settings as target:

<a href="#GDPR-CC-open-settings">Cookie-Settings</a>

After clicking on such a link, the cookie-banner will be loaded via API. Old settings are used as presets.

Custom cookie name

In some usecases it's needed to change the name of the Configuration-Cookie. That can easily be archived by using the following Setting:

KaufmannDigital:
  GDPR:
    CookieConsent:
      cookieName: 'CUSTOM_COOKIENAME'

Cookie lifetime

For GDPR(DSGVO) - Reasons it could be required, to have the Settings-Cookie (which holds the CookieConsent-Settings) expired after a shorter time-period. This is configurable by days via Settings.yaml:

KaufmannDigital:
  GDPR:
    CookieConsent:
      cookieLifetime: 365 #365 days

Versioning

In some cases, it may be necessary to show the cookie-banner to people who have already gave their consent. For example, if a new cookie has been added.
To do this, you only need to edit the version date. You can find it in the inspector of the cookie-settings NodeType:
version-date setting

After the date has been changed, the banner will be shown again to all visitors, who have submitted the cookie banner before this date. Old settings are used as presets.

Invalidating user-decisions after time

Sometimes it is necessary or advantageous to remind the user of his decision and ask him to confirm it again. For this purpose, a TTL for the decision can be set in the backend:
decision-time setting
The unit is seconds. After the set time has expired, the banner appears again with the default settings of the last decision, so the user can easily accept the old decision with just one click.
The value 0 (default) disables the repeated display of the banner.

Styling

Custom Banner-Styles

The banner comes with default styling that aims to be GDPR compliant and accessible.

You can customise the banner by either:

  1. Set a theme color (for buttons), the background color, text color and maximum width of the banner via the input fields in the inspector.
  2. Create a CSS-File with your own styling and include it using Settings.yaml:
KaufmannDigital:
  GDPR:
    CookieConsent:
      customCSSFilepath: 'resource://Vendor.Package/Private/Styles/cookie-consent.css' #You can also use the public-path, of course

To get an idea of the CSS-styling and class-names, you can have a look into our SCSS.

Instead of writing out all the selectors in your custom file, it might be enough to just overwrite the relevant custom properties. This example file shows the custom properties that can be used:

.gdpr-cookieconsent-container {
    --cookieconsent-theme-color: rgb(0 137 203);
    --cookieconsent-overlay-color: rgb(0 0 0 / .75);
    --cookieconsent-bg-color: rgb(255 255 255 / 0.95);

    --cookieconsent-group-bg-color: rgb(255 255 255);

    --cookieconsent-button-text-color: rgb(255 255 255);
    --cookieconsent-button-primary-color: var(--cookieconsent-theme-color);
    --cookieconsent-button-secondary-color: rgb(255 255 255);
    --cookieconsent-button-primary-text-color: var(--cookieconsent-button-text-color);
    --cookieconsent-button-secondary-text-color: rgb(0 0 0);
    --cookieconsent-button-borderradius: 4px;

    --cookieconsent-spacing: 1rem;
    --cookieconsent-width: 1200px;

    --cookieconsent-focus-outline: black solid 2px;
    --cookieconsent-focus-outline-offset: 2px;
}

/* Switches options */
.gdpr-cookieconsent-switch {
    --cookieconsent-switch-thumb-size: 1.5rem;
    --cookieconsent-switch-thumb-color: rgb(255 255 255);
    --cookieconsent-switch-thumb-highlight-color: rgba(0 0 0 / 0.25);
    --cookieconsent-switch-length: calc(var(--cookieconsent-switch-thumb-size) * 2);
    --cookieconsent-switch-padding: 4px;
    --cookieconsent-switch-inactive-color: rgb(204 204 204);
    --cookieconsent-switch-active-color: var(--cookieconsent-theme-color);
    --cookieconsent-switch-thumb-size-small: 1rem;
    --cookieconsent-switch-outline: var(--cookieconsent-focus-outline);
    --cookieconsent-switch-outline-offset: var(--cookieconsent-focus-outline-offset);
}

⚠️ Please note that colors set in the inspector will overwrite values set in your custom css file. You might need to unset the color values in the inspector first.

Use your own fusion components in the banner

Sometimes adjusting CSS isn't enough, and you just want to use your own button or text components in the banner. Good news: You can by overwriting the rendererof the following components:

  • KaufmannDigital.GDPR.CookieConsent:Component.Atom.AcceptAllButton
  • KaufmannDigital.GDPR.CookieConsent:Component.Atom.SaveButton
  • KaufmannDigital.GDPR.CookieConsent:Component.Atom.AcceptNecessaryButton
  • KaufmannDigital.GDPR.CookieConsent:Component.Atom.OpenIndividualSettingsButton
  • KaufmannDigital.GDPR.CookieConsent:Component.Atom.CloseIndividualSettingsButton
  • KaufmannDigital.GDPR.CookieConsent:Component.Atom.Headline
  • KaufmannDigital.GDPR.CookieConsent:Component.Atom.Text

Accessing the button labels is as easy as accessing ${props.label}.

Here's an example how to use your own button as the "Accept all" button:

prototype(KaufmannDigital.GDPR.CookieConsent:Component.Atom.AcceptAllButton) {
    renderer = Vendor.Site:Component.PrimaryButton {
        myLabel = ${props.label}
    }
}

Restrict CORS headers to specific domains

If you are using the cookie banner on multiple domains, you can restrict the CORS headers to specific domains. This is useful if you want to use the same cookie banner on multiple domains, but don't want to allow all domains to access the cookie banner API. To allow access to the cookie banner API only from specific domains, you can configure the allowed domains in the settings:

KaufmannDigital:
  GDPR:
    CookieConsent:
      allowedOrigins:
        - 'subdomain.example.com'
        - 'example.org'

Roadmap / Planned Features

  • Presets for popular cookies. For example:
    • Google Analytics
    • Matomo (Piwik)
    • Intercom Support-Chat
    • ...

Sponsors

We would like to thank our sponsors, who supported us financially during the development:

Mittwald Logo

Are you missing a feature in our solution? You want to support the development of this Package? Please don't hesitate to contact us!
Email: [email protected]

Maintainer

This package is maintained by the Neos Agency Kaufmann Digital.
Feel free to send us your questions or requests to [email protected]

Issues and Pull-Requests are welcome!

You got stuck while installing or configuring? You are missing something? You found a bug?
No problem, just create an issue or open a pull request. We'll have a look at it ASAP.

License

Licensed under GPL-3, see LICENSE

kaufmanndigital.gdpr.cookieconsent's People

Contributors

andrehoffmann30 avatar andyyyyyy avatar anianweber avatar daniellienert avatar franzkugelmann avatar gjwnc avatar hphoeksma avatar kdambekalns avatar markuspfeifenberger avatar nikdro avatar patricekaufmann avatar ru3fu5z avatar simonhir avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

kaufmanndigital.gdpr.cookieconsent's Issues

Footer links href attribute is empty

The href attribute of the two footer links is always empty.

<div class="gdpr-cookieconsent-settings__content__links">
<a href="">Impressum</a>
<span> | </span>
<a href="">Datenschutzerklärung</a>
</div>

It doesn't make a difference if you directly type in a url or select a page in the backend.

Seems like the values doesn't go through to the Fusion rendering.

Bug: In backend configured Javascript is not loaded although it should be

In the Neos backend I have configured some JavaScript, which should be loaded and execute after the user accepts the cookie banner. In the version 4.1.4 this JavaScript is not loaded anymore, because the expiration date of the cookie is i n the past. Therefore the code in row 91-94 in the JavaScriptController.php is executed and no Javascript is loaded from the backend. In my case the decisionTtl is not set and therefore 0 is used. Therefore the expiration date is always in the past.

Clear Content-Cache of pages, wich are excluded from CookieConsent

Within the CookieConsent-Settings on configuration page, you can exclude single pages from CookieConsent being displayed: https://github.com/KaufmannDigital/KaufmannDigital.GDPR.CookieConsent?tab=readme-ov-file#exclude-special-pages-like-imprint

After adding a page there, currently the content-cache of that selected page isn't flushed. With a simple signal-slot setup it shouldn't be a big deal, to flush cache of the selected packages.

Language optimisations

The details label is not a label and is missing.
Request for additional languages: nl, fr, es

Error with PHP 8 when no consents given yet

Exception in line 120 of /…/Data/Temporary/Production/SubContextLive/SubContextWww/Cache/Code/Flow_Object_Classes/KaufmannDigital_GDPR_CookieConsent_Controller_JavaScriptController.php: in_array(): Argument #2 ($haystack) must be of type array, null given

41 in_array()
40 KaufmannDigital\GDPR\CookieConsent\Controller\JavaScriptController_Original::renderJavaScriptAction()
39 KaufmannDigital\GDPR\CookieConsent\Controller\JavaScriptController::renderJavaScriptAction()
38 KaufmannDigital\GDPR\CookieConsent\Controller\JavaScriptController::Flow_Aop_Proxy_invokeJoinPoint()
37 Neos\Flow\Aop\Advice\AdviceChain::proceed()
36 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy()
35 Neos\Flow\Aop\Advice\AroundAdvice::invoke()
34 Neos\Flow\Aop\Advice\AdviceChain::proceed()
33 KaufmannDigital\GDPR\CookieConsent\Controller\JavaScriptController::renderJavaScriptAction()
32 Neos\Flow\Mvc\Controller\ActionController_Original::callActionMethod()
31 Neos\Flow\Mvc\Controller\ActionController_Original::processRequest()
30 Neos\Flow\Mvc\Dispatcher_Original::initiateDispatchLoop()
29 Neos\Flow\Mvc\Dispatcher_Original::dispatch()
28 Neos\Flow\Mvc\DispatchMiddleware_Original::process()
27 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
26 Sitegeist\Slipstream\Middleware\SlipstreamMiddleware_Original::process()
25 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
24 Neos\Flow\Http\Middleware\SecurityEntryPointMiddleware_Original::process()
23 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
22 Neos\Flow\Http\Middleware\RequestBodyParsingMiddleware_Original::process()
21 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
20 Neos\Flow\Mvc\FlashMessage\FlashMessageMiddleware_Original::process()
19 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
18 Neos\Flow\Http\Middleware\PoweredByMiddleware_Original::process()
17 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
16 Neos\RedirectHandler\RedirectMiddleware_Original::process()
15 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
14 Neos\Flow\Mvc\Routing\RoutingMiddleware_Original::process()
13 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
12 Neos\Neos\Routing\RequestUriHostMiddleware_Original::process()
11 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
10 Neos\FluidAdaptor\Core\Widget\AjaxWidgetMiddleware_Original::process()
9 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
8 Neos\Flow\Http\Middleware\SessionMiddleware_Original::process()
7 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
6 Neos\Flow\Http\Middleware\TrustedProxiesMiddleware_Original::process()
5 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
4 Neos\Flow\Http\Middleware\StandardsComplianceMiddleware_Original::process()
3 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle()
2 Neos\Flow\Http\RequestHandler::handleRequest()
1 Neos\Flow\Core\Bootstrap::run()

HTTP REQUEST:
target: /api/kd-gdpr-cc.js?dimensions%5Blanguage%5D%5B0%5D=en_GB&dimensions%5Blanguage%5D%5B1%5D=de
Host: www.redacted.de
Referer: https://www.redacted.de/en/pictures/something.html
Accept-Language: en-GB,en;q=0.9
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1
Accept-Encoding: gzip, deflate, br
Accept: */*

PHP PROCESS:
Inode: 4862331
PID: 1334685

Add Constraints

Add constraints, so that we can only Add cookies and cookie-groups to the banner.

Dropped Neos 4.3 support

I still have the version 3.0.1 running perfectly fine in a Neos 4.3 project.

Is there any reason the newer releases don't support it anymore?
4.3 still runs until 2022.

If there is a compatibility issue I can probably help fixing it.

JS Error in Backend

Problem:

In Neos Backend the object KD_GDPR_CC is not initialized, hence the following check in Initialize.js is throwing an error:
L21: if (KD_GDPR_CC && document.cookie.indexOf(KD_GDPR_CC.cookieName) >= 0) {

The check can be performed in the following way without throwing an error:
L21: if (typeof KD_GDPR_CC !== 'undefined' && KD_GDPR_CC && document.cookie.indexOf(KD_GDPR_CC.cookieName) >= 0) {

NodeType translation

Currently there aren't any translations available inside the NodeType. We should change that.

Insecure Cross-Origin Resource Sharing Configuration

A routine security scan made me aware of the fact that the plugin uses a rather insecure CORS header configuration:

/api/kd-gdpr-cc?siteNode=/sites/lala@live;language=en

The scanner has detected an insecure CORS configuration on the target application : The application is configured to allow a public third party service to issue cross-domains requests. This configuration allows an attacker to host a malicious javascript on this public third service and then perform cross-domains requests with user credentials and access the responses.

Access-Control-Allow-Origin header should be set to allow only known and trusted domains to issue CORS requests.

Which in turn made me think about why the configuration is even there- I do not see the use case to allow Cross-origin requests in cookie plugin. Maybe you could explain that?

Also looking at the code I saw that for a long time there was a TODO related to the CORS header configuration to make this configurable, which would be beneficial for us.

I would be happy to assist with a PR once I fully understand the use case behind the loose CORS header configuration!

No content collection of type Neos.Neos:ContentCollection

Hi,

what can I do to solve the problem:

An exception was thrown while Neos tried to render your page

No content collection of type Neos.Neos:ContentCollection could be found in the current node (/sites/fshsite/node-5766fb7174c4a/node-5c8768c357406/node-0if1pgz96dki7) or at the path "main". You might want to adjust your node type configuration and create the missing child node through the "flow node:repair --node-type KaufmannDigital.GDPR.CookieConsent:Document.CookieSettingsPage" command.

POST ajax call and set cookie Does not work on local Docker with localhost

After we tested the Component on a live and staging server we liked it and using it now.
But when trying to use it on a local development server ( running in docker container) I noticed that while I can see the CC GUI , when I click the Accept Button there is an XHR POST Error in Chrome Browser Dev Tools ( Network Tab)

contact.html:2161 POST http://localhost:8098/api/kd-gdpr-cc 500 (Internal Server Error)

and in the Network/Respose I see this NEOS / Flow Error:

An exception occurred while executing 'INSERT INTO kaufmanndigital_gdpr_cookieconsent_domain_model_consentlogentry (persistence_object_identifier, consentdate, consentidentifier, userid) VALUES (?, ?, ?, ?)' with params ["fd5dd914-3659-4299-b6d0-9d8e22d047c1", "2020-06-24 10:17:18", "permanent", "5ef3282e86ffb"]:

I attached screenshots of the Dev Tools Errors:

DevTools - localhost_8098_en_contact html 24_06_2020 12_19_20
DevTools - localhost_8098_en_contact html 24_06_2020 12_19_32

It would be really usefull to have the Component working in local docker containers. THanks in advance

Incompatibility with additional frontend caches

Due to the logic in Fusion to check whether to render the Consent configuration
Caches like Flowpack.FullPageCache and Varnish or others don't work properly
and one visitor influences the config for another one.

Also due to the uncached behaviour the page rendering is slower.

As discussed with @Nikdro in Slack I recommend moving the logic to Javascript
and solve any compatibility issue this way.

One of the other solutions for this https://github.com/wysiwyg-software-design/Wysiwyg.CookieHandling solves this from what I see by introducing a HTTP Component that would at least work with the FullPageCache but needs more work to configure properly.

Historical Logging

With enabled logging, the Database blows up very fast.
We could create an cronjob, which creates static historical statistics and removes logs then.

Also set documentNode context in CookieSettingsPage.fusion

Homepage rendering that relies on documentNode context fails when being rendered in backend since the context is not correct.

Suggestion:

    renderer = Neos.Fusion:Renderer {
        type = ${site.nodeType.name}
        @context.node = ${site}
        @context.documentNode = ${site}

        @process.addCookieSettings = ${String.pregReplace(value, '/(.*)<\/body>(.*)/s', '$1' + cookieSettings + "</body>$2")}
    }

Bug: MS Edge JavascriptLoad

Seems like MS Edge doesn't load the selected javascript directly after submit. (Customer report) A reload is needed.

Maybe a JS-Bug on Edge, we'll have to check.

Javascript String Template Literals in JS snippets are minified with errors

I noticed a small bug when the JS snippets inserted in NEOS Inspector are minified, that Javascript String Template Literals in JS snippets are missing the Variables/ expression interpolations .
I mean the ${jsExpression} in const str = ... ${}

So for example.

const mapSrc = https://maps.google.de/maps?hl=de&q=${companyName}+${zip}+${city}&ie=UTF8&t=&z=17&iwloc=B&output=embed;

is minfied to :

const mapSrc = https://maps.google.de/maps?hl=de&q={}+{}+{}&ie=UTF8&t=&z=17&iwloc=B&output=embed;

instead of :

const mapSrc = https://maps.google.de/maps?hl=de&q=PERMANENT+40219+Duesseldorf&ie=UTF8&t=&z=17&iwloc=B&output=embed;

A workaround was to use traditional JS String concat . SO this works:

const mapSrc = 'https://maps.google.de/maps?hl=de&q='+companyName+'+'+zip+'+'+city+'&ie=UTF8&t=&z=17&iwloc=B&output=embed';

Support for multiple content dimensions

Your package is really great and we would love to use it on our website, but there is a problem with our multilingual setup.

We have two languages registered as content dimensions in the settings.yaml:

Neos:
  ContentRepository:
      contentDimensions:
        language:
          label: 'Language'
          icon: icon-globe-europe
          default: de
          defaultPreset: de
          resolution:
            mode: 'topLevelDomain'
          presets:
            eu_EN:
              label: 'EU'
              values:
                - eu_EN
                - en_UK
              uriSegment: eu
            de:
              label: 'DE'
              values:
                - de
              uriSegment: de

We thought we could create the cookie consent page in either dimension/language. And it will recognize the dimension the user is in and it will display the cookie consent with the settings we have set for the dimension.

For example, we have different cookie consent texts on the German and English sites. But unfortunately, the cookie consent shows the text of the German dimension in all dimensions.

Is this already possible or is there a way to achieve this?

Make logging configurable

Currently logging the users choice is enabled by default. We should disable it by default and make it configurable via Settings.yaml

Group Cookie NodeTypes into a cookie group

The Problem is, that all of the different Cookie NodeTypes (Cookie, CookieGroup, CookieSettings, ...) are Grouped in the General Group. This results in a confusing dialog.

My recommendation and linked pull request would be to Group the Cookie NodeTypes into a (collapsible) cookie group to prevent pollution of the "Insert NodeType" dialog.

My recommendation:
cookie-group

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.