metrpro

Делаем уведомление об использовании cookie

Recommended Posts

Следуя тенденциям времени, решил поставить себе на сайт уведомление об использовании cookie. Пока это требование установлено законодательством Евросоюза, но, говорят, добавляет кармы сайту в глазах поисков (посмотрим).

Решение состоит из двух частей - внешнего javascript-файла, который с завидной периодичностью (раз в 365 дней) уведомляет пользователя о том, что на сайте куки, и вызова этого скрипта.

1. Скрипт, ставится во внешний файл - у меня он лежит по адресу: /js/ck.js. Вот его текст:

(function (window, undefined){
	"use strict";
	var document = window.document;
	function log() {
		if (window.console && window.console.log) {
			for (var x in arguments) {
				if (arguments.hasOwnProperty(x)) {
					window.console.log(arguments[x]);
				}
			}
		}
	}
	function AcceptCookie() {
		if (!(this instanceof AcceptCookie)) {
			return new AcceptCookie();
		}
		this.init.call(this);
		return this;
	}
	AcceptCookie.prototype = {
		init: function () {
			var self = this;
			if(self.readCookie('pjAcceptCookie') == null)
			{
				self.appendCss();
				self.addCookieBar();
			}
			var clear_cookie_arr = self.getElementsByClass("pjClearCookie", null, "a");
			if(clear_cookie_arr.length > 0)
			{
				self.addEvent(clear_cookie_arr[0], "click", function (e) {
					if (e.preventDefault) {
						e.preventDefault();
					}
					self.eraseCookie('pjAcceptCookie');
					document.location.reload();
					return false;
				});
			}
		},
		getElementsByClass: function (searchClass, node, tag) {
			var classElements = new Array();
			if (node == null) {
				node = document;
			}
			if (tag == null) {
				tag = '*';
			}
			var els = node.getElementsByTagName(tag);
			var elsLen = els.length;
			var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
			for (var i = 0, j = 0; i < elsLen; i++) {
				if (pattern.test(els[i].className)) {
					classElements[j] = els[i];
					j++;
				}
			}
			return classElements;
		},
		addEvent: function (obj, type, fn) {
			if (obj.addEventListener) {
				obj.addEventListener(type, fn, false);
			} else if (obj.attachEvent) {
				obj["e" + type + fn] = fn;
				obj[type + fn] = function() { obj["e" + type + fn](window.event); };
				obj.attachEvent("on" + type, obj[type + fn]);
			} else {
				obj["on" + type] = obj["e" + type + fn];
			}
		},
		createCookie: function (name, value, days){
			var expires;
		    if (days) {
		        var date = new Date();
		        date.setTime(date.getTime()+(days*24*60*60*1000));
		        expires = "; expires="+date.toGMTString();
		    } else {
		        expires = "";
		    }
		    document.cookie = name+"="+value+expires+"; path=/";
		},
		readCookie: function (name) {
		    var nameEQ = name + "=";
		    var ca = document.cookie.split(';');
		    for(var i=0;i < ca.length;i++) {
		        var c = ca[i];
		        while (c.charAt(0) === ' ') {
		            c = c.substring(1,c.length);
		        }
		        if (c.indexOf(nameEQ) === 0) {
		            return c.substring(nameEQ.length,c.length);
		        }
		    }
		    return null;
		},
		eraseCookie: function (name) {
			var self = this;
			self.createCookie(name,"",-1);
		},
		appendCss: function()
		{
			var self = this;
			var cssId = 'pjAcceptCookieCss';
			if (!document.getElementById(cssId))
			{
			    var head  = document.getElementsByTagName('head')[0];
			    var link  = document.createElement('link');
			    link.id   = cssId;
			    link.rel  = 'stylesheet';
			    link.type = 'text/css';
			    link.href = 'https://fonts.googleapis.com/css?family=Open+Sans';
			    link.media = 'all';
			    head.appendChild(link);
			}
			var cssCode = "";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn,";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:after { -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; transition: all .5s ease-in-out; }";
			cssCode += "#pjAcceptCookieBar { position: fixed; bottom: 0; left: 0; z-index: 9999; overflow-x: hidden; overflow-y: auto; width: 100%; max-height: 100%; padding: 10px 0; background: #3b3988; opacity: 0.8; font-family: 'Open Sans', sans-serif; text-align: center;}";
			cssCode += "#pjAcceptCookieBar * { padding: 0; margin: 0; outline: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarShell { width: 90%; margin: 0 auto; }";
			cssCode += "#pjAcceptCookieBar a[href^=tel] { color: inherit; }";
			cssCode += "#pjAcceptCookieBar a:focus,";
			cssCode += "#pjAcceptCookieBar button:focus { outline: unset; outline: none; }";
			cssCode += "#pjAcceptCookieBar p { font-size: 14px; line-height: 1.4; color: #fff; font-weight: 400; }";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarActions { padding-top: 10px; }";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn { position: relative; display: inline-block; height: 20px; padding: 0 30px; border: 0; background: #4285f4; opacity: 0.9; font-size: 14px; line-height: 14px; color: #fff; text-decoration: none; vertical-align: middle; cursor: pointer; border-radius: 0; -webkit-appearance: none; -webkit-border-radius: 0; -webkit-transform: translateZ(0); transform: translateZ(0); -webkit-backface-visibility: hidden; backface-visibility: hidden; -moz-osx-font-smoothing: grayscale; }";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:hover,";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:focus { text-decoration: none; }";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:after { position: absolute; top: 0; right: 52%; bottom: 0; left: 52%; z-index: -1; border-bottom: 4px solid #14428d; background: rgba(20, 66, 141, .3); content: ''; }";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:hover:after,";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarBtn:focus:after { right: 0; left: 0; }";
			cssCode += "@media only screen and (max-width: 767px) {";
			cssCode += "#pjAcceptCookieBar { padding: 15px 0; }";
			cssCode += "#pjAcceptCookieBar .pjAcceptCookieBarShell { width: 96%; }";
			cssCode += "#pjAcceptCookieBar p { font-size: 14px; }";
			cssCode += "}";
			var styleElement = document.createElement("style");
			styleElement.type = "text/css";
			if (styleElement.styleSheet) {
			    styleElement.styleSheet.cssText = cssCode;
			} else {
				styleElement.appendChild(document.createTextNode(cssCode));
			}
			document.getElementsByTagName("head")[0].appendChild(styleElement);
		},
		addCookieBar: function(){
			var self = this;
			var htmlBar = '';
			htmlBar += '<div class="pjAcceptCookieBarShell"><form action="#" method="post">';
			htmlBar += '<p>Для улучшения работы сайта и его взаимодействия с пользователями мы используем файлы cookie. Продолжая работу с сайтом, Вы разрешаете использование cookie-файлов. Вы всегда можете отключить файлы cookie в настройках Вашего браузера.</p>';
			htmlBar += '<div class="pjAcceptCookieBarActions"><button type="button" class="pjAcceptCookieBarBtn">ОК</button></div></form></div>';
			var barDiv = document.createElement('div');
			barDiv.id = "pjAcceptCookieBar";
			document.body.appendChild(barDiv);
			barDiv.innerHTML = htmlBar;
			self.bindCookieBar();
		},
		bindCookieBar: function(){
			var self = this;
			var btn_arr = self.getElementsByClass("pjAcceptCookieBarBtn", null, "button");
			if(btn_arr.length > 0)
			{
				self.addEvent(btn_arr[0], "click", function (e) {
					if (e.preventDefault) {
						e.preventDefault();
					}
					self.createCookie('pjAcceptCookie', 'YES', 365);
					document.getElementById("pjAcceptCookieBar").remove();
					return false;
				});
			}
		}
	};
	window.AcceptCookie = AcceptCookie;
})(window);
window.onload = function() {AcceptCookie = AcceptCookie();}

2. В своем шаблоне (у меня Реалия) ищем файл main.tpl, лежит по адресу /template/frontend/realia/. Перед закрывающим тегом </body> вызываем внешний скрипт:

<script src="/js/ck.js"></script>

3. Получаем решение:

image.thumb.png.876d75a8d3294b4d4bfea84552bcb785.png

Все. Каждый пользователь ежегодно будет уведомляться о куках. 

PS: данное решение найдено на просторах интернета и немного адаптировано. Сам скрипт может быть ужат, но я не стал этого делать, т.к. работать с ним легче в таком форматировании.

PPS: кому не нравится полупрозрачность фона уведомления, уберите параметр opacity: 0.8;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Привет, а можно сделать чтоб через сутки появлялось сообщение а не через год ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
23 часа назад, Stalker сказал:

Привет, а можно сделать чтоб через сутки появлялось сообщение а не через год ?

В этой строчке

self.createCookie('pjAcceptCookie', 'YES', 365);

Замените 365 на 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: mykvartira
      Добрый день всем. Сегодня я примкнул в ваши ряды и стал лицензионным пользователем, появились шаблоны писем и разумеется начал их юзать.
      Возникло несколько вопросов!
      1. Админ не получает уведомление о размещении объявления о недвижимости (заявка) от ЗАРЕГИСТРИРОВАННЫХ пользователей.
      2. Пользователь после подачи объявления приходит
      Уважаемый, dddd! Ваше объявление размещено Адрес объявления https://mykvartira.com/arenda-kvartir/2-komn/smorgon-0/ С уважением, команда Mykvartira.com Другие уведомления приходят красивые с логотипом, подвалом и т.д.
      Также из 2 пункта получаем, что объявление не активно, а у пользователя уже есть урл. А как же другие уведомления Объявление ожидает модерации, Объявление одобрено модератором, и др.
      Как и где прописывать, настраивать. Не содержимое этих уведомлений, тут все понятно, а какое уведомление 1,2,3 и после каких действий.
      Надеюсь на вашу помощь. Спасибо
       
    • Автор: Chernetskiy
      Озадачился оптимизацией скриптов при загрузке сайта, поскольку Гугля пишет рейтинг 56/100 в этой части и предлагает:
      Удалите код JavaScript и CSS, блокирующий отображение верхней части страницы. Количество блокирующих скриптов на странице: 24. Количество блокирующих ресурсов CSS на странице: 9. Они замедляют отображение контента.
      В header.tpl отключил некоторые скрипты, например Гугл-карты, и карусели, поскольку всё равно они не используются:
      <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,300&subset=latin,cyrillic' rel='stylesheet' type='text/css'> <link rel="shortcut icon" href="{$estate_folder}/template/frontend/{$current_theme_name}/img/favicon.png" type="image/png"> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/css/bootstrap.css" type="text/css"> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/css/bootstrap-responsive.css" type="text/css"> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/libraries/chosen/chosen.css" type="text/css"> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/libraries/bootstrap-fileupload/bootstrap-fileupload.css" type="text/css"> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/libraries/jquery-ui/css/ui-lightness/jquery-ui-1.10.2.custom.min.css" type="text/css"> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/css/realia-blue.css" type="text/css"> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/css/bootstrap.corrections.css" type="text/css"> <script type="text/javascript" src="https://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU"></script> <!-- <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3&amp;sensor=true"></script> --> <!-- <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=drawing"></script> --> {literal} <!--[if lte IE 7]> <style type="text/css"> html .jqueryslidemenu{height: 1%;} /*Holly Hack for IE7 and below*/ </style> <![endif]--> {/literal} <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/jquery.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/jquery.ezmark.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/jquery.currency.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/jquery.cookie.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/retina.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/bootstrap.min.js"></script> <!-- <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/carousel.js"></script> --> <!-- <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/gmap3.min.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/gmap3.infobox.min.js"></script> --> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/libraries/jquery-ui/js/jquery-ui.min.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/libraries/chosen/chosen.jquery.min.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/libraries/iosslider/_src/jquery.iosslider.min.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/libraries/bootstrap-fileupload/bootstrap-fileupload.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/realia.js"></script> <script type="text/javascript" src="{$estate_folder}/apps/client/js/clientorderajax.js"></script> <script type="text/javascript" src="{$estate_folder}/js/estate.js"></script> <script type="text/javascript" src="{$estate_folder}/apps/system/js/sitebillcore.js"></script> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/interface.js"></script> <link rel="stylesheet" href="{$estate_folder}/template/frontend/{$current_theme_name}/css/jqueryslidemenu.css" type="text/css"> <script type="text/javascript" src="{$estate_folder}/template/frontend/{$current_theme_name}/js/jqueryslidemenu.js"></script> Что можно еще выключить? (Шаблон Realia)
    • Автор: abushyk
      Поддержка в полном объеме с версии system 3.1.2. В версиях ниже 3.0.0 шаблонизирование не поддерживается совсем. В версиях от 3.0.0 до 3.1.2 - поддержка частичная.
      При добавлении объявления и его активировании, в случае использования премодерации, пользователь-владелец получает уведомления. Эти уведомления бывают двух типов - уведомление о размещении объявления и уведомление о публикации (это уведомление производится при каждом переводе объявления из состояния "неопубликовано" в состояние "опубликовано").
      Существует два способа добавить объявление на сайт пользователем - через гостевую форму для анонимных подателей и через ЛК.
      Размещение
      Анонимный пользователь.
      При добавлении данным способом объявление всегда заходит как неопубликованное. Не существует никакой настройки способной изменить это поведение. При удачном добавлении подающий пользователь должен получить уведомление о добавлении объявления на сайт.
      Данное уведомление состоит из
      сводной таблицы данных поданного объявления стандартной темы письма из языковой переменной system::NEW_ORDER_FOR_ANON претекста system::NEW_ORDER_TEXT_FOR_ANON Для шаблонизирования данного сообщения может использоваться шаблон
      /template/frontend/шаблон/apps/system/template/mails/add_advert_added_anon.tpl внутри которого будут доступны следующие переменные:
      {$order_table} - сводная таблицы данных поданного объявления {$order_fio} - ФИО указанное анонимом в данных объявления в поле fio Уведомление будет отправлено на email указанный анонимом в данных объявления в поле email
      Зарегистрированный пользователь (Личный кабинет)
      При добавлении данным способом объявление может вноситься в сайт как в неопубликованном виде (при включенной настройке Не публиковать без модерации) так и в свободном виде (тут все будет зависеть какие права видимости установлены на галочку Публиковать). При удачном добавлении подающий пользователь должен получить уведомление о добавлении объявления на сайт.
      Данное уведомление состоит из
      сводной таблицы данных поданного объявления стандартной темы письма из языковой переменной system::REGU_ADDNOTE_SUBJ стандартного обращения к пользователю system::DEAR_FIO куда встраивается значение user.fio из данных профиля  стандартного текста о том, что объявление добавлено system::YOUR_ADV_ADD стандартного текста содержащего ссылку на объявление system::YOUR_ADV_LINK стандартного текста о необходимости модерирования system::ADV_NEED_MODERATING_FIRST при включенной опции Не публиковать без модерации Для шаблонизирования данного сообщения может использоваться шаблон
      /template/frontend/шаблон/apps/system/template/mails/reguser_add_notify.tpl внутри которого будут доступны следующие переменные:
      {$mail_adv_link} - ссылка на добавленное объявление {$mail_user_fio} - ФИО указанное пользователем в профиле {$mail_moderate_first} - 1 если включена опция "Не публиковать без модерации" {$mail_signature} - значение из настройки Общее - mail_signature {$mail_adv_id} - ID поданного объявления Уведомление о добавлении объявления будет отправлено не email указанный в профиле пользователя.
      ---------------------------------------------------------------------------------
      Активирование
      При активации объявления проводится проверка принадлежности объявления. Если у объявления указан владельцем один из зарегистрированных пользователей и логин этого пользователя не эквивалентен _unregistered (системный пользователь расцениваемый как коллективное эго анонимов), то данные для отправки уведомления будут взяты из профиля зарегистрированного пользователя.
      В противном случае данные для отправки уведомления будут взяты из данных объявления из стандартизированных полей с системными именами fio, phone, email.
      Объявление привязанное к какому-либо зарегистрированному пользователю не будет провоцировать отправку уведомления на почтовый ящик указанный в данных объявления, а только на почтовый ящик указанный в профиле.
      Для уведомления о активации объявления используются следующие данные:
      текстовая переменная system::YOUR_AD_PUBLISHED в качестве претекста сообщения текстовая переменная system::AD_LINK в качестве текста сообщения с внедренной в нее ссылкой на опубликованное объявление. текстовая переменная system::YOUR_AD_PUBLISHED_SUBJ в качестве заголовка email об активации Для шаблонизирования данного сообщения может использоваться шаблон
      /template/frontend/шаблон/apps/system/template/mails/reguser_pub_notify.tpl внутри которого будут доступны следующие переменные:
      {$mail_fio} - значение ФИО из поля user.fio (для зарегистрированного владельца) или data.fio (для анонима) {$mail_adv_id} - ID публикуемого объявления {$mail_signature} - значение из настройки Общее - mail_signature