Redakční systém pro každého 3.
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.
Mohlo by vás také zajímat
-
Od iPhonu po Android: Ultra HDR přináší nový standard fotografií
1. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024 -
Co je to DNSSEC, jak funguje a jak si ho nastavit?
14. srpna 2024 -
Globální výpadek IT systémů: Může za to jediná aktualizace
19. července 2024
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024