Redakční systém II. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



PHP

Redakční systém II.

redakcni system

19. dubna 2001, 00.00 | Druhé pokračování seriálu, ve kterém společně vytváříme jednoduchý redakční systém. Dnes si nadefinujeme několik funkcí a vytvoříme úvodní stránku administrační části systému, včetně autorizace uživatelů.

V prvním díle jsem naznačil že by se dnešní pokračování mělo věnovat skriptům které budou umožňovat zakládání uživatelů a následnou editaci jejich údajů. Toto tvrzení bylo trošku unáhlené, protože jsem si příliš neuvědomil rozsáhlost projektu. Dnes se proto budu věnovat skriptům pro vstup do administrace redakčního systému. Přihlášení do RS bude probíhat pomocí HTTP autorizace, takže pokud budete chtít skripty ladit na svém počítači lokálně, budete potřebovat PHP běžící jako modul apache serveru, tzn. budete potřebovat PHP 4. Pokud jej nemáte, můžete si stáhnout "okenní" verzi PHP 4.0.4pl1 z mých stránek nebo ze stránek PHP.cz, kde také naleznete i verze pro jiné OS. Instalace modulu je obsažená jen v plném instalačním souboru (alespoň u Win verze), který má cca 4MB.

Dnes také popíši skript function.php, který bude obsahovat námi definované funkce, abychom je později nemuseli stále přepisovat. Tento skript Vám nebudu hned ze začátku ukazovat celý, ale budeme jej podle potřeby rozšiřovat o další funkce, tak, jak budou přibývat. Alespoň Vás nebudou rozptylovat relativně zdlouhavé části kódu, které bychom prozatím nevyužili. Stejný postup bude i u jiných skriptů, které budou větší. V samotných textech článků se vždy budu snažit několika větami přiblížit funkci jednotlivého kódu, který bude navíc dostatečně okomentován. U složitějších SQL dotazů se budu také pozastavovat a budu uvádět komentář proč a jak se selectuje.

Tak a řečí kolem by už bylo dost, přejdeme raději ke konstruktivní práci a tou teď bude rozdělení adresářové struktury redakčního systému. Jednotlivých souborů bude docela dost, takže bude vhodné je trošku roztřídit. Vytvořte si na serveru adresář, ve kterém bude váš nastávající redakční systém (může to být klidně root serveru) a umístěte do něj skript conn.php z prvního dílu. V hlavním adresáři si pak vytvořte dva adresáře. Jeden bude admin a druhý inc, kterému nastavte práva pro zápis (chmod 706) - později do něj budeme generovat některé soubory. V adresáři admin pak založte ještě adresář img, kde si později uložíme dva obrázky (pro funkčnost systému však nebudou nutné - jde jen o kosmetický doplněk).

Stránky administrace redakčního systému budou rozděleny do dvou rámů, levý bude navigační a bude obsahovat odkazy na jednotlivé části administrace. Druhý bude sloužit pro samotné administrační skripty. V adresáři admin si vytvoříme skript index.php, který se bude starat o prvotní přihlášení do systému a zároveň nám okno prohlížeče rozdělí na výše zmíněné rámy. Skript si nejdříve vyžádá autorizaci pomocí autorizačního formuláře. Po jeho vyplnění se skript pokusí v tabulce autori najít záznam s odpovídajícím loginem a heslem. Jelikož systém rozlišuje autory aktivní a neaktivní, bude se moci přihlásit jen ten uživatel, který bude mít ve sloupečku stav hodnotu a. Pokud takovýto záznam v databázi nenajdeme, nebo uživatel stiskne v autorizačním formuláři tlačítko storno, zakážeme uživateli přístup a skript ukončíme. Pokud záznam v databázi najdeme, rozdělíme okno prohlížeče na rámy a načteme do nich patřičné soubory.

index.php (/admin/index.php)
<?
// není li provedena autorizace, vyžádáme si ji
if (!IsSet($PHP_AUTH_USER))
{
     Header("HTTP/1.0 401 Unauthorized");
     Header("WWW-Authenticate: Basic realm=\"RS - Admin Center\"");
     echo "Neautorizovaný přístup";
     exit;
}
// pokud uživatel vyplnil formulář pokračujeme ověřením dat v databázi
else
{
     // připojíme se k databázi
     include "../conn.php";
     // hledáme záznam s loginem a heslem zadaným v autorizačním
     // formuláři. Hledáme jen aktivní uživatele.
     @$sql = mysql_query("SELECT * FROM autori
                          WHERE login LIKE '$PHP_AUTH_USER'
                                AND pass = '".md5($PHP_AUTH_PW)."'
                                AND stav = 'a'");
     // pokud žádného takového uživatele nenajdeme
     // rozloučíme se s ním
     if (mysql_num_rows($sql) == 0)
     {
        Header("HTTP/1.0 401 Unauthorized");
        Header("WWW-Authenticate: Basic realm=\"RS - Admin Center\"");
        echo "Neautorizovaný přístup";
        mysql_close($conn);
        exit;
     }
     // spojení s databází již nepotřebujeme, proto jej uzavřeme
     mysql_close($conn);
}
// následuje rozdělení okna prohlížeče na rámy
?>
<HTML>
<HEAD>
    <TITLE>RS - Admin Center</TITLE>
</HEAD>

<FRAMESET COLS="180,*">
  <FRAME SRC="menu.php" NAME="menu" SCROLLING=AUTO>
  <FRAME SRC="main.php" NAME="main" SCROLLING=AUTO>
</FRAMESET>

<NOFRAMES>
  <BODY>
    K použití administrační sekce potřebujete prohlížeč s podporou rámů.
  </BODY>
</NOFRAMES>

</HTML>

Pokud autorizace proběhne bez problémů, rozdělí se okno prohlížeče na rámy, do kterých se načtou skripty menu.php a main.php. Dříve než začnu s popisem těchto skriptů budeme si muset vytvořit includovaný skript, který jsem zmiňoval výše (function.php), který umístíme do rootu RS (/function.php). Pro začátek bude tento include skript obsahovat tři funkce:

  • head() - standardní hlavička stránky. Hlavička bude obsahovat i příkazy zakazující cachování stránek, jelikož by to vzhledem k povaze celé aplikace nebylo vhodné. Bude se vkládat na začátek výstupu téměř každého skriptu.
<?
// standardní hlavička stránky
function head()
{
 // stránky nebudeme ukládat do cache prohlížeče
 Header("Pragma: No-cache");
 Header("Cache-Control: no-cache, must-revalidate");
 Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
<HTML>
  <HEAD>
    <META HTTP-EQUIV="Content-Type"
        CONTENT="text/html; charset=windows-1250">
    <META HTTP-EQUIV="Author" CONTENT="Jiří Kocman">
    <TITLE>Redakční Systém</TITLE>
  </HEAD>
<BODY>
<?
}
?>
  • foot() - standardní patička stránky. Bude se vkládat na konec výstupu téměř každého skriptu. Náš příklad obsahuje jen dva HTML tagy.
<?
// standardní patička stránky
function foot()
{
   echo "</BODY></HTML>";
}
?>
  • auth() - funkce ověřující platnost přístupových údajů. Na každé stránce administrace RS se budou opětovně kontrolovat přihlašovací údaje. Bylo by docela možné, že by někdo zavolal jiný skript než index.php a měl by pak velkou šanci upravovat data. Postup ověřování je totožný jako v indexovém skriptu.
<?
// funkce slouží k autorizaci uživatelů
function auth()
{
   // budeme pracovat s globálními proměnnými
   global $PHP_AUTH_USER,$PHP_AUTH_PW,$INFO,$conn;

   // ověříme uživatele v databázi podle loginu a hesla.
   // se systémem mohou pracovat jen uživatelé, kteří mají
   // v tabulce stav nastaveno a !! Jinak mají nepovolený přístup.
   @$sql = mysql_query("SELECT * FROM autori WHERE login LIKE '$PHP_AUTH_USER'
                                 AND pass = '".md5($PHP_AUTH_PW)."'
                                 AND stav = 'a'");

   // pokud v databázi nenajdeme odpovídající záznam,
   // rozloučíme se s uživatelem.
   if (mysql_num_rows($sql) <> 1)
   {
     Header("HTTP/1.0 401 Unauthorized");
     Header("WWW-Authenticate: Basic realm=\"RS - Admin Center\"");
     echo "Neautorizovaný přístup";
     mysql_close($conn);
     exit;
   }

   // pokud údaje z autorizace sedí, načteme řádek z databáze
   // do proměnné $INFO.
   $INFO = mysql_fetch_row($sql);

   // uvolníme paměť
   mysql_free_result($sql);
}
?>

Nyní máme připravený i include soubor function.php a můžeme přejít ke skriptům main.php a menu.php, které se načtou do vytvořeného framesetu. Soubor main.php neobsahuje žádné zlváštní údaje, takže nebude vadit, když nebudeme kontrolovat přístupové údaje v databázi ale jen zkontrolujeme zda existuje proměnná $PHP_AUTH_USER. Pokud ano, zobrazíme stránku - její obsah nechávám na Vaší fantazii - pokud proměnná neexistuje nedovolíme její zobrazení.

main.php (/admin/main.php)
<?
// není-li návštěvník autorizován, vyhodíme ho
if (!isset($PHP_AUTH_USER)):
   echo "Neautorizovaný přístup";
   exit;
endif;

// vložíme definice funkcí
include "../function.php";

// hlavička stránky
head();
?>
<CENTER>
<H3>RS - administrační centrum</H3>
<P>
<B>Developed by:</B> <A HREF="">Jiří Kocman</A>
</P>
</CENTER>
<?
// patička stránky
foot();
?>

V souboru menu.php už využijeme definované funkce auth(), jelikož musíme zjistit jaká práva v systému přihlášený uživatel má - podle toho mu připravíme menu. Šéfredaktor má v systému nejvýšší váhu a má proto všechna práva. Jeho "podřízenými" jsou redaktoři/korektoři, kteří mají téměř stejná práva jako šéfredaktor. Jediné co redaktoři nemohou je vytvářet nové uživatele RS, editovat schválené články. Posledním a právy nejméně obdařeným článkem systému jsou autoři. Ti mohou do systému pouze vkládat nové články, textové zprávy a mohou získat přehled o čtenosti vlastních článků.

menu.php (/admin/menu.php)
<?
// není-li uživatel autorizován, vykopneme ho
if (!isset($PHP_AUTH_USER)):
   echo "Neautorizovaný přístup";
   exit;
endif;

// includneme funkce a spojíme se s databází
include "../conn.php";
include "../function.php";

// ověříme autorizaci
auth();

// databázi již nepotřebujeme
mysql_close($conn);

// zobrazíme stránku menu
head();

// zobrazíme jméno a email přihlášeného uživatele
echo "<CENTER><A HREF=\"mailto:$INFO[4]\">$INFO[3]</A>\n<BR>";

// vypíšeme funkci
echo $pozice[$INFO[6]];

echo "<BR><BR>";

// volby pro administrátora
if ($INFO[6] == 3)
{
   echo "<A HREF=users.php target=main>Editace uživatelů</A><BR>\n";
   echo "<A HREF=schval.php target=main>Schval články</A><BR>\n";
   echo "<A HREF=prehled.php target=main>Přehled článků</A><BR>\n";
   echo "<BR>\n";
}
// volby pro redaktory/korektory a administrátora
if ($INFO[6] >= 2)
{
   echo "<A HREF=korektura.php target=main>Korektura článků</A><BR>\n";
   echo "<A HREF=kz.php target=main>Krátké zprávy</A><BR>\n";
   echo "<A HREF=rubriky.php target=main>Rubriky</A><BR>\n";
   echo "<A HREF=stats.php target=main>Statistiky článků</A><BR>\n";
   echo "<BR>\n";
}
// volby pro všechny
if ($INFO[6] >= 1)
{
   echo "<A HREF=addclanek.php target=main>Přidat článek</A><BR>\n";
   echo "<A HREF=addnovinka.php target=main>Přidat novinku</A><BR>\n";
   echo "<A HREF=userstats.php target=main>Moje statistiky</A><BR>\n";
}

echo "</CENTER>";
foot();
?>

Tak a máme hotovou i navigaci v administrační části redakčního systému. V příštích dílech seriálu si budeme popisovat jednotlivé položky menu, takže se konečně dostaneme ke slíbenému vytváření uživatelů, jejich editaci či mazání. Pro dnešek je to ode mne vše. Těším se na Vás u dalšího pokračování.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: