Преамбула
На одном из сайтов появилась необходимость дать пользователям возможность выбирать одну из 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 со следующим кодом:
{
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);}
}
После этого, все должно работать с кэшированием, для анонимусов и всех остальных.
Комментарии
А можно подробнее? Не могу понять, как это работает...
Разобрался. Только там переменная $custom_theme не определена.