| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
V p°edchozφch dvou dφlech tohoto serißlu jste si navrhli databßzi pro cel² systΘm a p°ipravili n∞kterΘ nezbytnΘ Φßsti, jako je rozvr₧enφ adresß°∙ na serveru. Dopln∞k k p°edchozφm Φlßnk∙m û abychom nemuseli do ka₧dΘ strßnky vklßdat znovu kaskßdovΘ styly (jak jsem takΘ post°ehl z diskuse ke druhΘmu dφlu), vytvo°φme si na serveru jeÜt∞ adresß° css, kter² bude obsahovat soubor se styly.
V²slednß adresß°ovß struktura, dopln∞nß o styly bude tedy vypadat nßsledujφcφm zp∙sobem:
- Administrace û nßstroje pro sprßvu redakΦnφho systΘmu
- CSS û kaskßdnφ styly
- Include û spoleΦnΘ funkce
- Redakce û nßstroje pro autory
- Images û obrßzky
Do jednotliv²ch strßnek potom budeme vklßdat pouze nßsledujφcφ k≤d, kter² zajistφ naΦtenφ sprßvn²ch styl∙:
Ti z vßs, kte°φ by cht∞li zajistit u vytvß°enΘho redakΦnφho systΘmu odliÜn² vzhled strßnek p°i zobrazovßnφ na obrazovce oproti vzhledu p°i tisku strßnky, mohou u takto vklßdan²ch kaskßdov²ch styl∙ pou₧φt jeÜt∞ atribut MEDIA s hodnotou SCREEN nebo PRINT, podle toho, pro jakΘ za°φzenφ se majφ danΘ styly aplikovat. V hlaviΦce souboru pak budou vlo₧eny styly dvojφ, jedny pro tisk a druhΘ pro zobrazovßnφ na obrazovce. Ale to jsme odboΦili od p∙vodnφho zßm∞ru dneÜnφho pokraΦovßnφ û tφm je administrace rubrik.
Administrace rubrik
Na zaΦßtek bychom si m∞li struΦn∞ °φci n∞co o tom, co vlastn∞ znamenß administrace rubrik. Jak jsem ji₧ zmφnil v ·vodu tohoto Φlßnku, rubrika m∙₧e b²t chßpßna jako adresß° nebo prostor, kter² nßm (a Φtenß°∙m samoz°ejm∞) slou₧φ pro t°φd∞nφ a za°azovßnφ r∙zn²ch kategoriφ a skupin Φlßnk∙.
Rubriky samotnΘ jsou logicky organizovßny tak, ₧e vytvß°ejφ strom, tedy tΘm∞° ka₧dß rubrika mß n∞jakou rubriku nad°azenou a m∙₧e mφt takΘ n∞jakΘ rubriky pod°azenΘ (vno°enΘ). Ty rubriky, kterΘ nemajφ ₧ßdnou nad°azenou, nßm tvo°φ ko°en stromu.
Pokud budeme tedy navrhovat, jak realizovat danou problematiku, musφme se zamyslet, o jakΘ objekty se bude jednat. NaÜφm ·kolem je realizovat sprßvu rubrik, tudφ₧ hlavnφm a jedin²m objektem naÜeho zßjmu v tuto chvφli bude rubrika (Φlßnky, autory a ostatnφ zatφm ponechme stranou, dostaneme se k nim v dalÜφch pokraΦovßnφch).
Z databßzovΘho hlediska p∙jde o jednu jedinou samostatnou tabulku, kterou jste si vytvo°ili ji₧ v prvnφm dφlu û redaction_rubriky. Ka₧dß rubrika mß sv∙j nßzev, kter² nßm vÜak sßm o sob∞ rozhodn∞ nestaΦφ. Musφme zajistit, aby ka₧dß rubrika m∞la takΘ svou jednoznaΦnou identifikaci. Tou je sloupec ID_Rubrika. A abychom byli schopni °φci, jak jsou r∙znΘ rubriky do sebe vno°eny, musφme u ka₧dΘ z nich znßt jejφ nad°azenou û sloupec ID_Parent. Tento sloupec se odkazuje do tΘ₧e tabulky (redaction_rubriky), ovÜem na jinou, prßv∞ tu nad°azenou, rubriku. Takov²mto jednoduch²m zp∙sobem lze realizovat jak²koli strom, tedy nejenom rubriky redakΦnφho systΘmu, ale takΘ nap°φklad kategorie zbo₧φ v internetovΘm obchod∞ nebo kapitoly a podkapitoly n∞jakΘ knihy.
Realizace sprßvy rubrik
Nejd°φve si p°ipravφme novΘ odkazy do menu umφst∞nΘho v levΘm rßmu. Dnes si do tohoto menu doplnφme dalÜφ dva odkazy, t²kajφcφ se sprßvy rubrik, a to odkaz pro tvorbu novΘ kategorie a odkaz pro seznam kategoriφ.
<a href="rubriky.asp?akce=new" target="main">novß</a>
Cel² modul pro sprßvu rubrik je op∞t jako modul pro sprßvu autor∙ umφst∞n pouze v jednom jedinΘm souboru, kter² zajiÜ¥uje veÜkerou pot°ebnou funkΦnost. Parametry naΦtenΘ z URL pak udßvajφ, jakou funkΦnost mß tento skript plnit.
Soubor (jak je samoz°ejm∞ patrnΘ ze zdrojovΘho k≤du menu.asp) se jmenuje rubriky.asp a je umφst∞n stejn∞ jako autori.asp v adresß°i administrace. FunkΦnost umφst∞nß v tomto souboru se standardn∞ volß s parametrem akce (stejnΘ jako p°i administraci autor∙).
Zaklßdßnφ a editace rubrik
Prvnφ a takΘ logicky zßkladnφ funkΦnost, kterou musφme zajistit, je zaklßdßnφ nov²ch rubrik. Zobrazenφ formulß°e pro vlo₧enφ novΘ rubriky zajistφme pomocφ parametru akce=new.
Abychom byli schopni zajistit vlo₧enφ novΘ rubriky, musφme p°φsluÜnΘmu u₧ivateli zobrazit formulß°, kde bude moci vyplnit nßsledujφcφ ·daje:
- nßzev rubriky
- nad°azenou rubriku
StejnΘ ·daje ovÜem musφme u₧ivateli takΘ umo₧nit upravit p°i editaci rubrik. V tom p°φpad∞ budeme volat funkΦnost volat s prvnφm parametrem akce=edit a druh²m parametrem id=identifikace rubriky (sloupec ID_Rubrika v tabulce redaction_rubriky).
K≤d, kter² nßm zajistφ v²Üe popsanou funkΦnost, m∙₧e vypadat nßsledujφcφm zp∙sobem:
' v pripade, ze zakladame rubriku ze seznamu, nacteme id pro automaticky vyber aktualni rubriky v dropdownu
selected = cint(Request.QueryString("id"))
' pokud rubriku neudame, bere se automaticky ta nejvyssi uroven
if selected = "" then
selected = 0
end if
' nazev pro vypsani ve formulari (u vkladani je logicky prazdny)
nazev_rubriky = ""
' hlavicka stranky
outputStr = "<p class=""nadpis"">P°idßnφ novΘ rubriky</p>"
outputStr = outputStr & "<form action=""rubriky.asp?akce=uloznew"" method=""POST"" name=""formular"">"
end if
if akce="edit" then
' pokud se jedna o editaci, zjisti se id upravovane polozky
id=cint(Request.QueryString("id"))
if isconnectdb() then
' vybere nazev upravovane rubriky a zjisti ID jeji nadrazene rubriky (pro oznaceni v dropdownu ve formulari)
sqlStr="select Nazev, ID_Parent from redaction_rubriky where ID_Rubrika=" & id
set rs=objconn.execute(sqlStr)
if not rs.eof then
nazev_rubriky = rs("Nazev")
selected = rs("ID_Parent")
end if
else
chyba = true
end if
' hlavicka stranky
outputStr = "<p class=""nadpis"">┌prava rubriky</p>"
outputStr = outputStr & "<form action=""rubriky.asp?akce=ulozedit&id=" & id & """ method=""POST"" name=""formular"">"
end if
if akce="new" or akce="edit" then
' pripravi dropdown pro vypsani ve formulari (obsahuje jmena rubrik)
if isconnectdb() then
sqlStr="select ID_Rubrika, Nazev, ID_Parent from redaction_rubriky order by Nazev"
set rs=objconn.execute(sqlStr)
' pripravi dropdown (vyberovy seznam) vsech rubrik (aby si uzivatel mohl vybrat, do ktere danou rubriku zaradi)
outputSel = "<select id='nadrazena' name='nadrazena' class=forminput>"
outputSel = outputSel & "<option value='0'>Äßdnß (nejvyÜÜφ ·rove≥)</option>" & vbcrlf
do while not rs.eof
if rs("ID_Rubrika") = selected then
' pokud se jedna o upravu nebo vkladani na urcite misto, potrebujeme oznacit soucasnou nadrazenou rubriku
outputSel = outputSel & "<option selected value='" & rs("ID_Rubrika") & "'>" & rs("Nazev") & "</option>" & vbcrlf
else
outputSel = outputSel & "<option value='" & rs("ID_Rubrika") & "'>" & rs("Nazev") & "</option>" & vbcrlf
end if
rs.movenext
loop
outputSel = outputSel & "</select>"
disconnect()
else
chyba = true
end if
' formular (editace,vkladani)
outputStr = outputStr & "<table border=""0"" width=""100%"" cellspacing=""1""><tr><td bgcolor=""black"">" & vbcrlf
outputStr = outputStr & "<table class=""tabulkaedit"" border=""0"" width=""100%"" cellspacing=""0"">" & vbcrlf
outputStr = outputStr & "<tr><td>Nßzev rubriky</td><td>" & vbcrlf
outputStr = outputStr & "<INPUT type=""text"" name=""nazev"" value=""" & nazev_rubriky & """ class=forminput>"
outputStr = outputStr & "</td></tr>" & vbcrlf
outputStr = outputStr & "<tr><td>Nad°azenß rubrika</td><td>" & vbcrlf
outputStr = outputStr & outputSel
outputStr = outputStr & "</td></tr>" & vbcrlf
outputStr = outputStr & "<tr><td></td><td><INPUT type=""submit"" value=""Submit"" id=1 name=1>"
outputStr = outputStr & " <INPUT type=""reset"" value=""Reset"" id=1 name=1></td><td></td></tr>"
outputStr = outputStr & "</table>"
outputStr = outputStr & "</td></tr></table>"
outputStr = outputStr & "</FORM>"
if not chyba then
Response.Write(outputStr)
end if
end if
Takov²mto zp∙sobem umo₧nφme u₧ivatel∙m (administrßtor∙m Φi samotn²m autor∙m) vklßdat do systΘmu novΘ rubriky nebo upravovat ty stßvajφcφ. SQL p°φkaz, kter² zajistφ ulo₧enφ novΘ rubriky do systΘmu vypadß takto:
VÜimn∞te si, ₧e nenφ vklßdßna ₧ßdnß hodnota do sloupce ID_Rubrika. To je proto, ₧e tento sloupec je brßn jako IDENTITY a tφm pßdem se SQL server postarß sßm o jeho dopln∞nφ. Ka₧dß nov∞ zalo₧enß rubrika tak zφskß jednoznaΦnou identifikaci, a to i v p°φpad∞, kdy se jejφ nßzev shoduje s jinou ji₧ existujφcφ rubrikou.
SQL p°φkaz, pomocφ kterΘho naopak upravφme ji₧ existujφcφ rubriku (tak₧e zm∞nφme jejφ nßzev nebo jejφ umφst∞nφ), je tento:
P°i tvorb∞ jak²chkoli formulß°∙ pro u₧ivatele bychom m∞li pamatovat takΘ na to, ₧e nßm n∞kdo m∙₧e odeslat nevypln∞n² formulß° nebo jej vyplnφ nesprßvn∞ (nap°φklad abecednφmi znaky ve vstupnφm poli pro Φφsla apod.). Proto bychom nem∞li zapomenout na kontrolu sprßvnosti a ·plnosti vlo₧en²ch ·daj∙ ji₧ na stran∞ klienta, p°φmo ve formulß°i. V rßmci naÜφ tvorby nebudeme tyto eventuality rozebφrat a₧ do podrobnostφ, proto se spokojφme s existencφ formulß°e bez validace vstupnφch polφ.
Seznam rubrik
Ka₧d² sprßvce, autor nebo i Φtenß° chce samoz°ejm∞ v∞d∞t, jakΘ rubriky na svΘm serveru mß. K tomu, aby se v rubrikßch mohl jednoduÜe orientovat, poslou₧φ seznam rubrik.
Seznam nßm tedy bude slou₧it jako jak²si pr∙zkumnφk naÜich rubrik. NaÜφm cφlem je zobrazit v₧dycky Φßst stromu rubrik, podle toho, jakou nad°azenou rubriku si vybereme. Kliknutφm na odkaz v seznamu pod°azen²ch rubrik dostaneme op∞t seznam, tentokrßt s rubrikami vlo₧en²mi do tΘ, na kterou jsme kliknuli.
Na strßnkßch seznamu nßm tedy nesmφ chyb∞t takovΘ v∞ci, jako nßzev aktußlnφ zobrazenΘ rubriky, seznam pod°azen²ch rubrik, odkazy pro editaci a mazßnφ obsa₧en²ch rubrik. Abychom ulehΦili prßci budoucφm u₧ivatel∙m (a tφm tedy mo₧nß i sob∞), umφstφme na seznam takΘ odkaz na nad°azenou rubriku a pro vlo₧enφ "podrubriky" do prßv∞ zobrazenΘ.
Jednoduch²m SQL dotazem vybereme prßv∞ tu Φßst rubrik, kterΘ jsou vno°enΘ do tΘ, kterou prßv∞ prohlφ₧φme:
Zφskan² v²sledek stejn∞ jednoduÜe zobrazφme do tabulky:
' vytvori tabulku s rubrikami
do while not rs.eof
outputStr = outputStr & "<tr class=" & styl & ">" & vbcrlf
outputStr = outputStr & " <td><a href=rubriky.asp?akce=seznam&id=" & rs("ID_Rubrika") & ">" & rs("Nazev") & "</a></td>" & vbcrlf
outputStr = outputStr & " <td width=30px><a href=rubriky.asp?akce=edit&id=" & rs("ID_Rubrika") & ">UPRAVIT</a></td>" & vbcrlf
outputStr = outputStr & " <td width=30px><a href=rubriky.asp?akce=smazat&id=" & rs("ID_Rubrika") & ">SMAZAT</a></td>" & vbcrlf
outputStr = outputStr & "</tr>"
if styl="lichy" then
styl="sudy"
else
styl="lichy"
end if
rs.movenext
loop
Druhou eventualitou, kterou by mohl b²t °eÜen seznam rubrik, je zobrazenφ celΘho stromu najednou (ve form∞ skuteΦnΘho stromu, t°eba rozbalovacφho). Tady bychom mohli pou₧φt nap°φklad rekurzivnφho volßnφ pro naΦφtßnφ jednotliv²ch v∞tvφ stromu. To samo o sob∞ by ovÜem mohlo b²t obsahem samostatnΘho Φlßnku. V p°φpad∞ vaÜeho zßjmu se k tΘto problematice m∙₧eme vrßtit v zßv∞ru serißlu.
Mazßnφ rubrik
Pro zajiÜt∞nφ ·plnΘ funkΦnosti administrace rubrik musφme takΘ pamatovat na to, ₧e budeme n∞kdy pot°ebovat rubriku takΘ odstranit. Zde se musφme zastavit p°ed jednou logickou otßzkou. Co ud∞lat s pod°azen²mi rubrikami tΘ, kterou chceme smazat? Odstranφme je takΘ, nebo je zanechßme? Rozumn² (a takΘ bezpeΦn²) zp∙sob je "p°evΘst" vno°enΘ rubriky o jednu ·rove≥ v²Üe, tedy na stejnou ·rove≥ tΘ rubriky, kterou chceme smazat. Tφm zajistφme, ₧e v p°φpad∞ p°eklepu nebo p°ehlΘdnutφ si nesma₧eme ₧ßdnou velkou Φßst stromu vÜech rubrik a vzniklou Ükodu m∙₧eme snadno nahradit.
SQL p°φkazy, kterΘ nßm tuto operaci zajistφ, jsou t°i a nßsledujφ t∞sn∞ za sebou. Prvnφ z nich zjistφ, do jakΘ rubriky budeme p°evßd∞t vÜechny vno°enΘ. Druh² provede "p°evßzßnφ" vÜech pod°φzen²ch (vno°en²ch) rubrik a nakonec t°etφ zajistφ nßmi po₧adovanΘ smazßnφ rubriky.
sqlStr = "select id_parent from redaction_rubriky where id_rubrika =" & id
' aktualizujeme ukazatel na nadrazenou rubriku u vsech puvodne podrazenych rubrice mazane
sqlStr = "update redaction_rubriky set id_parent = " & parent & " where id_parent = " & id
' smazeme rubriku
sqlStr = "delete from redaction_rubriky where id_rubrika=" & id
Strßnky a formulß°e nejsou nijak graficky °eÜeny a jejich ·pravu ponechßvßm tedy pln∞ na vaÜφ fantazii a grafickΘm nadßnφ.
Abych vßm uÜet°il prßci s opisovßnφm a dodal vßm cel² zdrojov² k≤d, veÜkerΘ dnes popsanΘ funkΦnosti a soubor s kaskßdov²mi styly si m∙₧ete stßhnout.