Redakční systém pro každého 2.

    0

    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