Skip to content

Commit

Permalink
Merge pull request #6 from sandstorm/task/refactor-config
Browse files Browse the repository at this point in the history
Task/refactor config
  • Loading branch information
fheinze authored May 11, 2021
2 parents 141caf1 + 4aaf3aa commit 5971644
Show file tree
Hide file tree
Showing 9 changed files with 331 additions and 428 deletions.
183 changes: 56 additions & 127 deletions Classes/FusionObjects/ConfigImplementation.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,16 @@
use Neos\Fusion\FusionObjects\DataStructureImplementation;
use phpDocumentor\Reflection\Types\Boolean;

class ConfigImplementation extends DataStructureImplementation
{
class ConfigImplementation extends DataStructureImplementation {
const CONSENT_HANDLER_PLACEHOLDER = "### CONSENT_HANDLER ###";
const CONSENT_HANDLER_PLACEHOLDER_REGEX =
'/"' . self::CONSENT_HANDLER_PLACEHOLDER . '"/';
const PHP_REMOVE_REGEX = '/\/\* PHP_REMOVE_START.*?PHP_REMOVE_END \*\//s';

const CONSENT_CONFIG = "consent";

public function evaluate()
{
public function evaluate() {
$dataStructure = parent::evaluate();

$apps = [];
$translations = isset($dataStructure["translations"])
? $dataStructure["translations"]
: [];
$groups = isset($dataStructure["groups"])
? $dataStructure["groups"]
: null;
Expand All @@ -31,139 +24,77 @@ public function evaluate()
? $dataStructure["purposes"]
: null;

$handleConsentOptions = isset($dataStructure["handleConsentOptions"])
? $dataStructure["handleConsentOptions"]
$apps = [];
$translations = isset($dataStructure["translations"])
? $dataStructure["translations"]
: [];

// Consent relevant stuff

$privacyPolicyUrl = isset(
$dataStructure[self::CONSENT_CONFIG]["privacyPolicyUrl"]
)
? $dataStructure[self::CONSENT_CONFIG]["privacyPolicyUrl"]
: "/privacy";

$storageMethod =
isset($dataStructure[self::CONSENT_CONFIG]["storageMethod"]) &&
($dataStructure[self::CONSENT_CONFIG]["storageMethod"] ===
"cookie" ||
$dataStructure[self::CONSENT_CONFIG]["storageMethod"] ===
"localStorage")
? $dataStructure[self::CONSENT_CONFIG]["storageMethod"]
: "cookie";

$cookieName = isset($dataStructure[self::CONSENT_CONFIG]["cookieName"])
? $dataStructure[self::CONSENT_CONFIG]["cookieName"]
: "cookie_punch";

$cookieExpiresAfterDays = isset(
$dataStructure[self::CONSENT_CONFIG]["cookieExpiresAfterDays"]
)
? $dataStructure[self::CONSENT_CONFIG]["cookieExpiresAfterDays"]
: 120;

$cookieDomain = isset(
$dataStructure[self::CONSENT_CONFIG]["cookieDomain"]
)
? $dataStructure[self::CONSENT_CONFIG]["cookieDomain"]
: null;

$default = isset($dataStructure[self::CONSENT_CONFIG]["default"])
? $dataStructure[self::CONSENT_CONFIG]["default"]
: false;

$mustConsent = isset(
$dataStructure[self::CONSENT_CONFIG]["mustConsent"]
)
? $dataStructure[self::CONSENT_CONFIG]["mustConsent"]
: true;

$acceptAll = isset($dataStructure[self::CONSENT_CONFIG]["acceptAll"])
? $dataStructure[self::CONSENT_CONFIG]["acceptAll"]
: true;

$hideDeclineAll = isset(
$dataStructure[self::CONSENT_CONFIG]["hideDeclineAll"]
)
? $dataStructure[self::CONSENT_CONFIG]["hideDeclineAll"]
: false;

// Groups to translations & apps

if ($groups) {
foreach ($groups as $name => $groupConfig) {
$translations[$name] = $this->buildAppTranslation($groupConfig);
array_push($apps, $this->buildAppConfig($name, $groupConfig));
}

if ($purposes && sizeof($purposes)) {
$translations["purposes"] = $purposes;
}
}

$replaceVariables = [
'$php_replaced__apps' => json_encode($apps, JSON_PRETTY_PRINT),
'$php_replaced__translations' => json_encode(
$translations,
JSON_PRETTY_PRINT
),
'$php_replaced__handleConsentOptions' => json_encode(
$handleConsentOptions,
JSON_PRETTY_PRINT
),

'$php_replaced__storageMethod' => $this->toJsString($storageMethod),
'$php_replaced__cookieName' => $this->toJsString($cookieName),
'$php_replaced__cookieExpiresAfterDays' => $cookieExpiresAfterDays,
'$php_replaced__cookieDomain' => $this->toJsString($cookieDomain),
'$php_replaced__privacyPolicyUrl' => $this->toJsString(
$privacyPolicyUrl
),
'$php_replaced__default' => $this->toJsBoolean($default),
'$php_replaced__mustConsent' => $this->toJsBoolean($mustConsent),
'$php_replaced__acceptAll' => $this->toJsBoolean($acceptAll),
'$php_replaced__hideDeclineAll' => $this->toJsBoolean(
$hideDeclineAll
),
$config = [
"acceptAll" => isset($dataStructure[self::CONSENT_CONFIG]["acceptAll"])
? $dataStructure[self::CONSENT_CONFIG]["acceptAll"]
: true,
"apps" => $apps,
"cookieDomain" => isset(
$dataStructure[self::CONSENT_CONFIG]["cookieDomain"]
)
? $dataStructure[self::CONSENT_CONFIG]["cookieDomain"]
: null,
"cookieExpiresAfterDays" => isset(
$dataStructure[self::CONSENT_CONFIG]["cookieExpiresAfterDays"]
)
? $dataStructure[self::CONSENT_CONFIG]["cookieExpiresAfterDays"]
: 120,
"cookieName" => isset($dataStructure[self::CONSENT_CONFIG]["cookieName"])
? $dataStructure[self::CONSENT_CONFIG]["cookieName"]
: "cookie_punch",
"default" => isset($dataStructure[self::CONSENT_CONFIG]["default"])
? $dataStructure[self::CONSENT_CONFIG]["default"]
: false,

"handleConsentOptions" => isset($dataStructure["handleConsentOptions"])
? $dataStructure["handleConsentOptions"]
: [],
"hideDeclineAll" => isset(
$dataStructure[self::CONSENT_CONFIG]["hideDeclineAll"]
)
? $dataStructure[self::CONSENT_CONFIG]["hideDeclineAll"]
: false,
"mustConsent" => isset(
$dataStructure[self::CONSENT_CONFIG]["mustConsent"]
)
? $dataStructure[self::CONSENT_CONFIG]["mustConsent"]
: true,
"privacyPolicy" => isset(

$dataStructure[self::CONSENT_CONFIG]["privacyPolicyUrl"]
)
? $dataStructure[self::CONSENT_CONFIG]["privacyPolicyUrl"]
: "/privacy",
"storageMethod" =>
isset($dataStructure[self::CONSENT_CONFIG]["storageMethod"]) &&
($dataStructure[self::CONSENT_CONFIG]["storageMethod"] === "cookie" ||
$dataStructure[self::CONSENT_CONFIG]["storageMethod"] === "localStorage")
? $dataStructure[self::CONSENT_CONFIG]["storageMethod"]
: "cookie",
"translations" => $translations,
];

return $this->renderConfig($replaceVariables);
}

private function renderConfig(array $variables): string
{
$fileConents = file_get_contents(
'resource://Sandstorm.CookiePunch/Private/JavaScript/klaroConfigTemplateCompiled.js'
);
$template = preg_replace(self::PHP_REMOVE_REGEX, "", $fileConents);

$result = strtr($template, $variables);
// We need to convert the placeholder, to an actual function name in the template.
// We do this in a separate step as json_encode does not support removing ""
$result = preg_replace(
self::CONSENT_HANDLER_PLACEHOLDER_REGEX,
"handleConsent",
$result
);

return $result;
}

private function toJsString(?string $string): string
{
if (!$string) {
return "null";
}
return '"' . $string . '"';
}

private function toJsBoolean(bool $bool): string
{
return $bool ? "true" : "false";
return $config;
}

private function buildAppConfig(string $name, array $groupConfig): array
{
private function buildAppConfig(string $name, array $groupConfig): array {
$result = [
"name" => $name,
"title" => isset($groupConfig["title"])
Expand All @@ -174,7 +105,6 @@ private function buildAppConfig(string $name, array $groupConfig): array
is_array($groupConfig["purposes"])
? $groupConfig["purposes"]
: [],
"callback" => self::CONSENT_HANDLER_PLACEHOLDER,
"cookies" =>
isset($groupConfig[self::CONSENT_CONFIG]["cookies"]) &&
is_array($groupConfig[self::CONSENT_CONFIG]["cookies"])
Expand All @@ -194,8 +124,7 @@ private function buildAppConfig(string $name, array $groupConfig): array
return $result;
}

private function buildAppTranslation(array $groupConfig): array
{
private function buildAppTranslation(array $groupConfig): array {
$result = [];
if (isset($groupConfig["title"])) {
$result["title"] = $groupConfig["title"];
Expand Down
49 changes: 25 additions & 24 deletions Configuration/Settings.Translations.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

################################################################################################
# IMPORTANT: This file was auto-generated as part of the build process to convert translations #
# provided by klaro. -> see package.json -> "yarn run build:translations" #
Expand All @@ -7,35 +8,35 @@ Sandstorm:
CookiePunch:
translations:
consentModal:
title: "Sandstorm.CookiePunch:Klaro:consentModal.title"
description: "Sandstorm.CookiePunch:Klaro:consentModal.description"
title: 'Sandstorm.CookiePunch:Klaro:consentModal.title'
description: 'Sandstorm.CookiePunch:Klaro:consentModal.description'
privacyPolicy:
name: "Sandstorm.CookiePunch:Klaro:consentModal.privacyPolicy.name"
text: "Sandstorm.CookiePunch:Klaro:consentModal.privacyPolicy.text"
name: 'Sandstorm.CookiePunch:Klaro:consentModal.privacyPolicy.name'
text: 'Sandstorm.CookiePunch:Klaro:consentModal.privacyPolicy.text'
consentNotice:
changeDescription: "Sandstorm.CookiePunch:Klaro:consentNotice.changeDescription"
description: "Sandstorm.CookiePunch:Klaro:consentNotice.description"
learnMore: "Sandstorm.CookiePunch:Klaro:consentNotice.learnMore"
changeDescription: 'Sandstorm.CookiePunch:Klaro:consentNotice.changeDescription'
description: 'Sandstorm.CookiePunch:Klaro:consentNotice.description'
learnMore: 'Sandstorm.CookiePunch:Klaro:consentNotice.learnMore'
privacyPolicy:
name: "Sandstorm.CookiePunch:Klaro:consentNotice.privacyPolicy.name"
name: 'Sandstorm.CookiePunch:Klaro:consentNotice.privacyPolicy.name'
imprint:
name: "Sandstorm.CookiePunch:Klaro:consentNotice.imprint.name"
ok: "Sandstorm.CookiePunch:Klaro:ok"
save: "Sandstorm.CookiePunch:Klaro:save"
decline: "Sandstorm.CookiePunch:Klaro:decline"
close: "Sandstorm.CookiePunch:Klaro:close"
acceptAll: "Sandstorm.CookiePunch:Klaro:acceptAll"
acceptSelected: "Sandstorm.CookiePunch:Klaro:acceptSelected"
name: 'Sandstorm.CookiePunch:Klaro:consentNotice.imprint.name'
ok: 'Sandstorm.CookiePunch:Klaro:ok'
save: 'Sandstorm.CookiePunch:Klaro:save'
decline: 'Sandstorm.CookiePunch:Klaro:decline'
close: 'Sandstorm.CookiePunch:Klaro:close'
acceptAll: 'Sandstorm.CookiePunch:Klaro:acceptAll'
acceptSelected: 'Sandstorm.CookiePunch:Klaro:acceptSelected'
app:
disableAll:
title: "Sandstorm.CookiePunch:Klaro:app.disableAll.title"
description: "Sandstorm.CookiePunch:Klaro:app.disableAll.description"
title: 'Sandstorm.CookiePunch:Klaro:app.disableAll.title'
description: 'Sandstorm.CookiePunch:Klaro:app.disableAll.description'
optOut:
title: "Sandstorm.CookiePunch:Klaro:app.optOut.title"
description: "Sandstorm.CookiePunch:Klaro:app.optOut.description"
title: 'Sandstorm.CookiePunch:Klaro:app.optOut.title'
description: 'Sandstorm.CookiePunch:Klaro:app.optOut.description'
required:
title: "Sandstorm.CookiePunch:Klaro:app.required.title"
description: "Sandstorm.CookiePunch:Klaro:app.required.description"
purposes: "Sandstorm.CookiePunch:Klaro:app.purposes"
purpose: "Sandstorm.CookiePunch:Klaro:app.purpose"
poweredBy: "Sandstorm.CookiePunch:Klaro:poweredBy"
title: 'Sandstorm.CookiePunch:Klaro:app.required.title'
description: 'Sandstorm.CookiePunch:Klaro:app.required.description'
purposes: 'Sandstorm.CookiePunch:Klaro:app.purposes'
purpose: 'Sandstorm.CookiePunch:Klaro:app.purpose'
poweredBy: 'Sandstorm.CookiePunch:Klaro:poweredBy'
15 changes: 11 additions & 4 deletions Resources/Private/Fusion/Consent.fusion
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
# Klaro cookie consent, see https://klaro.kiprotect.com/
prototype(Sandstorm.CookiePunch:Consent) < prototype(Neos.Fusion:Component) {
config = Sandstorm.CookiePunch:Config
js = Neos.Fusion:ResourceUri {
cookiePunchConfig = Sandstorm.CookiePunch:Config
[email protected] = ${Json.stringify(value)}

klaro = Neos.Fusion:ResourceUri {
path = 'resource://Sandstorm.CookiePunch/Public/Klaro/klaro-no-css_v0.4.27.js'
}

klaroConfig = Neos.Fusion:ResourceUri {
path = 'resource://Sandstorm.CookiePunch/Public/klaroConfig.js'
}

css = Neos.Fusion:ResourceUri {
path = 'resource://Sandstorm.CookiePunch/Public/Klaro/klaro_v0.4.27.min.css'
}

renderer = afx`
<link @if.hasStyles={props.css} rel="stylesheet" type="text/css" href={props.css}/>
<script defer type="application/javascript">{props.config}</script>
<script defer type="application/javascript" src={props.js}></script>
<script defer type="application/javascript">window.cookiePunchConfig={props.cookiePunchConfig};</script>
<script defer type="application/javascript" src={props.klaroConfig}></script>
<script defer type="application/javascript" src={props.klaro}></script>
`
@process.neverBlockScripts = ${CookiePunch.neverBlockScripts(value)}
}
Loading

0 comments on commit 5971644

Please sign in to comment.