Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: MODUL: OIL.js Cookie Consent Management

    Peter33

    • Fördermitglied
    • Beiträge: 73
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #180 am: 25. August 2020, 15:51:08
    ja, ich habe in der erweiterten Konfiguration nur Matomo aktiviert, dann unter Installationsverzeichnis den Pfad zur Matomo angegeben und Matomo Seiten ID steht auf 1. Ein Code habe ich nirgendwo händisch eingebunden. Das Tracking funktioniert ja auch, nur die Cookies werden immer gesetzt egal ob man zum ersten Mal den Shop betritt (natürlich vorher alle Cookies im Browser gelöscht) oder auch wenn man im Consent Manager Statistik abwählt.

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.185
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #181 am: 25. August 2020, 22:22:44
    Hast du bitte mal einen Link zu deinem Shop? Ich würde mir das gerne dort mal direkt anschauen.

    Grüße

    Torsten

    Peter33

    • Fördermitglied
    • Beiträge: 73
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #182 am: 26. August 2020, 10:57:49
    hat sich schon erledigt, es war mein Fehler. Ich hatte bei dem Moduleinbau eine falsche "function.piwik.php" hochgeladen. Jetzt funktioniert alles einwandfrei. Ich hätte aber noch eine andere Frage. Wenn ich im Consent Tool die Statistik abwähle, also nur die notwendigen Cookies aktiviere, wird von Matomo richtigerweise kein Cookie mehr gesetzt und das Tracking gestoppt. Matomo kann ja seit Version 3.16.6 auch ohne Cookies tracken, siehe: Wie kann ich Cookies in Matomo deaktivieren?
    Könnte man statt das Tracking komplett zu stoppen, durch Einbau dieses Codes

    Code: Javascript  [Auswählen]
      _paq.push(["disableCookies"]);

    in dem Matomoscript  der Datei function.piwik.php nur das Cookiesetzen stoppen?

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.185
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #183 am: 26. August 2020, 14:16:47
    Na wenn das geht und datenschutzkonform ist, dann musst du nur den Code in der "function.piwik.php" austauschen:

    Code: PHP  [Auswählen]
    <?php
    /* -----------------------------------------------------------------------------------------
       $Id: function.piwik.php 12814 2020-06-29 13:54:51Z GTB $

       modified eCommerce Shopsoftware
       http://www.modified-shop.org

       Copyright (c) 2009 - 2013 [www.modified-shop.org]
       -----------------------------------------------------------------------------------------
       based on:
       (c) 2011 WEB-Shop Software (function.piwik.php 1871) http://www.webs.de/

       Add the Piwik tracking code (and the possibility to track the order details as well)

       Usage: Put one of the following tags into the templates\yourtemplate\index.html at the bottom
       {piwik url=piwik.example.com id=1} or
       {piwik url=piwik.example.com id=1 goal=1}
       where "id=1" is the domain-ID you want to track (see your Piwik configuration for details)

       Asynchronous Piwik tracking is possible from Piwik version 1.1 and higher
       -----------------------------------------------------------------------------------------
       Third Party contribution:
       extended version to track
       - viewed products
       - categories
       - abandoned shopping carts
       - placed orders
       noRiddle 05-2013

       Released under the GNU General Public License
       ---------------------------------------------------------------------------------------*/


    require_once (DIR_FS_INC.'get_order_total.inc.php');
    require_once (DIR_FS_INC.'xtc_get_prid.inc.php');
    require_once (DIR_FS_INC.'xtc_get_products_name.inc.php');
    require_once (DIR_FS_INC.'xtc_get_product_path.inc.php');

    function smarty_function_piwik($params, $smarty) {
      global $PHP_SELF, $piwik_language_id, $last_order;
     
      $url = isset($params['url']) ? $params['url'] : false;
      $id = isset($params['id']) ? (int)$params['id'] : false;
      $goal = isset($params['goal']) ? (int)$params['goal'] : false;

      if (!$url || !$id) {
        return false;
      }

      require_once (DIR_WS_CLASSES.'language.php');
      $piwik_lang = new language(xtc_input_validation(DEFAULT_LANGUAGE, 'lang'));
      $piwik_language_id = $piwik_lang->language['id'];

      $url = str_replace(array('http://', 'https://'), '', $url);
      $url = trim($url, '/');
      $beginCode = '<script>';
      /*
      if (defined('MODULE_COOKIE_CONSENT_STATUS') && strtolower(MODULE_COOKIE_CONSENT_STATUS) == 'true' && (in_array(7, $_SESSION['tracking']['allowed']) || defined('COOKIE_CONSENT_NO_TRACKING'))) {
        $beginCode = '<script async data-type="text/javascript" type="as-oil" data-purposes="7" data-managed="as-oil">';
      }
      */

      $beginCode .= '
          var _paq = _paq || [];
            var u="//'
    .$url.'/";
            _paq.push([\'setSiteId\', '
    .$id.']);
            _paq.push([\'setTrackerUrl\', u+\'piwik.php\']);
            _paq.push([\'disableCookies\']);
            _paq.push([\'trackPageView\']);
            _paq.push([\'enableLinkTracking\']);'
    ."\n";

      $endCode = '
            (function(){
              var d=document,
              g=d.createElement(\'script\'),
              s=d.getElementsByTagName(\'script\')[0];
              g.type=\'text/javascript\';
              g.defer=true;
              g.async=true;
              g.src=u+\'piwik.js\';
              s.parentNode.insertBefore(g,s);
            })();
        </script>
      '
    ;
     
      $orderCode = null;
      if ((basename($PHP_SELF) == FILENAME_DEFAULT) && (isset($_GET['cPath'])) && ($_GET['cPath'] != '')) {
        $orderCode .= getCategoryName();
      }
      if ((strpos($PHP_SELF, FILENAME_PRODUCT_INFO) != false) && (isset($_GET['products_id'])) && ($_GET['products_id'] != '')) {
        $orderCode .= getProductsName();
      }
      if (strpos($PHP_SELF, FILENAME_SHOPPING_CART) != false) {
        $orderCode .= getShoppingCartContents();
      }
      if ((strpos($PHP_SELF, FILENAME_CHECKOUT_SUCCESS) != false) && (!in_array('PW-'.$last_order, $_SESSION['tracking']['order']))) {
        $_SESSION['tracking']['order'][] = 'PW-'.$last_order;
        $orderCode .= getOrders();
        if ($goal > 0) {
          $orderCode .= getOrderDetailsPiwik($goal);
        }
      }
     
      return $beginCode . $orderCode . $endCode;
    }


    /*** Functions ***/

    /* get category name */
    function getCategoryName() {
      global $piwik_language_id;

      $cPath_array = explode('_', $_GET['cPath']);
     
      $categories_id = array_pop($cPath_array);
      $categories_name = get_categories_name($categories_id, $piwik_language_id);

      return "        "."_paq.push(['setEcommerceView', productSku = false, productName = false, category = '".encode_htmlspecialchars($categories_name)."']);\n";
    }

    /* get products name */
    function getProductsName() {
      global $piwik_language_id;

      $products_id = xtc_get_prid($_GET['products_id']);
      $products_name = xtc_get_products_name($products_id, $piwik_language_id);

      $cPath = xtc_get_product_path($products_id);
      $cPath_array = explode('_', $cPath);
     
      $categories_id = array_pop($cPath_array);
      $categories_name = get_categories_name($categories_id, $piwik_language_id);
     
      return "        "."_paq.push(['setEcommerceView', '".$products_id."', '".encode_htmlspecialchars($products_name)."', '".encode_htmlspecialchars($categories_name)."']);\n";
    }

    /* get shopping cart contents */
    function getShoppingCartContents() {
      global $piwik_language_id;
     
      $products = $_SESSION['cart']->get_products();
      if ($_SESSION['cart']->count_contents() > 0) {
        $return_string = '';
        for ($i=0, $n=sizeof($products); $i<$n; $i++) {
          $cPath = xtc_get_product_path($products[$i]['id']);
          $cPath_array = explode('_', $cPath);
         
          $categories_id = array_pop($cPath_array);
          $categories_name = get_categories_name($categories_id, $piwik_language_id);

          $return_string .= "        "."_paq.push(['addEcommerceItem', '".(int)$products[$i]['id']."', '".encode_htmlspecialchars($products[$i]['name'])."', '".encode_htmlspecialchars($categories_name)."', '".format_price($products[$i]['final_price'])."', '". (int)$products[$i]['quantity']."']);\n";
        }
        $return_string .= "        "."_paq.push(['trackEcommerceCartUpdate', '".format_price($_SESSION['cart']->show_total())."']);\n";
      }
     
      return $return_string;
    }

    /* get orders */
    function getOrders () {
      global $piwik_language_id, $last_order;
     
      $orders_query = xtc_db_query("SELECT orders_id
                                      FROM "
    . TABLE_ORDERS . "
                                     WHERE orders_id = '"
    . (int)$last_order . "'
                                  ORDER BY date_purchased DESC
                                     LIMIT 1"

                                  );
      if (xtc_db_num_rows($orders_query) == 1) {
        $order = xtc_db_fetch_array($orders_query);
        $total = array();
        $return_string = '';
        $order_total_query = xtc_db_query("SELECT value,
                                                  class
                                             FROM "
    . TABLE_ORDERS_TOTAL . "
                                            WHERE orders_id = '"
    . (int)$order['orders_id'] . "'"
                                         );
        while ($order_total = xtc_db_fetch_array($order_total_query)) {
          $total[$order_total['class']] = $order_total['value'];
        }
        $order_products_query = xtc_db_query("SELECT op.products_id,
                                                     pd.products_name,
                                                     op.final_price,
                                                     op.products_quantity
                                                FROM "
    . TABLE_ORDERS_PRODUCTS . " op
                                                JOIN "
    . TABLE_PRODUCTS_DESCRIPTION . " pd
                                                     ON op.products_id = pd.products_id
                                                        AND pd.language_id = '"
    .$piwik_language_id."'
                                               WHERE op.orders_id = '"
    . (int)$order['orders_id'] . "'"
                                            );
        while ($order_products = xtc_db_fetch_array($order_products_query)) {
          $cPath = xtc_get_product_path($order_products['products_id']);
          $cPath_array = explode('_', $cPath);
         
          $categories_id = array_pop($cPath_array);
          $categories_name = get_categories_name($categories_id, $piwik_language_id);

          $return_string .= "        "."_paq.push(['addEcommerceItem', '".(int)$order_products['products_id']."', '".encode_htmlspecialchars($order_products['products_name'])."', '".encode_htmlspecialchars($categories_name)."', '".format_price($order_products['final_price'])."', '".(int)$order_products['products_quantity']."']);\n";
        }
        $return_string .= "        "."_paq.push(['trackEcommerceOrder', '".(int)$order['orders_id']."', '".(isset($total['ot_total']) ? format_price($total['ot_total']) : 0)."', '".(isset($total['ot_subtotal']) ? format_price($total['ot_subtotal']) : 0)."', '".(isset($total['ot_tax']) ? format_price($total['ot_tax']) : 0)."', '".(isset($total['ot_shipping']) ? format_price($total['ot_shipping']) : 0)."', '".(isset($total['ot_payment']) ? format_price($total['ot_payment']) : 0)."']);\n";
      }
      return $return_string;
    }

    /**
     * Get the order details
     *
     * @global <type> $last_order
     * @param mixed $goal
     * @return string Code for the eCommerce tracking
     */

    function getOrderDetailsPiwik($goal) {
      global $last_order; // from checkout_success.php

      $total = get_order_total($last_order);

      return "        "."_paq.push(['trackGoal', '" . $goal . "', '" . $total . "' ]);\n";
    }

    /* format price */
    function format_price($price) {      
      return number_format($price, 2, '.', '');
    }

    /* get categories_name */
    function get_categories_name($categories_id, $language_id) {

      $category_query = xtc_db_query("SELECT categories_name
                                        FROM "
    . TABLE_CATEGORIES_DESCRIPTION . "
                                       WHERE categories_id = '"
    .(int)$categories_id."'
                                         AND language_id = '"
    .(int)$language_id."'");
      $category = xtc_db_fetch_array($category_query);
     
      return $category['categories_name'];
    }
    ?>

    Hier noch die offizielle Quelle von Matomo: How do I use Matomo Analytics without consent or cookie banner?

    Grüße

    Torsten

    Peter33

    • Fördermitglied
    • Beiträge: 73
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #184 am: 26. August 2020, 15:45:26
    meine Idee war, nicht generell ohne Cookies zu tracken, sondern es sollte ungefähr so laufen:

    1. Kommt jemand das erste Mail auf die Webseite, trackt Matomo ohne Cookies
    2. erlaubt der Besucher dann im Consent Tool, dass Matomo ein Cookie setzen darf oder dass alle Cookies akzeptiert werden, dann soll Matomo auch mit Cookies tracken dürfen. (Hat den Vorteil dass man z.B. wiederkehrende Besucher sieht)
    3. wenn der Besucher aber im Consent Tool das Setzten von Matomo Cookies nicht erlaubt bzw. generell nur die "notwendigen Cookies" erlaubt, dann soll Matomo einfach weiter tracken, aber ohne Cookies.

      also im Fall 1 und 3 soll das Matomoscript so anfangen:

    Code: PHP  [Auswählen]
     $beginCode .= '
          var _paq = _paq || [];
            var u="//'
    .$url.'/";
            _paq.push([\'setSiteId\', '
    .$id.']);
            _paq.push([\'setTrackerUrl\', u+\'piwik.php\']);
            _paq.push([\'disableCookies\']);
            _paq.push([\'trackPageView\']);
            _paq.push([\'enableLinkTracking\']);'
    ."\n";

     

    und im Fall 2 stattdessen so anfangen:

    Code: PHP  [Auswählen]
      $beginCode .= '
          var _paq = _paq || [];
            var u="//'
    .$url.'/";
            _paq.push([\'setSiteId\', '
    .$id.']);
            _paq.push([\'setTrackerUrl\', u+\'piwik.php\']);
            _paq.push([\'trackPageView\']);
            _paq.push([\'enableLinkTracking\']);'
    ."\n";

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.185
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #185 am: 26. August 2020, 16:18:59
    Dann teste mal so:

    Code: PHP  [Auswählen]
    <?php
    /* -----------------------------------------------------------------------------------------
       $Id: function.piwik.php 12814 2020-06-29 13:54:51Z GTB $

       modified eCommerce Shopsoftware
       http://www.modified-shop.org

       Copyright (c) 2009 - 2013 [www.modified-shop.org]
       -----------------------------------------------------------------------------------------
       based on:
       (c) 2011 WEB-Shop Software (function.piwik.php 1871) http://www.webs.de/

       Add the Piwik tracking code (and the possibility to track the order details as well)

       Usage: Put one of the following tags into the templates\yourtemplate\index.html at the bottom
       {piwik url=piwik.example.com id=1} or
       {piwik url=piwik.example.com id=1 goal=1}
       where "id=1" is the domain-ID you want to track (see your Piwik configuration for details)

       Asynchronous Piwik tracking is possible from Piwik version 1.1 and higher
       -----------------------------------------------------------------------------------------
       Third Party contribution:
       extended version to track
       - viewed products
       - categories
       - abandoned shopping carts
       - placed orders
       noRiddle 05-2013

       Released under the GNU General Public License
       ---------------------------------------------------------------------------------------*/


    require_once (DIR_FS_INC.'get_order_total.inc.php');
    require_once (DIR_FS_INC.'xtc_get_prid.inc.php');
    require_once (DIR_FS_INC.'xtc_get_products_name.inc.php');
    require_once (DIR_FS_INC.'xtc_get_product_path.inc.php');

    function smarty_function_piwik($params, $smarty) {
      global $PHP_SELF, $piwik_language_id, $last_order;
     
      $url = isset($params['url']) ? $params['url'] : false;
      $id = isset($params['id']) ? (int)$params['id'] : false;
      $goal = isset($params['goal']) ? (int)$params['goal'] : false;

      if (!$url || !$id) {
        return false;
      }

      require_once (DIR_WS_CLASSES.'language.php');
      $piwik_lang = new language(xtc_input_validation(DEFAULT_LANGUAGE, 'lang'));
      $piwik_language_id = $piwik_lang->language['id'];

      $url = str_replace(array('http://', 'https://'), '', $url);
      $url = trim($url, '/');
      $beginCode = '<script>';
      if (defined('MODULE_COOKIE_CONSENT_STATUS') && strtolower(MODULE_COOKIE_CONSENT_STATUS) == 'true')) {
        if (in_array(7, $_SESSION['tracking']['allowed']) || defined('COOKIE_CONSENT_NO_TRACKING')) {
          $beginCode = '<script async data-type="text/javascript" type="as-oil" data-purposes="7" data-managed="as-oil">';
          $beginCode .= '
              var _paq = _paq || [];
                var u="//'
    .$url.'/";
                _paq.push([\'setSiteId\', '
    .$id.']);
                _paq.push([\'setTrackerUrl\', u+\'piwik.php\']);
                _paq.push([\'trackPageView\']);
                _paq.push([\'enableLinkTracking\']);'
    ."\n";
        } else {
          $beginCode = '<script>';
          $beginCode .= '
              var _paq = _paq || [];
                var u="//'
    .$url.'/";
                _paq.push([\'setSiteId\', '
    .$id.']);
                _paq.push([\'setTrackerUrl\', u+\'piwik.php\']);
                _paq.push([\'disableCookies\']);
                _paq.push([\'trackPageView\']);
                _paq.push([\'enableLinkTracking\']);'
    ."\n";
        }
      }

      $endCode = '
            (function(){
              var d=document,
              g=d.createElement(\'script\'),
              s=d.getElementsByTagName(\'script\')[0];
              g.type=\'text/javascript\';
              g.defer=true;
              g.async=true;
              g.src=u+\'piwik.js\';
              s.parentNode.insertBefore(g,s);
            })();
        </script>
      '
    ;
     
      $orderCode = null;
      if ((basename($PHP_SELF) == FILENAME_DEFAULT) && (isset($_GET['cPath'])) && ($_GET['cPath'] != '')) {
        $orderCode .= getCategoryName();
      }
      if ((strpos($PHP_SELF, FILENAME_PRODUCT_INFO) != false) && (isset($_GET['products_id'])) && ($_GET['products_id'] != '')) {
        $orderCode .= getProductsName();
      }
      if (strpos($PHP_SELF, FILENAME_SHOPPING_CART) != false) {
        $orderCode .= getShoppingCartContents();
      }
      if ((strpos($PHP_SELF, FILENAME_CHECKOUT_SUCCESS) != false) && (!in_array('PW-'.$last_order, $_SESSION['tracking']['order']))) {
        $_SESSION['tracking']['order'][] = 'PW-'.$last_order;
        $orderCode .= getOrders();
        if ($goal > 0) {
          $orderCode .= getOrderDetailsPiwik($goal);
        }
      }
     
      return $beginCode . $orderCode . $endCode;
    }


    /*** Functions ***/

    /* get category name */
    function getCategoryName() {
      global $piwik_language_id;

      $cPath_array = explode('_', $_GET['cPath']);
     
      $categories_id = array_pop($cPath_array);
      $categories_name = get_categories_name($categories_id, $piwik_language_id);

      return "        "."_paq.push(['setEcommerceView', productSku = false, productName = false, category = '".encode_htmlspecialchars($categories_name)."']);\n";
    }

    /* get products name */
    function getProductsName() {
      global $piwik_language_id;

      $products_id = xtc_get_prid($_GET['products_id']);
      $products_name = xtc_get_products_name($products_id, $piwik_language_id);

      $cPath = xtc_get_product_path($products_id);
      $cPath_array = explode('_', $cPath);
     
      $categories_id = array_pop($cPath_array);
      $categories_name = get_categories_name($categories_id, $piwik_language_id);
     
      return "        "."_paq.push(['setEcommerceView', '".$products_id."', '".encode_htmlspecialchars($products_name)."', '".encode_htmlspecialchars($categories_name)."']);\n";
    }

    /* get shopping cart contents */
    function getShoppingCartContents() {
      global $piwik_language_id;
     
      $products = $_SESSION['cart']->get_products();
      if ($_SESSION['cart']->count_contents() > 0) {
        $return_string = '';
        for ($i=0, $n=sizeof($products); $i<$n; $i++) {
          $cPath = xtc_get_product_path($products[$i]['id']);
          $cPath_array = explode('_', $cPath);
         
          $categories_id = array_pop($cPath_array);
          $categories_name = get_categories_name($categories_id, $piwik_language_id);

          $return_string .= "        "."_paq.push(['addEcommerceItem', '".(int)$products[$i]['id']."', '".encode_htmlspecialchars($products[$i]['name'])."', '".encode_htmlspecialchars($categories_name)."', '".format_price($products[$i]['final_price'])."', '". (int)$products[$i]['quantity']."']);\n";
        }
        $return_string .= "        "."_paq.push(['trackEcommerceCartUpdate', '".format_price($_SESSION['cart']->show_total())."']);\n";
      }
     
      return $return_string;
    }

    /* get orders */
    function getOrders () {
      global $piwik_language_id, $last_order;
     
      $orders_query = xtc_db_query("SELECT orders_id
                                      FROM "
    . TABLE_ORDERS . "
                                     WHERE orders_id = '"
    . (int)$last_order . "'
                                  ORDER BY date_purchased DESC
                                     LIMIT 1"

                                  );
      if (xtc_db_num_rows($orders_query) == 1) {
        $order = xtc_db_fetch_array($orders_query);
        $total = array();
        $return_string = '';
        $order_total_query = xtc_db_query("SELECT value,
                                                  class
                                             FROM "
    . TABLE_ORDERS_TOTAL . "
                                            WHERE orders_id = '"
    . (int)$order['orders_id'] . "'"
                                         );
        while ($order_total = xtc_db_fetch_array($order_total_query)) {
          $total[$order_total['class']] = $order_total['value'];
        }
        $order_products_query = xtc_db_query("SELECT op.products_id,
                                                     pd.products_name,
                                                     op.final_price,
                                                     op.products_quantity
                                                FROM "
    . TABLE_ORDERS_PRODUCTS . " op
                                                JOIN "
    . TABLE_PRODUCTS_DESCRIPTION . " pd
                                                     ON op.products_id = pd.products_id
                                                        AND pd.language_id = '"
    .$piwik_language_id."'
                                               WHERE op.orders_id = '"
    . (int)$order['orders_id'] . "'"
                                            );
        while ($order_products = xtc_db_fetch_array($order_products_query)) {
          $cPath = xtc_get_product_path($order_products['products_id']);
          $cPath_array = explode('_', $cPath);
         
          $categories_id = array_pop($cPath_array);
          $categories_name = get_categories_name($categories_id, $piwik_language_id);

          $return_string .= "        "."_paq.push(['addEcommerceItem', '".(int)$order_products['products_id']."', '".encode_htmlspecialchars($order_products['products_name'])."', '".encode_htmlspecialchars($categories_name)."', '".format_price($order_products['final_price'])."', '".(int)$order_products['products_quantity']."']);\n";
        }
        $return_string .= "        "."_paq.push(['trackEcommerceOrder', '".(int)$order['orders_id']."', '".(isset($total['ot_total']) ? format_price($total['ot_total']) : 0)."', '".(isset($total['ot_subtotal']) ? format_price($total['ot_subtotal']) : 0)."', '".(isset($total['ot_tax']) ? format_price($total['ot_tax']) : 0)."', '".(isset($total['ot_shipping']) ? format_price($total['ot_shipping']) : 0)."', '".(isset($total['ot_payment']) ? format_price($total['ot_payment']) : 0)."']);\n";
      }
      return $return_string;
    }

    /**
     * Get the order details
     *
     * @global <type> $last_order
     * @param mixed $goal
     * @return string Code for the eCommerce tracking
     */

    function getOrderDetailsPiwik($goal) {
      global $last_order; // from checkout_success.php

      $total = get_order_total($last_order);

      return "        "."_paq.push(['trackGoal', '" . $goal . "', '" . $total . "' ]);\n";
    }

    /* format price */
    function format_price($price) {      
      return number_format($price, 2, '.', '');
    }

    /* get categories_name */
    function get_categories_name($categories_id, $language_id) {

      $category_query = xtc_db_query("SELECT categories_name
                                        FROM "
    . TABLE_CATEGORIES_DESCRIPTION . "
                                       WHERE categories_id = '"
    .(int)$categories_id."'
                                         AND language_id = '"
    .(int)$language_id."'");
      $category = xtc_db_fetch_array($category_query);
     
      return $category['categories_name'];
    }
    ?>

    Grüße

    Torsten

    ChristianRothe

    • Mitglied
    • Beiträge: 181
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #186 am: 26. August 2020, 16:42:36
    Was ich verbesserungswürdig finde:

    Beim Einfügen eines neuen Cookies liest das Admin-Modul die Cookie-Tabelle aus und ermittelt die höchste ID, die in der Tabelle zu finden ist. Der neue Cookie wird dann mit der nächsthöheren neuen ID (also alte ID + 1) gespeichert. Dies ist problematisch, wenn zuvor ein anderer Cookie gelöscht werden.

    Nehmen wir mal an, dass ich unter der ID 10 einen zusätzlichen notwendigen Cookie anlegen. Dann stimmen alle Nutzer quasi zwangsweise der Verwendung des Cookies mit ID 10 zu - das ist schließlich ein notwendiger Cookie. Komme ich dann auf die Idee den Cookie mit der ID 10 wieder zu löschen und dann einen superzustimmungspflichtigen Tracking-Cookie neu einzulegen, dann erhält der superzustimmungspflichtige Cookie auch wieder die ID 10. Jetzt ist aber bei den ganzen bsiherigen Benutzern im Browser die vorgehende Zustimmung zum alten notwendigen Cookie 10 gespeichert - und das System interpretiert dies als Zustimmung zum neuen Cookie 10.  In anderen Worten: Hier wird beim Benutzer eine Cookie-Zustimmung angenommen, die er so nie gegeben hat.

    Es sind nun zwei praktikable Lösungsansätze denkbar:

    a) Die Cookies werden in einer Cookie-Tabelle mit einer ID-Spalte gespeichert, für die ein Auto-Increment definiert ist. Dies würde sicherstellen, dass ein neuer Cookie niemals eine bereits benutze ID erhält. Wäre aber etwas aufwändig zu programmieren, da ich neben der Tabelle cookie_consent_cookies die sprachspezifischen Daten in eine weitere Tabelle cookie_consent_cookies_description auslagern müsste.

    Deshalb bietet sich Möglichkeit b) an:  Statt den Maximalwert für cookies_id in der Tabelle cookie_consent_cookies zu ermitteln und um eins hochzuzählen, könnte man in der Tabelle configuration einen Schlüssel MODULE_COOKIE_CONSENT_COOKIE_MAX_ID einfügen, der immer um eins hochgezählt wird, wenn ein neuer Cookie eingefügt wird. Daraus leitet man dann die ID für einen neuen Cookie ab und verhindert auch zuverlässig, dass dieselbe ID für verschiedene Cookies doppelt benutzt wird.

    Roberto75

    • Viel Schreiber
    • Beiträge: 833
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #187 am: 26. August 2020, 17:52:07
    Vorsicht beim Tracken von Matomo ohne Cookies. Es werden dann trotzdem die Besucher wie mit Cookies getrackt, nur nicht die wiederkehrenden. Die IT-Rechtskanzlei warnt davor und sieht es als wahrscheinlich an, dass der EuG auch die Erlaubnis für das Zählen ohne Cookies für nicht zulässig hält.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #188 am: 26. August 2020, 17:57:22
    @Peter33
    @Tomcraft
    Eine geänderte function.piwik.php kann in den template-eigenen Ordner /smarty/ geladen werden. Dieses Skript wird dann gegenüber dem im external-Ordner bevorzugt.
    Damit bleibt man update-sicher und kann ggfls., falls eine Lösung in der gewünschten Richtung in den Core übernommen wird, das wieder rausnehmen.

    @ChristianRothe
    Gute Argumente und Lösungsansätze.

    @Roberto75
    Solange weder der EuGH noch der BGH irgend etwas über "Indexed DB", "Local Storage" und "Session Storage" sagen, ist das sowieso alles eine Farce. Damit kann man zig Daten speichern die genauso zum Tracken beitragen und viel mehr als Cookies können.

    Gruß,
    noRiddle

    Peter33

    • Fördermitglied
    • Beiträge: 73
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #189 am: 26. August 2020, 19:10:55
    @Tomcraft

    ich habe das getestet, hat aber leider keine Auswirkung auf das Tracking. Es verhält sich wie davor. Also wenn wenn ich alles erlaube wird mit Cookie getrackt, wenn ich Matomo Cookie nicht erlaube, wird nicht mehr getrackt. Wie ich sehe,  funktioniert das Ganze abhängig von dieser Zeile:

     
    Code: Javascript  [Auswählen]
    <script async data-type="text/javascript" type="as-oil" data-purposes="7" data-managed="as-oil">

    das ist der Status wenn man entweder das erste Mal im Shop kommt oder wenn man im Consent Tool das Setzen vom Matomo Cookies ausgeschaltet hat. Wenn man  Matomo Cookies erlaubt, sieht die Zeile dann so aus:

    Code: Javascript  [Auswählen]
    <script async data-type="text/javascript" type="text/javascript" data-purposes="7" data-managed="as-oil">

    Ich vermute das oil Modul ist so programmiert, dass das Matomo script nur ausgeführt wird, wenn der Besucher sein Einverständnis gibt . In deren Doc habe ich folgendes dazu gefunden.

    http://oil.axelspringer.com/release/1.2.5/docs/index.html#soft-blocking-of-dom-elements

    Zitat
    With OIL you can manage third-party scripts to ensure that they only run if the user has given consent to their use.

    Deswegen denke ich, dass man das gewünschte Ergebnis wohl nur durch Anpassen der oil.min.js erreichen kann,  oder?

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.185
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #190 am: 27. August 2020, 13:24:30
    [...]
    Deswegen denke ich, dass man das gewünschte Ergebnis wohl nur durch Anpassen der oil.min.js erreichen kann,  oder?

    Ja vermutlich, es sei denn, jemand hat noch eine andere Idee dazu.

    Grüße

    Torsten

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #191 am: 27. August 2020, 14:53:52
    @Peter33
    @Tomcraft

    Zum Verständnis:
    In einem HTML5 Dokument wird JavaScript ausgeführt, wenn der öffnende <script>-Tag keinen type-Parameter enthält oder wenn der type-Parameter den Wert "text/javascript" hat.

    Konkret: folgende JavaScript Codes werden ausgeführt,

    Code: XML  [Auswählen]
    <script>
      ...
    </script>

    <script data-irgendwas="irgendwas">
      ...
    </script>

    <script type="text/javascript">
      ...
    </script>

    aber folgende JavaScript Codes werden nicht ausgeführt.

    Code: XML  [Auswählen]
    <script type="as-oil">
      ...
    </script>

    <script type="irgendwas">
      ...
    </script>

    Eine Idee wäre nun, gegebenenfalls mittels eines zusätzlichen Javascript Code (jQuery) den type-Parameter (type="as-oil") entweder zu entfernen oder ihn in (type="text/javascript") umzuschreiben. So müsste man den Code der Datei oil.min.js nicht anpassen.

    PS:
    Wie ich gerade sehe wird das oil.js nicht mehr weiter entwickelt.
    Eine Alternative dazu gäbe es hier -> https://github.com/kiprotect/klaro

    Gruss
    Hanspeter

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #192 am: 27. August 2020, 15:13:47
    Hatte ich auch überlegt.
    Problem dabei soweit ich das verstehe:
    Wann ist "gegebenenfalls", also wie kann man das code-technisch in Conditions packen ?
    Denn, man möchte ja bei aktiviertem Cookie Consent Tool vor der Entscheidung auf Ablehnung oder nicht bereits PIWIK ohne Cookies aktiv haben und nach der Entscheidung entweder mit oder weiterhin ohne Cookies.
    Es scheitert an den Conditions...

    Gruß,
    noRiddle

    intermedia

    • Neu im Forum
    • Beiträge: 40
    • Geschlecht:
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #193 am: 27. August 2020, 16:40:21
    Kurze Frage:
    Kann man das Modul auch nutzen um iframes zu verwalten?
    Also wenn man was externes einbetten will, was ggf auch Cookies setzt.

    EDIT: Ah, hat sich schon erledigt, einfach das vom "img" nehmen, das geht. :)

    Code: PHP  [Auswählen]
    <iframe data-managed="as-oil" data-src="https://domain.de/script.php" data-title="External Script" data-purposes="10" ></iframe>

    ChristianRothe

    • Mitglied
    • Beiträge: 181
    Re: MODUL: OIL.js Cookie Consent Management
    Antwort #194 am: 28. August 2020, 08:42:08
    In /admin/cookie_consent.php verbergen sich noch drei Bugs.

    In den Zeilen 479 bis 486 heißt es:

    Code: PHP  [Auswählen]
                        $products_query = xtc_db_query("SELECT *
                                                          FROM "
    .TABLE_COOKIE_CONSENT_CATEGORIES."
                                                         WHERE categories_id = '"
    .(int)$oInfo->categories_id."'
                                                      GROUP BY products_id"
    );
                        $products_total = xtc_db_num_rows($products_query);
                        if ($products_total > 0) {
                          $contents[] = array('text' => '<br />' . sprintf(TEXT_INFO_WARNING_PRODUCTS, $products_total));
                        }  

    • Bug 1: "group by products_id". In  der abgefragte Tabelle existiert keine Spalte products_id
    • Bug 2: Eigentlich müsste hier die Tabelle cookies_consent_cookies abgefragt werden (und nicht cookies_consent_categories). Denn es soll doch herausgefunden werden, ob in der zu löschenden Kategorie noch Cookies enthalten sind.
    • Bug 3: sprintf(TEXT_INFO_WARNING_PRODUCTS, $products_total) Die Sprachkonstante TEXT_INFO_WARNING_PRODUCTS ist in der Sprachdatei /lang/german/admin/cookie_consent.php nicht definiert.

    Besser sollte es also in den fraglichen Zeilen in /admin/cookie_consent.php heißen:

    Code: PHP  [Auswählen]
                        $cookies_query = xtc_db_query("SELECT *
                                                          FROM "
    .TABLE_COOKIE_CONSENT_COOKIES."
                                                         WHERE categories_id = '"
    .(int)$oInfo->categories_id."'
                                                      GROUP BY cookies_id"
    );
                        $cookies_total = xtc_db_num_rows($cookies_query);
                        if ($cookies_total > 0) {
                          $contents[] = array('text' => '<br />' . sprintf(TEXT_INFO_WARNING_COOKIES, $cookies_total));
                        }  

    In /lang/german/admin/cookie_consent.php muss dann noch ergänzt werden:

    Code: PHP  [Auswählen]
    define('TEXT_INFO_WARNING_COOKIES', '<b>WARNUNG:</b> Es existieren noch %s Cookies, die mit dieser Kategorie verbunden sind! Diese Cookies werden zusammen mit der Kategorie gelöscht.');
    Trade Republic - Provisionsfrei Aktien handeln
    11 Antworten
    2488 Aufrufe
    10. Dezember 2021, 21:55:58 von gdl-joe
    11 Antworten
    3303 Aufrufe
    17. Dezember 2021, 12:40:07 von Pixelknecht
    8 Antworten
    1358 Aufrufe
    16. Oktober 2023, 16:47:54 von Tomcraft
    2 Antworten
    766 Aufrufe
    07. Oktober 2022, 13:16:22 von Viol