Alternativnφ styly - pou₧itφ skript∙ na stran∞ serveru
Tφmto Φlßnkem zakonΦφm svou sΘrii pojednßnφ o alternativnφch stylech. Tentokrßt vßm ukß₧i, jak zm∞nit styl strßnky pomocφ skriptu na stran∞ serveru. Zφskßte tak kompletnφ p°ehled r∙zn²ch mo₧nostφ prßce s alternativnφmi styly.
Ob∞ °eÜenφ, popsanß v p°edchozφch dvou Φlßncφch, vyu₧φvala ji₧ existujφcφ element link
. Prvnφ technika p°edpoklßdala, ₧e prohlφ₧eΦ naΦte obsah mno₧iny t∞chto element∙ a nabφdne u₧ivateli p°φsluÜnΘ menu, druhß pou₧φvala uzly, p°edstavujφcφ tyto elementy, k vypφnßnφ a zapφnßnφ jim p°φsluÜn²ch soubor∙. Tentokrßt ovÜem budeme muset zaΦφt p∞kn∞ od zaΦßtku.
Skriptujeme na stran∞ serveru
╪eÜenφ na stran∞ serveru funguje p°esn∞ naopak ne₧ °eÜenφ na stran∞ klienta. Do XHTML dokumentu zapφÜeme pouze element link
pro stßl² styl. DalÜφ odkazy se budou do dokumentu zapisovat pomocφ skriptu na stran∞ serveru (v tomto p°φpad∞ jsem si vybral PHP). Toto °eÜenφ se do jistΘ mφry podobß °eÜenφ, uvedenΘmu v p°edchozφm Φlßnku, v tom, ₧e takΘ vyu₧φvß cookies.
Ka₧dΘmu stylu p°i°adφme jmΘno. Proto₧e nepracujeme v∙bec s atributem title
elementu link
, m∙₧eme si jmΘna vymyslet. Nßsledujφcφ v²pis k≤du p°edstavuje funkci, kterß na zßklad∞ °et∞zcovΘho parametru vracφ pole obsahujφcφ jmΘna p°φsluÜn²ch soubor∙. Mno₧nΘ Φφslo je v tomto p°φpad∞ na mφst∞, tato funkce je navr₧ena tak, aby jednomu jmΘnu odpovφdalo vφce stylov²ch soubor∙. Tφmto simulujeme sdru₧ovßnφ styl∙ popsanΘ v prvnφ Φlßnku. Dßle definujeme dv∞ konstanty, Φφselnou DAYS, p°edstavujφcφ poΦet dn∙, po kterΘ bude platit cookie s nßzvem stylu, a °et∞zec BASE, kter² oznaΦuje stav, kdy u₧ivatel chce vypnout ·pln∞ vÜechny styly krom∞ stßlΘho.
define("DAYS",10);
function getFileName($name)
{
$ret=array();
if ($name!=BASE)
{
if (!$name) $name="pref";
switch ($name)
{
case "pref": $ret[0]="pref_style.css"; break;
case "first": $ret[0]="alt_style1.css"; break;
case "second": $ret[0]="alt_style2.css"; break;
case "third": $ret[0]="alt_style3a.css"; $ret[1]="alt_style3b.css"; break;
}
}
return $ret;
}
Funkce vracφ pole $ret[], kterΘ je na zaΦßtku ·pln∞ prßzdnΘ. Pokud je funkci p°edßn parametr rovnajφcφ se hodnot∞ konstanty BASE, je toto prßzdnΘ pole vrßceno. V opaΦnΘm p°φpad∞ se jeÜt∞ testuje, jestli nebyl p°edßn funkci prßzdn² °et∞zec (to se stane, pokud cookie se jmΘnem stylu neexistuje). Pokud je tomu tak, je do parametru p°i°azena hodnota pref (v tomto textu dßle p°edpoklßdßm, ₧e preferovan² styl mß jmΘno pref, vy si to samoz°ejm∞ m∙₧ete ve sv²ch skriptech zm∞nit). Dßle se na rozcestnφku switch
testuje hodnota $name a pole $ret se plnφ p°φsluÜn²mi jmΘny soubor∙. Ve vaÜich skriptech se bude tato Φßst pochopiteln∞ liÜit, m∙₧ete si zvolit libovolnß jmΘna a jim p°φsluÜejφcφ soubory.
N∞kde v textu strßnky se samoz°ejm∞ musφ objevit odkazy umo₧≥ujφcφ zm∞nu stylu. V tomto p°φpad∞ (a na strßnce index.php) budou vypadat takto:
<a href="index.php?style=first">1. styl</a>
<a href="index.php?style=second">2. styl</a>
<a href="index.php?style=third">3. styl</a>
<a href="index.php?style=none">pouze zßkladnφ styl</a>
Odkazy tedy budou sm∞°ovat na stejnou strßnku, jenom budou navφc p°edßvat jmΘno stylu pomocφ get prom∞nnΘ style. Z toho tedy vypl²vß, ₧e ka₧dß strßnka m∙₧e zφskat jmΘno svΘho stylu prost°ednictvφm jednoho ze dvou mo₧n²ch zdroj∙. Bu∩ jako souΦßst svΘ adresy nebo z cookie. Ke druhΘ zmφn∞nΘ mo₧nosti dojde, pokud je strßnka spuÜt∞na odjinud ne₧ z uveden²ch odkaz∙, tedy jφ nenφ p°edßna ₧ßdnß prom∞nnß style. Nßsledujφcφ funkce naΦte jmΘno stylu:
{
if (isset($_GET["style"]))
{
return $_GET["style"];
}
else
{
return (isset($_COOKIE["style"]) ? $_COOKIE["style"] : "");
}
}
Funkce se nejd°φve pokusφ p°evzφt prom∞nnou style z adresy dokumentu. Pokud nebyla takto ₧ßdnß p°edßna, zkusφ ji p°evzφt z cookie. Pokud nenφ hledanß hodnota ani tam, vrßtφ prßzdn² °et∞zec. K tomu m∙₧e dojφt v p°φpad∞, ₧e cookie neexistuje a u₧ivatel nep°iÜel na strßnku jednφm z uveden²ch odkaz∙. V tomto p°φpad∞ bude pou₧it preferovan² alternativnφ styl.
Poslednφ funkce p°evezme jmΘno stylu, vyhledß k n∞mu odpovφdajφcφ soubory (pomocφ ji₧ uvedenΘ funkce getFileName()) a zapφÜe do dokumentu elementy link
s odpovφdajφcφm obsahem:
{
foreach (getFileName($name) as $style)
{
echo("<link href=\"$style\" type=\"text/css\" rel=\"stylesheet\" />\n");
}
}
Nynφ u₧ pot°ebujeme pouze krßtk² k≤d, kter² ulo₧φ do cookie jmΘno prßv∞ zvolenΘho stylu. Nezapome≥te, ₧e pokud nepou₧φvßte output buffering nebo ekvivalentnφ techniku, tento k≤d se musφ v dokumentu objevit jeÜt∞ p°edtφm, ne₧ vßÜ skript provede jak²koli v²stup do prohlφ₧eΦe (jinak °eΦeno, nejlΘpe je uvΘst tento k≤d hned na zaΦßtek dokumentu):
{
setcookie("style",$_GET["style"],time()+60*60*24*DAYS,"/");
}
Toto byl poslednφ nutn² kus k≤du, kompletnφ skript si m∙₧ete stßhnout. StaΦφ jej pak includovat na zaΦßtek ka₧dΘ vaÜφ strßnky jeÜt∞ p°ed jak²mkoli v²stupem, proto₧e krom∞ deklaracφ vÜech pot°ebn²ch funkcφ obsahuje i zmφn∞n² krßtk² k≤d k ulo₧enφ jmΘna stylu do cookie. Ve svΘm dokumentu v sekci head pou₧ijte funkce nßsledovn∞:
...
<link href="base_style.css" type="text/css" rel="stylesheet" />
<?php writeLink(loadStyle()); ?>
...
</head>
V hlaviΦce strßnky je uveden stßl² styl a dalÜφ styly jsou zapisovßny podle hodnoty jmΘna stylu naΦtenΘ funkcφ loadStyle().
V²hody a nev²hody
╪eÜenφ pomocφ skriptu na stran∞ serveru mß jednu zßsadnφ v²hodu oproti °eÜenφm uveden²m v p°edchozφch Φlßncφch, bude fungovat ·pln∞ vÜude a nemusφ se spolΘhat na mo₧nosti prohlφ₧eΦe. Tato v²hoda je natolik v²znamnß, ₧e z urΦitΘho pohledu je toto °eÜenφ nejlepÜφ ze vÜech uveden²ch. Nev²hodou je, ₧e urΦit²m zp∙sobem podr²vß sΘmantiku dokumentu. Techniky z minul²ch dφl∙ toti₧ pracovaly se seznamem styl∙, kter² byl p°φmo souΦßstφ dokumentu v podob∞ mno₧iny element∙ link
. V p°φpad∞ °eÜenφ na stran∞ serveru vÜe funguje obrßcen∞. Seznam styl∙ je definovßn vn∞ samotn² XHTML dokument (v naÜem p°φpad∞ je definovßn funkcφ getFileName()) a zapisujφ se pouze vybranΘ styly.
┌kolem tΘto sΘrie Φlßnk∙ nebylo pouze nabφdnout hotovß °eÜenφ pou₧itelnß k v²m∞n∞ alternativnφch styl∙, ale p°edevÜφm porozum∞t jednotliv²m mo₧nostem, jak alternativnφ styly u₧ivateli nabφdnout. Pokud bych si jß osobn∞ m∞l vybrat jedno z nabφdnut²ch °eÜenφ, nejspφÜe bych zvolil klientskΘ skriptovßnφ, i p°es vÜechna negativa. Je ovÜem mo₧nΘ, ₧e vaÜe volba bude odliÜnß, proto doufßm, ₧e vßm pro ni tyto Φlßnky poskytly dostatek argument∙.