Navigace

Hlavnφ menu

 

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("BASE","none");
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=pref">preferovan² alternativnφ styl</a>
<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:

function loadStyle()
{
  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:

function writeLink($name)
{
  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):

if (isset($_GET["style"]))
{
  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∞:

<head>
...
<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∙.

Dudek, Jan (21. 4. 2004)