Pustili jste se do tvorby redakčního systému a navrhli jste si podle návodu v minulém dílu databázi? Pak se v tom dnešním dozvíte, jak vyřešit přihlašování šéfredaktora a jak upravovat databázi autorů.

Adresářová struktura

Abyste měli v celé práci pořádek a systém se vám snadněji tvořil, doporučuji si vytvořit následující strukturu adresářů:

  • Administrace – nástroje pro správu redakčního systému
  • Include – společné funkce
  • Redakce – nástroje pro autory
  • Images – obrázky

Při psaní návodu se budu na tuto adresářovou strukturu odkazovat a umísťovat do ní soubory potřebné pro činnost redakčního systému.

Přihlašování šéfredaktora

Máte sice databázi autorů, ale pro přihlášení je vhodné zvolit alespoň o stupeň vyšší zabezpečení. Použijte k tomu ověření uživatele přímo na serveru, na němž je umístěn systém. Pro zajištění ověření můžete použít dva různé způsoby:

  1. Zakázání anonymního přístupu do adresáře Administrace – platí na jakýkoli soubor v adresáři, není nutné vytvářet další kód, ale je nutná spolupráce s administrátorem serveru.
  2. Vynucení přihlášení ve skriptu – lze realizovat bez spolupráce s administrátorem, ale každý skript systému musíte chránit zvlášť, přičemž lze chránit jenom ASP soubory.

V obou případech musí být příslušný uživatel na serveru vytvořen. Při použití jednoho i druhého způsobu lze snadno definovat i jména uživatelů, kteří mohou k systému přistupovat.

Zabezpečení pomocí skriptu

K tomuto způsobu zabezpečení využijete proměnné prostředí serveru. Jedna z mnoha proměnných se jmenuje LOGON_USER a obsahuje jméno právě přihlášeného uživatele k serveru.

if Request.ServerVariables(„LOGON_USER“)<>„“ then
   Response.Clear
   Response.Status = „401 Access Denied“
   Response.End
end if

Realizace administrace

Pro přehlednost a jednoduchost bude celý redakční systém umístěn do rámů. Základem celé administrace je soubor default.asp, který bude obsahovat rozdělení rámů.

<% if Request.ServerVariables(„LOGON_USER“)<>„“ then
   Response.Clear
   Response.Status = „401 Access Denied“
   Response.End
end if
%>
<frameset cols=“14%,*“>
   <frame name=“menu“ src=“menu.asp“ marginwidth=“10″ marginheight=“10″ scrolling=“auto“ frameborder=“0″>
   <frame name=“main“ src=““ marginwidth=“10″ marginheight=“10″ scrolling=“auto“ frameborder=“0″>
</frameset>

Jak sami vidíte, k celé administraci je třeba ještě soubor menu.asp, který si budete postupně doplňovat o odkazy na nové funkce tak, jak budou vycházet jednotlivé díly seriálu. Dnes to budou dva odkazy pro přidání nového autora a výpis seznamu autorů.

<a href=“autori.asp?akce=seznam“ target=“main“>Autori seznam</a><br>
<a href=“autori.asp?akce=new“ target=“main“>Nový autor</a>

Práce s databází

Pro usnadnění práce s databází jsem již před časem v Intervalu popisoval sadu nástrojů. Myslím si, že není nutné se dále rozepisovat, jak tyto nástroje fungují, neboť jsem je již podrobně popsal v článku ASP, databáze a objekt Connection.

Pro vás, kdo jste již článek o práci s databází četli, uvádím celý kód, který jsem v dotyčném článku popsal (ostatním doporučuji si článek přečíst, abyste pochopili kód):

Dim objConn
function isConnectDB()
   Dim strConn
   On Error Resume Next
   if isObject(objConn)=False then SET objConn=Server.CreateObject(„ADODB.Connection“)
   if objConn.State<>1 then
      objConn.Open Application(„dsn“),Application(„user“),Application(„heslo“)
      if Err.number <>0 then
         isConnectDB =False
         ERR.CLEAR
      else
         isConnectDB=True
      end if
   else
      isConnectDB=True
   end if
end function
sub disconnect()
   objConn.close
   SET objConn=Nothing
end sub

Celý kód funkcí pro práci s databází umístěte do souboru connect.asp, který si uložte do adresáře include.

Práce s autory

Celý modul pro správu autorů se skládá z jediného ASP souboru, který zajistí funkčnost systému. Na základě parametrů načtených z URL se ve skriptu provede volba činnosti, která se má vykonat.

Jak jste již všichni pochopili z kódu, který je uložen v souboru menu.asp, je skript autori.asp standardně volán s parametrem akce=new pro přidání nového autora a ?akce=seznam pro zobrazení seznamu autorů, ze kterého je možné autory mazat nebo editovat.

Pro vkládání nového autora nebo jeho editaci je použit tentýž formulář, který je pouze podle parametru akce měněn tak, aby byl skript zavolán s příslušným parametrem. Při odesílání se používá kombinovaný způsob předávání parametrů. Parametry, které určují, co se má provést, jsou předávány jako součást URL. Údaje, které vyplní uživatel, jsou předávány jako součást hlavičky http požadavku (metoda POST).

Při vložení nového autora je skript autoři zavolán s parametrem akce=uloznew. Na základě tohoto parametru jsou zpracovány údaje předané metodou POST a vytvoří se příslušný vkládací dotaz.

dotaz=“insert into redaction_autori (jmeno,prijmeni,email,heslo,poznamka) values (‚“ &uloz_jmeno& „‚,'“&uloz_prijmeni& „‚,'“ &uloz_email& „‚,'“ &uloz_heslo& „‚,'“ &uloz_poznamka& „‚)“

Všimněte si, že dotaz neobsahuje položku ID_Autor. Je to z toho důvodu, že položka ID_Autor má nastavenu vlastnost IDENTITY a SQL server vyplňuje tuto položku automaticky podle jejího nastavení.

Pokud je skript zavolán s parametrem ?akce=seznam, je provedena příslušná část skriptu, která na základě výběrového dotazu do databáze vypíše seznam všech autorů uvedených v databázi.

dotaz=“select * from redaction_autori order by ID_Autor DESC“

Součástí výpisu je vytvoření odkazů pro editaci a mazání autorů. Pomocí těchto odkazů je opět volán skript autori.asp, ale s poněkud jinými parametry. Parametr ?akce=edit&id=XX je určen pro provedení editace již uloženého autora. Výběr konkrétního autora z databáze se provede pomocí následujícího dotazu.

dotaz=“select * from redaction_autori where id_autor=“&id

Pro editaci je používán stejný formulář, jako pro vkládání nového autora. V tomto případě pouze předává jiné parametry jako součást URL. Předávaný parametr v URL je ?akce=ulozedit&id=XX.

Při použití parametru ?akce=smazat&id=XX je vyvolána část skriptu, která provede smazání zvoleného autora z databáze. Mazání je prováděno pomocí následujícího dotazu:

dotaz=“delete from redaction_autori where id_autor=“&id

Konečný skript je sice velice dlouhý, ale řeší veškerou problematiku spojenou s vkládáním, editací a mazáním autorů.

<!–#include file=“../include/connect.asp“–>
<!doctype html public „-//W3C//DTD HTML 4.0 Transitional//EN“>
<html><head>
<title>Redakční systém – autoři</title>
<meta http-equiv=“Content-Type“ content=“text/html; charset=windows-1250″>
</head>
<body bgcolor=#ffdead>
<style type=“text/css“>
<!–
.hlavicka {
background-color: #000000;
font-family: „arial ce“, „helvetica ce“, arial, helvetica, sans-serif;
color: #ffffff;
font-size: 12px;
}
.nadpis {
font-family: „arial ce“, „helvetica ce“, arial, helvetica, sans-serif;
color: #000000;
font-size: 20px;
text-align : center; }
.varovani {
font-family: „arial ce“, „helvetica ce“, arial, helvetica, sans-serif;
color: red;
font-size: 20px;
font-weight : bold;
}
.lichy {
background-color: #e6e6fa;
font-family: „arial ce“, „helvetica ce“, arial, helvetica, sans-serif;
color: #000000;
font-size: 12px;
}
.sudy {
background-color: #d8bfd8;
font-family: „arial ce“, „helvetica ce“, arial, helvetica, sans-serif;
color: #000000;
font-size: 12px;
}
.tabulkaedit {
background-color: #d8bfd8;
font-family: „arial ce“, „helvetica ce“, arial, helvetica, sans-serif;
color: #000000;
font-size: 12px;
}
–>
</style>
<%
on error resume next
akce=trim(Request.QueryString(„akce“))
if akce=““ then
   akce=“seznam“
end if
if akce=“smazat“ then
   Response.Write „mazu“
   id=cint(Request.QueryString(„id“))
   if isconnectdb() then
      dotaz=“delete from redaction_autori where id_autor=“&id
      objconn.execute(dotaz)
      disconnect()
      Response.Redirect „autori.asp“
   else
      Response.Write „Nepodarilo se spojit s databází“
   end if
end if
if akce=“edit“ then
   id=cint(Request.QueryString(„id“))
   if isconnectdb() then
      dotaz=“select * from redaction_autori where id_autor=“&id
      set rs=objconn.execute(dotaz)
      editjmeno=trim(rs(„jmeno“))
      editprijmeni=trim(rs(„prijmeni“))
      editemail=trim(rs(„email“))
      editpoznamka=trim(rs(„poznamka“))
      editheslo=trim(rs(„heslo“))
      rs.close
      set rs=nothing
      disconnect()
   else
      Response.Write „Nepodařilo se spojit s databází“
   end if
end if
if akce=“new“ then
   editjmeno=““
   editprijmeni=““
   editemail=““
   editpoznamka=““
   editheslo=““
end if
if akce=“uloznew“ then
   uloz_jmeno=Request.Form(„jmeno“)
   uloz_prijmeni=Request.Form(„prijmeni“)
   uloz_heslo=Request.Form(„heslo“)
   uloz_email=Request.Form(„email“)
   uloz_poznamka=Request.Form(„poznamka“)
   if isconnectdb() then
      dotaz=“insert into redaction_autori (jmeno,prijmeni,email,heslo,poznamka) values
(‚“ &uloz_jmeno& „‚,'“&uloz_prijmeni& „‚,'“ &uloz_email& „‚,'“ &uloz_heslo& „‚,'“ &uloz_poznamka& „‚)“
      objconn.execute(dotaz)
      disconnect()
      Response.Redirect „autori.asp“
   else
      Response.Write „Nepodarilo se spojit s databází“
   end if
end if
if akce=“ulozedit“ then
   uloz_jmeno=Request.Form(„jmeno“)
   uloz_prijmeni=Request.Form(„prijmeni“)
   uloz_heslo=Request.Form(„heslo“)
   uloz_email=Request.Form(„email“)
   uloz_poznamka=Request.Form(„poznamka“)
   if isconnectdb() then
      id=cint(Request.QueryString(„id“))
      dotaz=“UPDATE redaction_autori SET jmeno='“&uloz_jmeno&“‚, prijmeni='“&uloz_prijmeni&“‚, heslo='“&uloz_heslo&“‚,
email='“&uloz_email&“‚, poznamka='“&uloz_poznamka&“‚ where id_autor=“&id
      Response.Write dotaz
      objconn.execute(dotaz)
      disconnect()
      Response.Redirect „autori.asp“
   else
   Response.Write „Nepodarilo se spojit s databází“
   end if
end if
if akce=“seznam“ then
      txtseznam=“<p class=““nadpis““>Seznam autorů</p>“
      if isconnectdb() then
         dotaz=“select * from redaction_autori order by ID_Autor DESC“
         set rs=objconn.execute(dotaz)
         if rs.bof=true and rs.eof=true then
            txtseznam=txtseznam&“<p class=““varovani““>Tabulka autorů je prázdná</p>“
         else
            txtseznam=txtseznam&“<table border=““0″“ width=““700″“ cellspacing=““1″“><tr><td bgcolor=““black““>“&vbcrlf
            txtseznam=txtseznam&“<table border=““0″“ width=““100%““ cellspacing=““0″“>“&vbcrlf
            txtseznam=txtseznam&“<tr class=““hlavicka““>“&vbcrlf
            txtseznam=txtseznam&“<td width=““20″“ align=““right““>ID</td>“&vbcrlf
            txtseznam=txtseznam&“<td>Příjmení a jméno</td>“&vbcrlf
            txtseznam=txtseznam&“<td>Email</td>“&vbcrlf
            txtseznam=txtseznam&“<td width=““50″“>Editace</td>“&vbcrlf
            txtseznam=txtseznam&“</tr>“&vbcrlf
            txtseznam=txtseznam&“<tr class=““hlavicka““>“&vbcrlf
            txtseznam=txtseznam&“<td></td>“&vbcrlf
            txtseznam=txtseznam&“<td colspan=““2″“>Poznámka</td>“&vbcrlf
            txtseznam=txtseznam&“<td>Mazání</td>“&vbcrlf
            txtseznam=txtseznam&“</tr>“&vbcrlf
            stylradku=“lichy“
            do while not rs.eof
               id_autor=trim(rs(„id_autor“))
               jmeno=trim(rs(„jmeno“))
               prijmeni=trim(rs(„prijmeni“))
               email=trim(rs(„email“))
               poznamka=trim(rs(„poznamka“))
               txtseznam=txtseznam&“<tr class=“““&stylradku&“““>“&vbcrlf
               txtseznam=txtseznam&“<td width=““20″“ align=““right““>“&id_autor&“</td>“&vbcrlf
               txtseznam=txtseznam&“<td>“&prijmeni&“ „&jmeno&“</td>“&vbcrlf
               txtseznam=txtseznam&“<td>“&email&“</td>“&vbcrlf
               txtseznam=txtseznam&“<td width=““50″“><a href=““autori.asp?akce=edit&id=“&id_autor&“““>Editovat“&“</a></td>“&vbcrlf
               txtseznam=txtseznam&“</tr>“&vbcrlf
               txtseznam=txtseznam&“<tr class=“““&stylradku&“““>“&vbcrlf
               txtseznam=txtseznam&“<td></td>“&vbcrlf
               txtseznam=txtseznam&“<td colspan=““2″“>“&poznamka&“</td>“&vbcrlf
               txtseznam=txtseznam&“<td><a href=““autori.asp?akce=smazat&id=“&id_autor&“““>Smazat“&“</a></td>“&vbcrlf
               txtseznam=txtseznam&“</tr>“&vbcrlf
               if stylradku=“lichy“ then
                  stylradku=“sudy“
               else
                  stylradku=“lichy“
               end if
               rs.movenext
            loop
            txtseznam=txtseznam&“</table>“
            txtseznam=txtseznam&“</td></tr></table>“
         end if
         rs.close
         set rs=nothing
         disconnect()
      else
         txtseznam=txtseznam&“<p class=““varovani““>Nepodarilo se spojit s databází</p>“
      end if
      Response.Write txtseznam
end if
if akce=“new“ or akce=“edit“ then
   if akce=“new“ then
      txtedit=txtedit&“<p class=““nadpis““>Přidání nového autora</p>“
      txtedit=txtedit&“<FORM action=““autori.asp?akce=uloznew““ method=““POST““ name=““form1″“>“
   end if
   if akce=“edit“ then
      txtedit=txtedit&“<p class=““nadpis““>Editace autora „&editjmeno&“ „&editprijmeni&“</p>“
      txtedit=txtedit&“<FORM action=““autori.asp?akce=ulozedit&id=“&id&“““ method=““POST““ name=““form1″“>“
   end if
   txtedit=txtedit&“<table border=““0″“ width=““700″“ cellspacing=““1″“><tr><td bgcolor=““black““>“&vbcrlf
   txtedit=txtedit&“<table class=““tabulkaedit““ border=““0″“ width=““100%““ cellspacing=““0″“>“&vbcrlf
   txtedit=txtedit&“<tr><td>Jméno</td><td>“&vbcrlf
   txtedit=txtedit&“<INPUT type=““text““ name=““jmeno““ value=“““&editjmeno&“““ size=40>“
   txtedit=txtedit&“</td>“&vbcrlf
   txtedit=txtedit&“<td>Příjmení</td><td>“&vbcrlf
   txtedit=txtedit&“<INPUT type=““text““ name=““prijmeni““ value=“““&editprijmeni&“““ size=40>“
   txtedit=txtedit&“</td></tr>“&vbcrlf
   txtedit=txtedit&“<tr><td>Email</td><td>“&vbcrlf
   txtedit=txtedit&“<INPUT type=““text““ name=““email““ value=“““&editemail&“““ size=40>“
   txtedit=txtedit&“</td>“&vbcrlf
   txtedit=txtedit&“<td>Heslo</td><td>“&vbcrlf
   txtedit=txtedit&“<INPUT type=““text““ name=““heslo““ value=“““&editheslo&“““ size=40>“
   txtedit=txtedit&“</td></tr>“&vbcrlf
   txtedit=txtedit&“<tr><td valign=““top““>Poznamka</td><td colspan=““3″“>“&vbcrlf
   txtedit=txtedit&“<TEXTAREA rows=5 cols=75 name=poznamka>“&editpoznamka&“</TEXTAREA>“
   txtedit=txtedit&“</td></tr>“&vbcrlf
   txtedit=txtedit&“<tr><td></td><td><INPUT type=““submit““ value=““Submit““ id=1 name=1></td>“
   txtedit=txtedit&“<td><INPUT type=““reset““ value=““Reset““ id=1 name=1></td><td></td></tr>“
   txtedit=txtedit&“</table>“
   txtedit=txtedit&“</td></tr></table>“
   txtedit=txtedit&“</FORM>“
   Response.Write txtedit
end if
%>
</body>
</html>

Ve skriptu je ošetřeno také neotevření databáze nebo prázdná tabulka autorů. Není zde však řešeno například zadání „špatných“ dat uživatelem nebo nevyplnění některých položek ve formuláři. Důvodem je rozsáhlost kódu pro jejich korektní ošetření. Pokud bude z vaší strany zájem, vrátím se k ošetřování těchto stavů na konci seriálu.

Nakonec si můžete doplnit výpis autorů o možnost řazení autorů podle libovolné položky. Nebo záměna textových odkazů pro editaci a mazání grafickým symboly. Uvítám když do diskuze pod článkem uvedete nejen nějaký takový způsob, ale i další nápady, jak vylepšit celý redakční systém, který si právě s pomocí Intervalu budujete.

Pro ušetření práce a možného výskytu chyb při kopírování kódu si můžete vše 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