Interval.cz
RedakΦnφ systΘm pro ka₧dΘho, 3. dφl

Pustili jste se do tvorby vlastnφho redakΦnφho systΘmu? A ji₧ oΦekßvßte pokraΦovßnφ? Pak jste se koneΦn∞ doΦkali. V dneÜnφm dφlu si ukß₧eme, jak co nejjednoduÜÜφm zp∙sobem zajistφme administraci t²kajφcφ se rubrik na serveru. Pod rubrikou si lze p°edstavit cosi jako adresß°, p°ihrßdku na Φlßnky a p°φsp∞vky podobnΘho zam∞°enφ.

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∙:

<LINK href="/css/styles.css" rel=STYLESHEET type="text/css">

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=seznam" target="main">seznam</a>
<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:

if akce="new" then
     ' 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:

insert into redaction_rubriky (nazev, id_parent) values ('" & nazev & "', " & nadrazena & ")

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:

update redaction_rubriky set nazev='" & nazev & "', id_parent=" & nadrazena & " where id_rubrika = " & id

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:

select ID_Rubrika, Nazev from redaction_rubriky where ID_Parent = " & id

Zφskan² v²sledek stejn∞ jednoduÜe zobrazφme do tabulky:

  styl = "sudy"
   ' 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.

'najdeme id nadrazene rubriky te, kterou mazeme
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.



 VaM (14.1. 2003)

Redakce Interval.cz |  Inzerce na Interval.cz |  Hledßme novΘ autory ISSN 1212-8651 
 ⌐ Zoner software, s.r.o., vÜechna prßva vyhrazena, tento server dodr₧uje prßvnφ p°edpisy o ochran∞ osobnφch ·daj∙.