Переключение между стилями в пределах одного шаблона
Продолжая тему кастомизации внешнего вида одного отдельно взятого веб-проекта на движке bigstreet, хочу поделиться с вами способом, благодаря которому можно реализовать в пользовательской части селектор стилей оформления вашего сайта в пределах всего одного шаблона. Это значит, что изменив всего десяток строк во вновь добавляемых стилях и используя всего одну(!) тему оформления, можно повысить привлекательность своего сайта если уж не частым обновлением контента (о, это как раз мой случай =) ), то, хотя бы расширенными возможностями в плане юзабилити для посетителей, которые, вместо скучного листинга в пределах трех страниц постов годовалой давности, смогут выбрать индивидуально подходящий цвет ссылок, кнопок, бэкграунда и прочие мелочи… помедитировать несколько минут, глядя на результат своих действий… или же просто тупо пощелкать разноцветными кнопочками. Идея возникла, когда увидел в очередном обновлении bigstreet несколько шаблонов, отличающихся лишь цветовой палитрой. Вот тогда и подумалось, что для смены цветовой гаммы не обязательно клонировать шаблон целиком. Гораздо проще использовать импорт нескольких css файлов в пределах одного единственного шаблона. И цветовых решений в этом случае может быть множество…
Это конечно не Бог весть что. Если изменять только цвет текста, ссылок и бэкграунда, то различия между вариантами оформления будут минимальны (пример для наглядности ниже).
Стиль 1 — красный

Стиль 2 — зеленый

Однако, используя подобный метод, можно сделать изменения при переходе от одного оформления к другому кардинальными, если вся графика и характеристики элементов верстки описаны у вас в css файле.
Вобщем схема реализации идеи следующая. Нужно вынести в отдельные css файлы часть кода (основного base.css) который отвечает за оформление ссылок, кнопок, цвета фона, фоновых изображений и прочего. Что для этого нужно сделать:
1. Создать в каталоге вашей темы оформления (предположим, что используется шаблон default) дополнительный каталог (например newcss).
2. Открыть в редакторе основной стилевой файл base.css, затем создать его копию, из которой удалить все, кроме следующих классов (набор лишь примерный, зависит от конкретного используемого файла стилей). В моем случае в дополнительный css файл было вынесено:
body { }
div#page-body { }
body#page { }
все подклассы
все подклассы
а также, все классы для ссылок, облака тегов и пагинации
a:hover { }
a:active, a.active { }
.red, a.red { }
a.red:hover { }
.blue, a { }
.pale_blue { }
.brown, a.brown { }
a.brown:hover { }
.pale, a.pale { }
a.pale:hover { }
div.tags_cloud { }
div.tags_cloud a.tag { }
div.tags_cloud a.tag:hover { }
.pager span.curr { }
Из шаблона default достаточно будет вынести в новый файл цвет фона страницы, цвет ссылок, цвет ссылок в облаке тегов, оформление пагинации, цвет текста, заголовков… возможно еще что-нибудь на ваше усмотрение. Так вот выносим все это добро в новый файл (назовем его base2.css, к примеру). Меняем ту часть кода, которая отвечает за цвет и бэкграунд нужного элемента. Это всего пара значений —
background: #000000; color: #FFFFFF;
если у вас к фону прицеплена картинка, то еще и
background: #000000 url('../images/моя картинка.gif') repeat;
3. Выбираем цветовую гамму для фона, ссылок, текста и сохраняем наш файл base2.css в недавно созданную папку newcss. Теперь у нас есть два стиля, и нужно сделать так, чтобы была возможность между ними переключаться. Для этого в самое начало файла base2.css дописываем код:
@import url("../base.css");
Таким образом происходит следующее: при переключении на новый стиль (base2.css), шаблон импортирует все содержимое файла base.css и сразу после этого все классы оформления фона, ссылок и кнопок заменяет на те, что присутствуют ниже, в самом файле base2.css. Таким образом, меняется лишь цвет фона, ссылок и кнопок.
Чтобы пользователь имел возможность вернуться к первоначальному стилю (вдруг то, что он увидит ему не понравится?) нужно создать все в той же папке newcss еще один файл — base_back.css. А в нем оставить лишь первую строчку
@import url("../base.css");
и больше ничего.
4. Теперь самое главное. Нужно сделать так, чтобы на стороне пользователя в кукисах хранилась информация о выбранном стиле оформления. Создаем в редакторе файл cssswitch.js следующего содержания (js код не мой — немного погуглил и нашел готовое решение):
function setActiveStyleSheet(title) {
var i, a, main;
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
a.disabled = true;
if(a.getAttribute("title") == title) a.disabled = false;
}
}
}
function getActiveStyleSheet() {
var i, a;
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");
}
return null;
}
function getPreferredStyleSheet() {
var i, a;
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
if(a.getAttribute("rel").indexOf("style") != -1
&& a.getAttribute("rel").indexOf("alt") == -1
&& a.getAttribute("title")
) return a.getAttribute("title");
}
return null;
}
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(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;
}
window.onload = function(e) {
var cookie = readCookie("style");
var title = cookie ? cookie : getPreferredStyleSheet();
setActiveStyleSheet(title);
}
window.onunload = function(e) {
var title = getActiveStyleSheet();
createCookie("style", title, 365);
}
var cookie = readCookie("style");
var title = cookie ? cookie : getPreferredStyleSheet();
setActiveStyleSheet(title);
и этот файл отправляем в папку, где хранятся все js скрипты Большой Улицы (js/)
5. Чтобы js скрипт подключился и работал как нужно, необходимо прописать место его обитания в файл config.php, в то место, где прописаны все js-скрипты Большой Улицы (это почти самый конец файла config.php)
Туда добавляем:
/* смена стиля */
$oSettings->setJs($oSettings->getPathWeb().'/js/cssswitch.js');
/* смена стиля */
6. Осталось вывести наш cssswitch.js в самом шаблоне и добавить собственно кнопки переключения между стилями. для этого в файл sample.header.tpl добавляем в место подключения стиля сразу после
<link rel="STYLESHEET" href="{$oRouter->getPathWeb()}/themes/{$oSettings->getSiteTheme()}/base.css" type="text/css">
<link rel="ALTERNATE STYLESHEET" type="text/css" href="{$oRouter->getPathWeb()}/themes/{$oSettings->getSiteTheme()}/newcss/base2.css" title="base2" /> <!-- к новому стилю -->
<link rel="ALTERNATE STYLESHEET" type="text/css" href="{$oRouter->getPathWeb()}/themes/{$oSettings->getSiteTheme()}/newcss/base_back.css" title="base_back" /> <!-- обратно к старому стилю -->
Рисуем и закидываем в themes/default/images/ кнопки-картинки для переключения стилей — base2.gif, base_back.gif.
Затем в тот же файл sample.header.tpl (или в любое другое удобное место страницы), встраиваем код кнопок селектора:
<a href="#" onClick="setActiveStyleSheet('base2'); return false;"><img src="{$oRouter->getPathWeb()}/themes/{$oSettings->getSiteTheme()}/images/base2.gif" ></a>
<a href="#" onClick="setActiveStyleSheet('base_back'); return false;"><img src="{$oRouter->getPathWeb()}/themes/{$oSettings->getSiteTheme()}/images/base_back.gif" ></a>
На этом собственно и все… Развить идею во что-то большее пока не получилось, нет свободного времени. Попробовать результат в действии и оценить полезность/бесполезность описанного безобразия можете самостоятельно.
P.S. Можно пойти дальше, и по аналогичной схеме реализовать в пользовательской части смену самих шаблонов… Такой вариант наверное будет даже интереснее.
| tommyred |
24 июня 2009 18:13 |
комментариев: 9 |
 |
3,18 |
 |
|
просмотров: 1324 |
Комментарии:
Только зарегистрированные пользователи могут оставлять комментарии.
|
|
+1
Но вы правы, если на моем скромном сайте (где количество уникальных посетителей в неделю редко догоняет количество немногочисленных страниц), нет ссылки на бигстрит (а на сей предмет я в первую очередь пообщался с разработчиком, еще когда покупал модуль галереи у redhammer`a, т.ч. совесть меня до сих пор не грызла… если вы об этом), то будет совершенно справедливо, если я не буду размещать ссылок на свой сайт здесь, на bigstreet.ru. Потому я ее удаляю.
Мне не нравится подобная «охота на ведьм»… имхо, полезнее тратить энергию на совершенствование всеми нами любимой Большой Улицы. А если ко мне есть претензии — пишите в личном сообщении.
а ссылочку жалко поставить и всё дела)
http://photomotion.ru
http://eroland.net
– вот все сайты, которым я продавал модуль.
http://adrenalinehunters.ru мой сайт и понятно, что сам я модуль могу использовать запросто.
Честно, не помню про продажу модуля сайту art-blog, хотя название вроде знакомое. Если не сложно, напомните о себе и нашем разговоре (если такой был) в ICQ 307 309 307. Правда. Я мог забыть о какой-нибудь договоренности... Но не мог забыть рассчитаться с напарником за продажу модуля.
А про ссылку - ага - я, помнится, просто отменил требование её размещать путем вычеркивания сего пункта со страницы загрузки :)
Написать комментарий