Redakční systém III. - 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

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

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



PHP

Redakční systém III.

redakcni system

23. dubna 2001, 00.00 | Další pokračování seriálu o Redakčním systému. Tentokrát si vytvoříme skript se seznamem uživatelů a několik nově definovaných funkcí.

V dnešním pokračování seriálu se pustíme do tvorby skriptů, které se budou starat o přehledné zobrazení stávajících uživatelů, editaci jejich osobních údajů, jejich vytváření a mazání. Celkem se o tyto procedury budou starat tři php skripty: users.php, add_user.php a edit_user.php. Také si doplníme skript function.php dvěmi funkcemi a vytvoříme nový skript generuj.php, který se bude includovat v některých skriptech a bude generovat specifická data do textového souboru na disk, aby pak jejich selectování z databáze zbytečně nezatěžovalo server. Všechny nové skripty budou umístěny do adresáře admin.

Nejdříve si popíšeme funkce, které přidáme do souboru function.php. Funkce jsou nazvány butonek() a zavri(). Tyto funkce vkládají do stránky pouze prostý HTML kód, ale jelikož tento HTML kód bude často využívaný, zaslouží si být součástí definovaných funkcí stejně jako hlavička či patička stránky.

  • butonek() - funkce vloží do stránky element <BUTTON> s událostí onClick, která vyvolá zavření popup okna, které se budou v administračních skriptech často používat.
// funkce zobrazí tlačítko. Po kliku na něj se zavře okno
function butonek()
{
?>
<FORM>
<INPUT TYPE="BUTTON" VALUE="Zavřít okno" onclick="self.close();">
</FORM>
<?
}
  • zavri() - funkce obsahuje celou HTML stránku, událost onLoad v tagu <BODY> způsobí refresh stránky, která popup okno otevřela a současně toto okno zavře.
// funkce vrátí stránku, která automaticky zavře popup okno
// a reloaduje stránku, jež popup otevřela
function zavri()
{
?>
<HTML><HEAD><TITLE>Zavřít</TITLE></HEAD>

<BODY onload="window.opener.location.reload();self.close();">
</BODY></HTML>
<?
}

Nyní si vytvořte soubor generuj.php a umístěte jej do adresáře admin. Tento skript budeme vkládat do některých dalších administračních skriptů. Bude obsahovat několik procedur, které budou generovat data z databáze na disk. My si teď popíšeme první, která vybere z databáze všechny jména a id autorů a pro každého z nich vloží do souboru jeden řádek <OPTION> - </OPTION>. Takto připravený soubor budeme vkládat do formulářů, které si popíšeme v příštích dílech seriálu.

generuj.php (/admin/generuj.php)
<?
// budou-li se generovat autoři
if ($generuj == "autori")
{
   // vyber všechny autory a jejich id
   @$sql = mysql_query("SELECT id,jmeno FROM autori ORDER BY jmeno");

   $data = ''; // proměnná $data bude prázdná

   // pro každý řádek přidej do proměnné $data 

Tak a teď se blíže podíváme na skript users.php, který už bude komplexnější. Tento skript po zavolání nejdříve ověří logovací údaje uživatele a pokud bude vše v pořádku, zobrazí se stránka se seznamem všech autorů, ve kterém bude jméno autora, stav, email, pozice a počet článků vložených v systému. Dále je u každého autora tlačítko edit, které vyvolá popup okno s formulářem pro editaci údajů o uživateli. Poslední je sloupec Smazat. Zde bude tlačítko, které smaže uživatele ze systému, ale zobrazí se jen u těch autorů, kteří ještě do systému nezadali žádný článek. Pokud budete chtít smazat uživatele, který už vložil článek, budete muset smazat všechny články takového autora. Dále stránka obsahuje odkaz na vytvoření nového uživatele. Ve skriptu se objeví mírně pokročilý SQL dotaz, který vám nyní popíšu.

SELECT A.*,count(C.id) FROM autori A LEFT JOIN clanky C ON A.id = C.id_autor GROUP BY A.id ORDER BY jmeno;

SQL dotaz nám vybírá všechny údaje z tabulky autori a zároveň počítá články jednotlivých autorů v tabulce clanky, tak, že spočítá ID v tabulce clanky všude, kde je id_autora shodné is id v tabulce autori. Dotaz by se dal napsat i takto:

SELECT A.*,count(C.id) FROM autori A, clanky C WHERE A.id = C.id_autor GROUP BY A.id ORDER BY jmeno;

Takto napsaný dotaz by však nezobrazoval autory, kteří ještě do systému nevložili žádný článek, protože podmínka WHERE A.id = C.id_autor nebude splněna - v tabulce clanky není žádný záznam patřící konkrétnímu ID. Proto jsem byl nucem použít dotazu s LEFT JOIN, který zajistí výběr všech řádků z tabulky autori a to i když podmínka nebude splněna a nenajde se tak žádná vazba mezi tabulkami. V takovém případě bude v posledním sloupci SQL dotazu místo počtu článků hodnota null.

users.php (/admin/users.php)
<?
// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
     echo "Neautorizovaný přístup";
     exit;
}

// vložíme soubory
include "../conn.php";
include "../function.php";

// autorizace
auth();

// pokud uživatel není šéfredaktor, tak ho vyhodíme
if ($INFO[6] < 3)
{
     echo "Neautorizovaný přístup";
     mysql_close($conn);
     exit;
}

// existuje-li proměnná $did pokusíme se smazat uživatele s id
// shodujícím se s $did. Jelikož měníme počet autorů, vygenerujeme
// seznam autorů na disk...
if (isset($did))
{
    // smažeme autora z databáze
    @$sql = mysql_query("DELETE FROM autori WHERE id = $did");
    // vygenerujeme seznam uživatelů na disk
    $generuj = "autori";
    include "./generuj.php";
}

// zobrazíme hlavičku stránky
head();
?>
<SCRIPT LANGUAGE="JavaScript">
<!--
function user(zdroj) {
 aPopUp = window.open(zdroj,'Detail','toolbar=no,location=no,
                      directories=no,status=no,scrollbars=yes,
                      resizable=no,copyhistory=no,
                      width=400,height=350');
}
// -->
</SCRIPT>

<h3>Uživatelé</h3>

<P><A HREF="javascript:user('add_user.php')"
   >Přidat uživatele</A></P>
<?

// select dat z databáze
@$sql = mysql_query("SELECT A.*,count(C.id)
                            FROM autori A LEFT JOIN clanky C
                            ON A.id = C.id_autor
                            GROUP BY A.id
                            ORDER BY jmeno");

// pokud je v databázi alespoň jeden uživatel
if (mysql_num_rows($sql) > 0)
{
   ?>
   <table border=0 cellspacing=0 cellpadding=1>
     <tr bgcolor=#C0C0C0>
       <td bgcolor=#C0C0C0><b> Uživatel</b></td>
       <td bgcolor=#C0C0C0 align="center"><b>
           Aktivní </b></td>
       <td bgcolor=#C0C0C0 align="center"><b>
           Login </b></td>
       <td bgcolor=#C0C0C0 align="center"><b>
           Email </b></td>
       <td bgcolor=#C0C0C0 align="center"><b>
           Pozice </b></td>
       <td bgcolor=#C0C0C0 align="center"><b>
           Článků </b></td>
       <td bgcolor=#C0C0C0 align="center"><b>
           Editovat </b></td>
       <td bgcolor=#C0C0C0 align="center"><b>
           Smazat </b></td>
     </tr>
   <?
        $i = 0; // pomocná proměnná
        // pro každý záznam v databázi se opakuje smyčka, ve které
        // postupně zobrazíme všechny uživatele
        while ($row = mysql_fetch_row($sql))
        {
            // pokud je číslo liché, vložíme do proměnné bgcolor
            // šedou barvu. Jinak bude proměnná prázdná
            if ($i%2==0) $bgcolor=''; else $bgcolor=" bgcolor=#C0C0C0";
   ?>
     <tr<? echo $bgcolor; ?>>
       <td<? echo $bgcolor; ?>> <b><?
           echo $row[3]; ?></b></td>
   <?
         echo "    <td".$bgcolor." align=\"center\"><img src=\"img/";
         // pokud má autor dovolen přístup, zobrazíme zelenou ikonku,
         // pokud ho nemá, bude červená.
         if ($row[7] == "a")
            echo "ok.gif\" title=\"OK";
         else
            echo "no.gif\" title=\"NO";
         echo "\" width=\"20\" height=\"20\"></td>\n";
   ?>
       <td<? echo $bgcolor; ?> align="center"> 
          <? echo $row[1];?></td>
       <td<? echo $bgcolor; ?> align="center"> 
          <a href="mailto:<? echo $row[4]; ?>">
          <? echo $row[4];?></a></td>
       <td<? echo $bgcolor; ?> align="center"> 
          <? echo $pozice[$row[6]]; ?></td>
       <td<? echo $bgcolor; ?> align="center"> 
          <? echo $row[8]; ?></td>
       <td<? echo $bgcolor; ?> align="center"> 
          <INPUT TYPE="BUTTON" VALUE="Editovat"
          onclick="user('edit_user.php?id=<? echo $row[0]; ?>')">
           </td>
       <?
       // Pokud je v systému článek autora, nelze jej smazat !!!
       if ($row[8] > 0)
       {
         ?>
         <td<? echo $bgcolor; ?> align="center">
             <B>nelze</B> </td>
         <?
       }
       // jinak vložíme formulář k vymazání autora
       else
       {
          ?>
          <form method="get" action="users.php">
          <input type="hidden" name="did"
             value="<? echo $row[0]; ?>">
          <td<? echo $bgcolor; ?> align="center">
           <input type="submit" value="Smazat"
             onclick="return confirm('Opravdu chceš uživatele smazat ?')">
              </td>
          </form>
          <?
       }
       ?>
     </tr>
   <?
          // zvýšíme proměnnou i o 1.
          $i++;
       }
       // uvolníme výsledek
       mysql_free_result($sql);
   ?>
   </table>
<?
}
// pokud není nikdo v databázi - nemožné, ale co kdyby...
else
{
   ?>
   <h3><font color="#FF0000">
   <b>Nenalezen žádný odpovídající záznam !!!</b>
   </font></h3>
   <?
}
// zobrazíme patičku stránky a zavřeme spojení s databází
foot();
mysql_close($conn);
?>

Tímto delším skriptem bych chtěl dnešní povídání o redakčním systému ukončit. Projděte si skript users.php ještě jednou a snažte se jej pochopit, obdobně totiž budou vypadat další administrátorské skripty, které budou zobrazovat různé seznamy (např.rubriky). Také nebude na škodu do příštího dílu na chvíli "vypnout" a odpočinout si.

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: