Произвольные темы на сайте для анонимных пользователей

Главные вкладки

Аватар пользователя Koreychenko Koreychenko 14 сентября 2012 в 10:31

Преамбула

На одном из сайтов появилась необходимость дать пользователям возможность выбирать одну из 2-х тем.
Первая тема - обычная, вторая - для слабовидящих.

С этой задачей отлично справляется модуль Switchtheme

Данный модуль, позволяет переключать темы, передавая имя темы в get запросе вида
www.sitename.com?theme=mytheme

Для авторизованного пользователя все работает нормально. Для анонимуса - тема меняется только для текущей страницы. После перехода на другую страницу, тема сбрасывается на дефолтную.

Тут нужно упомянуть, что сайт еще и кэшируется, что вносит дополнительные трудности.

Решение:
Необходимо сохранять выбранную тему в куках и передавать её значение в том случае, если переменная theme не указана.

Код:

Создаем файлик модуля, в который прописываем:
<?php
function mymodule_custom_theme($return_single = TRUE) {
drupal_add_js(drupal_get_path('module', 'mymodule').'/mymodule.js', 'file');
global $user;

// The HTTP GET parameter 'theme' always has precedence.
if (isset($_GET['theme'])) {
$custom_theme['get'] = $_GET['theme'];

}
return $custom_theme;
}
?>

Дальше создаем в папке с модулем файл mymodule.js со следующим кодом:

function getCookie(c_name)
{
var i,x,y,ARRcookies=document.cookie.split(";");
for (i=0;i<ARRcookies.length;i++)
{
  x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
  y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
  x=x.replace(/^\s+|\s+$/g,"");
  if (x==c_name)
    {
    return unescape(y);
    }
  }
}

function setCookie(c_name,value,exdays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie=c_name + "=" + c_value + ";path=/";
}

function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

var theme = getUrlVars()["theme"];
var k = getCookie('theme');
var hash = getUrlVars()["render"];
if (hash != 'overlay') {
if (k === undefined) {setCookie('theme','minjust',365); theme = 'minjust';}
if (theme === undefined) {document.location.href=document.location+'?theme='+k;} else {setCookie('theme',theme,365);}
}

После этого, все должно работать с кэшированием, для анонимусов и всех остальных.

Комментарии