<h2>Alternativnφ styly - pou₧itφ skript∙ na stran∞ serveru</h2>
<p id='prepend'>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.</p>
<p>Ob∞ °eÜenφ, popsanß v p°edchozφch dvou Φlßncφch, vyu₧φvala ji₧ existujφcφ element <code>link</code>. 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.</p>
<h3>Skriptujeme na stran∞ serveru</h3>
<p>╪eÜenφ na stran∞ serveru funguje p°esn∞ naopak ne₧ °eÜenφ na stran∞ klienta. Do XHTML dokumentu zapφÜeme pouze element <code>link</code> 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.</p>
<p>Ka₧dΘmu stylu p°i°adφme jmΘno. Proto₧e nepracujeme v∙bec s atributem <code>title</code> elementu <code>link</code>, 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 <samp>DAYS</samp>, p°edstavujφcφ poΦet dn∙, po kterΘ bude platit cookie s nßzvem stylu, a °et∞zec <samp>BASE</samp>, kter² oznaΦuje stav, kdy u₧ivatel chce vypnout ·pln∞ vÜechny styly krom∞ stßlΘho.</p>
<div class='sample'>
define("BASE","none");
<br />define("DAYS",10);
<br />
<br />function getFileName($name)
<br />{
<br /> $ret=array();
<br />
<br /> if ($name!=BASE)
<br /> {
<br /> if (!$name) $name="pref";
<br /> switch ($name)
<br /> {
<br /> case "pref": $ret[0]="pref_style.css"; break;
<br /> case "first": $ret[0]="alt_style1.css"; break;
<br /> case "second": $ret[0]="alt_style2.css"; break;
<br /> case "third": $ret[0]="alt_style3a.css"; $ret[1]="alt_style3b.css"; break;
<br /> }
<br /> }
<br /> return $ret;
<br />}
</div>
<p>Funkce vracφ pole <samp>$ret[]</samp>, kterΘ je na zaΦßtku ·pln∞ prßzdnΘ. Pokud je funkci p°edßn parametr rovnajφcφ se hodnot∞ konstanty <samp>BASE</samp>, 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 <samp>pref</samp> (v tomto textu dßle p°edpoklßdßm, ₧e preferovan² styl mß jmΘno <samp>pref</samp>, vy si to samoz°ejm∞ m∙₧ete ve sv²ch skriptech zm∞nit). Dßle se na rozcestnφku <code>switch</code> testuje hodnota <samp>$name</samp> a pole <samp>$ret</samp> 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.</p>
<p>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 <em>index.php</em>) budou vypadat takto: </p>
<p>Odkazy tedy budou sm∞°ovat na stejnou strßnku, jenom budou navφc p°edßvat jmΘno stylu pomocφ <em>get</em> prom∞nnΘ <samp>style</samp>. 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ß <samp>style</samp>. Nßsledujφcφ funkce naΦte jmΘno stylu:</p>
<p>Funkce se nejd°φve pokusφ p°evzφt prom∞nnou <samp>style</samp> 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.</p>
<p>Poslednφ funkce p°evezme jmΘno stylu, vyhledß k n∞mu odpovφdajφcφ soubory (pomocφ ji₧ uvedenΘ funkce <samp>getFileName()</samp>) a zapφÜe do dokumentu elementy <code>link</code> s odpovφdajφcφm obsahem:</p>
<p>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 <a href='http://interval.cz/clanek.asp?article=1063' title='Kocman, Ji°φ: UÜet°ete a₧ 80 % datovΘho p°enosu'>output buffering</a> 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):</p>
<p>Toto byl poslednφ nutn² kus k≤du, <a href='podklady/dudek/799/switch.zip'>kompletnφ skript</a> 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 <samp>head</samp> pou₧ijte funkce nßsledovn∞: </p>
<p>V hlaviΦce strßnky je uveden stßl² styl a dalÜφ styly jsou zapisovßny podle hodnoty jmΘna stylu naΦtenΘ funkcφ <samp>loadStyle()</samp>.</p>
<h3>V²hody a nev²hody</h3>
<p>╪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∙ <code>link</code>. 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φ <samp>getFileName()</samp>) a zapisujφ se pouze vybranΘ styly.</p>
<p>┌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∙.</p>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3280' title='(36 komentß°∙)'>Interval.cz a jeho Φtenß°i</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3296' title='(30 komentß°∙)'>PHP pro pokroΦilΘ - znovu t°φdy a objekty</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3301' title='(24 komentß°∙)'>Kompletnφ pr∙vodce XSLT - ·vod do problematiky</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3276' title='(21 komentß°∙)'>Webovß grafika podle TomßÜe BarΦφka</a></li>