+
+
\ No newline at end of file
diff --git a/db/upgrade.php b/db/upgrade.php
new file mode 100644
index 0000000..d932c16
--- /dev/null
+++ b/db/upgrade.php
@@ -0,0 +1,40 @@
+.
+
+function xmldb_theme_wwu2019_upgrade ($oldversion) {
+ global $DB;
+ $dbman = $DB->get_manager();
+ if ($oldversion < 2022010100) {
+
+ $table = new xmldb_table('theme_wwu2019_cookie_consent');
+
+ $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
+ $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $table->add_field('consentdate', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $table->add_field('usermodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+
+ $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
+ $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
+
+ if (!$dbman->table_exists($table)) {
+ $dbman->create_table($table);
+ }
+
+ upgrade_plugin_savepoint(true, 2022010100, 'theme', 'wwu2019');
+ }
+}
\ No newline at end of file
diff --git a/lang/de/theme_wwu2019.php b/lang/de/theme_wwu2019.php
index 998a881..4989a57 100644
--- a/lang/de/theme_wwu2019.php
+++ b/lang/de/theme_wwu2019.php
@@ -49,6 +49,8 @@
/* Settings */
$string['helpurl'] = 'Hilfe-URL';
$string['helpurl_desc'] = 'URL zu einer Hilfeseite, die im Usermenü verlinkt ist.';
+$string['cookie_policy_url'] = 'Cookie policy URL';
+$string['cookie_policy_url_desc'] = 'URL zu einer Cookie Policy die im Footer verlinkt wird';
$string['matomo_siteurl'] = 'Analytics-URL';
$string['matomo_siteurl_desc'] = 'Ihre "Matomo Analytics"-URL, aber ohne http(s) oder Slash am Ende. Beispiel: "mysite.com/analytics".';
$string['matomo_siteid'] = 'Analytics-Site-ID';
@@ -90,9 +92,46 @@
$string['viewfullsection'] = 'Kompletten Abschnitt anschauen';
-// Theme switcher
+// Theme switcher.
$string['choosetheme'] = 'Theme auswählen';
$string['light'] = 'Hell';
$string['dark'] = 'Dunkel';
$string['ostheme'] = 'Systemfarben';
$string['ostheme_help'] = 'Wechselt zwischen hellem und dunklem Theme basierend auf den Systemeinstellungen.';
+
+$string['cookiepolicy'] = "Cookie Datenschutzrichtlinie";
+
+// Cookie consent.
+$string['cookie_consent_title'] = "Zustimmung zur Verwendung von Cookies";
+$string['cookie_consent_title_one'] = "Diese Website verwendet Cookies";
+$string['cookie_consent_body_one'] = "Das Learnweb braucht Cookies um zu funktionieren." .
+ " Da wir kein Interesse am Verkauf deiner Daten haben setzen wir nur solche Cookies ein, die zum Betrieb der Website notwendig sind.";
+$string['cookie_explanation_title'] = "Was sind Cookies?";
+$string['cookie_explanation_body'] = "Cookies sind kleine Textdateien die das Learnweb auf Ihrem PC speichert."
+ . " In dieser Textdatei wird dann ein Wert und ein Ablaufdatum gespeichert."
+ . " Der Name dieser Textdatei, sowie ihr Inhalt werden dann immer an das Learnweb gesendet wenn Sie es besuchen."
+ . " Wenn das gespeicherte Ablaufdatum erreicht ist wird der Cookie automatisch von ihrem PC gelöscht.";
+$string['cookie_classes_title'] = "Was für Arten von Cookies gibt es?";
+$string['cookie_classes_body'] = "Grundsätzlich unterscheidet man vier Arten von Cookies:" .
+ "
" .
+ "
Essentielle Cookies
sind Cookies die zum Betrieb einer Website unbedingt nötig sind." .
+ " Außerdem ist bei diesen Cookies sicherzustellen, dass sie nur an den Betreiber einer Website gesendet werden.
" .
+ "
Funktionale Cookies
sind Cookies die dazu dienen eine Website um Funktionen zu bereichern." .
+ " Beispielsweise kann so die Sprache eines Nutzers gespeichert werden und die Website auf dieser Sprache angezeigt werden." .
+ " Die informationen die in Funktionalen Cookies gespeichert sind müssen anonymisiert werden.
" .
+ "
Performance Cookies
sind Cookies die dazu genutzt werden die Performance einer Webseite zu analysieren." .
+ " Sie speichern Beispielsweise welche Unterseiten ein Nutzer besonders oft besucht oder welchen Text er besonders lang und aufmerksam durchgelesen hat.
" .
+ "
Marketing Cookies
sind alle Cookies deren Informationen primär dazu genutzt werden um " .
+ " (personalisierte) Werbung für den Nutzer anzuzeigen.
" .
+ "
";
+
+$string['cookie_reason_title'] = "Wofür benutzt das Learnweb Cookies?";
+$string['cookie_reason_body'] = "Das Learnweb setzt Cookies für verschiedene Zwecke ein. Wenn Sie sich Beispielsweise einloggen "
+ . "speichert das Learnweb einen Cookie der einen Zugangscode für Sie enthält. Wenn sie dann eine andere Seite des Learnwebs aufrufen "
+ . "kann das Learnweb sie anhand dieses Codes identifizieren und Sie müssen sich nicht erneut einloggen. "
+ . "Ein anderer Anwendungsbereich sind einige Texteditoren des Learnwebs. Wenn sie einen Text schreiben so speichert ihr PC diesen Text "
+ . "während des Schreibens immer wieder in einem Cookie. Somit ist sichergestellt, dass sie auch bei Verbindungsabbruch oder zwischenzeitlichem "
+ . "Verlassen des Learnwebs keinen Verlust ihres Textes befürchten müssen.";
+$string['agree'] = "Zustimmung erteilen";
+
+$string['invalidconsentdate'] = "Ungültiges Datum für Zustimmungserteilung";
diff --git a/lang/en/theme_wwu2019.php b/lang/en/theme_wwu2019.php
index 0c0767a..1569085 100644
--- a/lang/en/theme_wwu2019.php
+++ b/lang/en/theme_wwu2019.php
@@ -49,6 +49,8 @@
/* Settings */
$string['helpurl'] = 'Help URL';
$string['helpurl_desc'] = 'URL to helppage that will be linked to in the usermenu';
+$string['cookie_policy_url'] = 'Cookie policy URL';
+$string['cookie_policy_url_desc'] = 'URL to a cookie policy that will be linked to in the footer';
$string['matomo_siteurl'] = 'Analytics URL';
$string['matomo_siteurl_desc'] = 'Enter your "Matomo Analytics" URL without http(s) or a trailing slash. For example "mysite.com/analytics".';
$string['matomo_siteid'] = 'Analytics Site ID';
@@ -97,3 +99,40 @@
$string['ostheme'] = 'System colors';
$string['ostheme_help'] = 'Switches between light and dark theme depending on the OS settings.';
+$string['cookiepolicy'] = "Cookie policy";
+
+// Cookie consent.
+$string['cookie_consent_title'] = "Zustimmung zur Verwendung von Cookies";
+$string['cookie_consent_title_one'] = "Diese Website verwendet Cookies";
+$string['cookie_consent_body_one'] = "Das Learnweb braucht Cookies um zu funktionieren." .
+ " Da wir kein Interesse am Verkauf deiner Daten haben setzen wir nur solche Cookies ein, die zum Betrieb der Website notwendig sind.";
+$string['cookie_explanation_title'] = "Was sind Cookies?";
+$string['cookie_explanation_body'] = "Cookies sind kleine Textdateien die das Learnweb auf Ihrem PC speichert."
+ . " In dieser Textdatei wird dann ein Wert und ein Ablaufdatum gespeichert."
+ . " Der Name dieser Textdatei, sowie ihr Inhalt werden dann immer an das Learnweb gesendet wenn Sie es besuchen."
+ . " Wenn das gespeicherte Ablaufdatum erreicht ist wird der Cookie automatisch von ihrem PC gelöscht.";
+$string['cookie_classes_title'] = "Was für Arten von Cookies gibt es?";
+$string['cookie_classes_body'] = "Grundsätzlich unterscheidet man vier Arten von Cookies:" .
+ "
" .
+ "
Essentielle Cookies
sind Cookies die zum Betrieb einer Website unbedingt nötig sind." .
+ " Außerdem ist bei diesen Cookies sicherzustellen, dass sie nur an den Betreiber einer Website gesendet werden.
" .
+ "
Funktionale Cookies
sind Cookies die dazu dienen eine Website um Funktionen zu bereichern." .
+ " Beispielsweise kann so die Sprache eines Nutzers gespeichert werden und die Website auf dieser Sprache angezeigt werden." .
+ " Die informationen die in Funktionalen Cookies gespeichert sind müssen anonymisiert werden.
" .
+ "
Performance Cookies
sind Cookies die dazu genutzt werden die Performance einer Webseite zu analysieren." .
+ " Sie speichern Beispielsweise welche Unterseiten ein Nutzer besonders oft besucht oder welchen Text er besonders lang und aufmerksam durchgelesen hat.
" .
+ "
Marketing Cookies
sind alle Cookies deren Informationen primär dazu genutzt werden um " .
+ " (personalisierte) Werbung für den Nutzer anzuzeigen.
" .
+ "
";
+
+$string['cookie_reason_title'] = "Wofür benutzt das Learnweb Cookies?";
+$string['cookie_reason_body'] = "Das Learnweb setzt Cookies für verschiedene Zwecke ein. Wenn Sie sich Beispielsweise einloggen "
+ . "speichert das Learnweb einen Cookie der einen Zugangscode für Sie enthält. Wenn sie dann eine andere Seite des Learnwebs aufrufen "
+ . "kann das Learnweb sie anhand dieses Codes identifizieren und Sie müssen sich nicht erneut einloggen. "
+ . "Ein anderer Anwendungsbereich sind einige Texteditoren des Learnwebs. Wenn sie einen Text schreiben so speichert ihr PC diesen Text "
+ . "während des Schreibens immer wieder in einem Cookie. Somit ist sichergestellt, dass sie auch bei Verbindungsabbruch oder zwischenzeitlichem "
+ . "Verlassen des Learnwebs keinen Verlust ihres Textes befürchten müssen.";
+
+$string['agree'] = "Zustimmung erteilen";
+
+$string['invalidconsentdate'] = "Invalid date for consentdate";
diff --git a/lib.php b/lib.php
index 2f83e91..7e7633d 100644
--- a/lib.php
+++ b/lib.php
@@ -92,3 +92,72 @@ function theme_wwu2019_extend_navigation_course($navigation, $course, $context)
$navigation->add_node($node);
}
+
+const CONSENT_COOKIE = "cookie_policy_consent";
+function theme_wwu2019_before_standard_top_of_body_html() {
+ global $USER, $OUTPUT;
+ if (isloggedin()) {
+ if (isset($_COOKIE[CONSENT_COOKIE])) {
+ $consentdataraw = $_COOKIE[CONSENT_COOKIE];
+ $consentdata = json_decode($consentdataraw, true);
+ $userid = $USER->id;
+ $useridhash = md5($userid);
+ foreach ($consentdata as $consenteduser => $consentdate) {
+ if ($consenteduser == $useridhash) {
+ $consentexpirydate = strtotime("+1 year", $consentdate);
+ if ($consentexpirydate > time()) {
+ return null;
+ }
+ }
+ }
+ }
+
+ $consentpersistent = \theme_wwu2019\cookie_consent_allocation::get_record(["userid" => $USER->id]);
+ if ($consentpersistent) {
+ $consentdate = $consentpersistent->get('consentdate');
+ $consentexpirydate = strtotime("+1 year", $consentdate);
+ if ($consentexpirydate > time()) {
+ add_consent_cooke($consentpersistent);
+ }
+ return null;
+ }
+
+ $consentgiven = optional_param('theme_wwu2019_cookie_consent_given', false, PARAM_BOOL);
+ if ($consentgiven) {
+ if ($consentpersistent) {
+ $consentpersistent->set('consentdate', time());
+ $consentpersistent->save();
+ add_consent_cooke($consentpersistent);
+ } else {
+ $data = new stdClass();
+ $data->userid = $USER->id;
+ $data->consentdate = time();
+ $consentpersistent = new \theme_wwu2019\cookie_consent_allocation(0, $data);
+ $consentpersistent->create();
+ add_consent_cooke($consentpersistent);
+ }
+ return null;
+ }
+
+ $consentdialog = $OUTPUT->render_from_template("theme_wwu2019/cookie_consent", []);
+
+ return $consentdialog;
+ }
+ return null;
+}
+
+function add_consent_cooke($consentpersistent) {
+ global $CFG;
+ if (isset($_COOKIE[CONSENT_COOKIE])) {
+ $consentdata = json_decode($_COOKIE[CONSENT_COOKIE], true);
+ } else {
+ $consentdata = [];
+ }
+
+ $consentdate = $consentpersistent->get('consentdate');
+ $hashedid = md5($consentpersistent->get('userid'));
+ $consentdata[$hashedid] = $consentdate;
+ $encodeddata = json_encode($consentdata);
+ $consentexpirydate = strtotime("+1 year", $consentdate);
+ setcookie(CONSENT_COOKIE, $encodeddata, $consentexpirydate, $CFG->sessioncookiepath);
+}
diff --git a/scss/wwu2019/general.scss b/scss/wwu2019/general.scss
index 96d3bb9..c4cf906 100644
--- a/scss/wwu2019/general.scss
+++ b/scss/wwu2019/general.scss
@@ -374,4 +374,93 @@ a:not([class]):focus,
margin-top: 1em;
margin-bottom: 1em;
}
+}
+
+#theme_wwu2019_cookie_consent_overlay {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0,0,0,0.5);
+ z-index: 2000; // to be above nav
+}
+
+#theme_wwu2019_cookie_consent_dialog_header {
+ background-color: $primary;
+}
+
+.theme_wwu2019_cookie_consent_body {
+ text-align: left;
+ color: black;
+}
+
+.vertical-center {
+ margin: 0 auto;
+}
+
+.theme_wwu2019_bold_text {
+ font-weight: bold;
+ color: white;
+ margin: 0;
+}
+
+.dialog_center {
+ width: 40%;
+ display: inline-table;
+ height: auto;
+ margin: 10% auto auto;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ left: 0;
+ border-top-left-radius: calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
+}
+
+.theme_wwu2019_cookie_consent_form {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.dialog_overlay {
+ z-index: 2001;
+ background-color: white;
+}
+.theme_wwu2019_switch_wrapper {
+ text-align: left;
+ padding-top: 5px;
+ border-bottom: 1px solid lightgrey;
+ border-top: 1px solid lightgrey;
+ background: white;
+}
+
+.theme_wwu2019_switch_label {
+ background-image: url([[pix:theme_wwu2019|arrow_up]]);
+ height: 1em;
+ background-size: contain;
+ background-repeat: no-repeat;
+ margin: 0 0 0 5px;
+ padding-left: calc(1em + 5px);
+ color: $primary;
+ font-weight: bold;
+}
+
+:checked ~ .theme_wwu2019_switch_label {
+ background-image: url([[pix:theme_wwu2019|arrow_down]]);
+}
+
+.theme_wwu2019_switched_text {
+ display: none;
+}
+
+:checked ~ .theme_wwu2019_switched_text {
+ display: block;
+}
+
+.theme_wwu2019_switch_input {
+ display: none;
+}
+
+.text-bold {
+ font-weight: bold;
}
\ No newline at end of file
diff --git a/settings.php b/settings.php
index 21472e8..7c35d07 100644
--- a/settings.php
+++ b/settings.php
@@ -34,6 +34,12 @@
get_string('helpurl_desc', 'theme_wwu2019'), '', PARAM_URL);
$page->add($setting);
+ // Cookie consent.
+ $setting = new admin_setting_configtext('theme_wwu2019/cookie_policy_url',
+ get_string('cookie_policy_url', 'theme_wwu2019'),
+ get_string('cookie_policy_url_desc', 'theme_wwu2019'), '');
+ $page->add($setting);
+
// Matomo.
$setting = new admin_setting_configtext('theme_wwu2019/matomo_siteurl',
get_string('matomo_siteurl', 'theme_wwu2019'),
diff --git a/templates/collapsible_topic.mustache b/templates/collapsible_topic.mustache
new file mode 100644
index 0000000..adb837c
--- /dev/null
+++ b/templates/collapsible_topic.mustache
@@ -0,0 +1,24 @@
+{{!
+ This file is part of Moodle - http://moodle.org/
+
+ Moodle is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Moodle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Moodle. If not, see .
+}}
+{{!
+ @template theme_wwu2019/collapsible_topic
+}}
+
+
+
+
{{$text}}{{/text}}
+
\ No newline at end of file
diff --git a/templates/cookie_consent.mustache b/templates/cookie_consent.mustache
new file mode 100644
index 0000000..59565a1
--- /dev/null
+++ b/templates/cookie_consent.mustache
@@ -0,0 +1,50 @@
+{{!
+ This file is part of Moodle - http://moodle.org/
+
+ Moodle is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Moodle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Moodle. If not, see .
+}}
+{{!
+ @template theme_wwu2019/cookie_consent
+}}
+
+
+
diff --git a/version.php b/version.php
index 0316359..5271bbc 100644
--- a/version.php
+++ b/version.php
@@ -27,7 +27,7 @@
defined('MOODLE_INTERNAL') || die();
// This is the version of the plugin.
-$plugin->version = 2020031600;
+$plugin->version = 2022010100;
// This is the version of Moodle this plugin requires.
$plugin->requires = 2019111800.03;