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.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět