Alternativní CSS styly a jejich přepínání lépe - objektově
MyEgo.cz
Alternativní CSS styly a jejich přepínání lépe - objektově
Předchozí řešení, přepínání CSS stylů, které jsem popisoval, je plně funkční a komfortní. Lepší přístup je nicméně, místo pár funkcí s parametry, vytvořit si třídu, objekt styleSwitcher.
Pokud budeme předchozí skript používat pro jeden, jediný projekt, není zrovna nutné psát třídu, nicméně, je to, obecně, vhodné. Proč? Třídy jsou o znovupoužitelnosti programového kódu. Za měsíc, dva, budete dělat další projekt, a myslíte si, že je vhodnější pokaždé mírně upravovat zdrojový kód, nebo mít jednu otestovanou třídu, které jen předáte parametry, popřípadě některé funkce podědíte? Samozřejmě, správným řešením je objektové programování :)
Tento článek je reakcí na jeden konkrétní, nepovedený seriál na Interval.cz, který obsahuje značně neforemný a nedotažený skript.
Konstruktor
Konstruktor provede inicializaci proměnných, které bude daná třída používat.
function styleSwitcher( $_cssstyles='default', $_cssnames='default', $_cookie='styles', $_url='', $_defaultsheet='default', $_version='') { $this->cssstyles=$_cssstyles; $this->cssnames=$_cssnames; $this->version=$_version; $this->url=$_url; $this->defaultsheet=$_defaultsheet; $this->cookie=$_cookie; $this->myfiles = explode(',',$this->cssstyles); $this->mynames = explode(',',$this->cssnames); }
Metody třídy
Následně si napíšeme metodu objektu styleSwitcher, currentStyle(), která nám vrátí aktuální, uživatelem předvolený, styl.
function currentStyle() { $mycookie=$this->defaultsheet; if (isset($_COOKIE[$this->cookie])) if (in_array($_COOKIE[$this->cookie],$this->myfiles)) $mycookie=$_COOKIE[$this->cookie]; return $mycookie; }
Metodou meta() vypíšeme do XHTML souboru stylesheet a alternate stylesheets.
function meta() { $i=0; $mycookie=$this->currentStyle(); foreach ($this->myfiles as $mystyle){ $curl=$this->url.$mystyle.$this->version.'.css' ; if($mystyle==$mycookie) // aktualni styl echo "<link rel='stylesheet' type='text/css' href='$curl' ". "media='screen,projection' title='".$this->mynames[$i++]."' />n"; else // alternativni styly echo "<link rel='alternate stylesheet' type='text/css' href='".$curl."' ". "media='screen,projection' title='".$this->mynames[$i++]."' />n"; } }
Metodou select() vykreslíme formulář pro výběr stylu, včetně zobrazení předvoleného stylu:
function select() { $mycookie=$this->currentStyle(); $serverurl = "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; echo "<form id='cssswitch' method='post' action='$serverurl'>n"; echo "<div><fieldset><legend>Styl</legend>n"; echo "<select name='cssselected'>n"; $i=0; foreach ($this->myfiles as $mystyle){ if( $mystyle == $mycookie) $deff="selected='selected'"; else $deff=""; echo "<option value='$mystyle' $deff ". "id='opt".strval($i)."'>".$this->mynames[$i]."</option>n"; $i++; } echo "</select>n"; echo "<input type='submit' name='submitcss' value='Změnit styl' />n"; echo "</fieldset></div></form>n"; }
A nakonec metodou save() danou volbu uživatele uložíme :
function save() { if ( isset($_POST['submitcss']) ) { setCookie($this->cookie,$_POST['cssselected'], time()+36002430,'/'); $serverurl = "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; header("Location: $serverurl"); $url = htmlspecialchars($url); die("Redirected: <a href="$serverurl">.$serverurl</a>"); } }
Jak tuto třídu použijeme?
<?php $CSS =& new styleSwitcher('r,b,g','red,blue,green','stylescookie','','r'); $CSS->save(); ?> <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'><html><head> <?php $CSS->meta(); ?> </head><body> <?php $CSS->select(); ?> </body></html>
Celá třída styleSwitcher.php.txt ke stažení.
když jsem psal komentář na Interval, tesknící po Objektově Orientovaném Programování (OOP), a nadhodil otázku 'Proč?', upozornil mě mobil na důležitou schůzku, takže jsem dodal 'Proto' a pádil k autu. (doufaje, že někdo převezme štafetu dřív, než se objeví negativní komentáře). Radku, potěšil jste mě maximálně! :-)
Právě znovupoužitelnost programového kódu je mnoha programátorům cizí a doplácejí na to především sami. (...a kdybych spustil nějaký blog, tak všechny příklady budu rozhodně ubírat tímto směrem...)
Na první pohled přináší objektové programování samé výhody. Ale pro koho? Pro programátora, nebo pro uživatele? Jde o to, že ve výsledku prostě není kód tak efektivní. Nevím, jestli je to tím, jestli je to principiální chybou nebo tím, že neexistuje pořádný kompiler, ale proč například většina velkých unixových služeb (Apache, PHP atd.) jsou psaná v C a ne v C++?
[2] proč? historické důvody.. Neobjektově se velký projekt psát nedá, ale přepisovat starý velký neobjektový projekt do objektů taky ne ;)
Neobjektově posledních 5 let píšou už jen programátorští nedouci, co zůstali někde v době DOSového Q-basicu, či kodéři triviálního HTML, těm skutečné programování nikdy moc nejde..
PS: to není narážka na Vás, nechápejte ji prosím tak.
[2] Koukni třeba na FireBird (SQL), ten se z původní neobjektové Interbase komplet přepisuje do O. A je to poměrně velký projekt. Nicméně (v souladu s Radkovým rýpnutím) muselo tomu předcházet oddělení vývojové větve vedené "mladšími" programátory. Původní IB si pořád "jede" svým konzervativním směrem.
Zajímavé, načal jsem větší projekt v PHP, napřed jsme diskutovali o tom, co to má umět. Pak jsem promýšlel, jak to napsat. Tak jsem tak přemýšlel, přemýšlel, pak jsem otevřel svůj oblíbený editor a napsal:
<?php
class ....
síla oop je nejen ve znovu použitelnosti, ale taky ve zjednodušování, a dědičnosti. Napíšete nadřazenou třídu třeba pro přístup k db (nic lepšího mě nenapadlo), pak od ní odvodíte třídu pro MySQL, Postgres nebo MSSQL, ale používáte pořád to samé. Změníte SQL server, předěláte jedno include (případně ještě přihlašovací údaje) a zbytek zůstane STEJNÝ!!!
Je to super, ale výběr bych chtěl udělat trochu jinak - kliknutím na náhled. Jak mám formulovat jednotlivé odkazy?