Weblog v PHP – administrační rozhraní

6. ledna 2003

V dnešním článku vám ukáži administrační rozhraní weblogu, tedy stránku, na které může autor vložit nový článek a mazat, případně upravovat již napsané články.

Na začátku souboru index.php načteme všechny potřebné soubory, důležitý je především checklogin.php, který zkontroluje, zda je uživatel skutečně přihlášen. Podrobnosti týkající se přihlašování a souboru checklogin.php byly popsány v minulém článku. Protože ne všichni mají zapnuté cookies, musíme pomocí funkce ini_set() zapnout konfigurační direktivu session.use_trans_sid a zajistit tak přenos session identifikátoru prostřednictvím parametru v URL či skryté položky ve formuláři.

require „checklogin.php“; // je autor prihlasen ?
require „../db.php“; // pripoji k databazi
require „../function.php“; // nacte soubor s dulezitymi funkcemi
require „msg.php“; // chybove hlasky a zpravy
ini_set(‚session.use_trans_sid‘, 1); // zajisti prenos session id

Hned pod nadpisem vypíšeme informace o přihlášeném autorovi a odkaz umožňující snadné odhlášení. Proměnné $name a $email i způsob odhlášení byly popsány v předchozím článku. Při vypisování chybových hlášek je použit soubor msg.php, taktéž podrobněji popsán minule. Pod dalším nadpisem „Vložit článek“ se pak objeví formulář umožňující přidání nového článku.

<h2 class=“heading“>Weblog – administrace</h2>
<?php
// prihlaseny autor
echo ‚<p class=“authorinfo“>‘ . $name . ‚ /‘ . $email . ‚/   ‚;
echo ‚<a href=“login.php?logout=yes“>odhlásit</a></p>‘;
// chybove hlasky a zpravy
if(IsSet($_GET[‚error‘])) $error = $_GET[‚error‘];
if(IsSet($_GET[‚message‘])) $message = $_GET[‚message‘];
if(IsSet($error) && IsSet($msg_error[$error])) echo ‚<p class=“error“>‘ . $msg_error[$error] . ‚</p>‘;
if(IsSet($message) && IsSet($msg_message[$message])) echo ‚<p class=“message“>‘ . $msg_message[$message] . ‚</p>‘;
?>
<h3 class=“heading“>Vložit článek</h3>
<?php
// vlozi formular pro pridani clanku
require „form.php“;
?>

Formulář pro přidání článku

Formulář (form.php) je celkem malý, od autora vyžadujeme pouze název (title) a text článku (article_text) a jeho datum vydání. Přesto je však vytvoření formuláře poněkud komplikovanější. K rozlišení toho, co bude skript provádět, použijeme proměnnou $action. Pokud bude obsahovat „post“, článek se přidá, pokud „delete“, článek se smaže.

<form action=“index.php“ method=“post“>
<input type=“hidden“ name=“action“ value=“post“>
<div class=“form“>
  <div class=“formrow“>
    <div class=“formdesc“>Nadpis</div><div class=“forminput“><input type=“text“ name=“title“ size=“30″ value=“<?php if(IsSet($_POST[‚title‘])) echo StripSlashes($_POST[‚title‘]); ?>“ maxlength=“150″></div>
  </div>
  <div class=“formrow“>
    <div class=“formdesc“>Text</div><div class=“forminput“><textarea cols=“20″ rows=“5″ name=“article_text“><?php if(IsSet($_POST[‚article_text‘])) echo StripSlashes($_POST[‚article_text‘]); ?></textarea></div>
  </div>

Protože chceme, aby datum vydání bylo standardně nastaveno na aktuální datum, musíme k vytvoření této části formuláře použít PHP. Do proměnných si nejprve uložíme informace o aktuálním datu a času převedené na celočíselnou hodnotu. Následně pomocí krátkých cyklů vytvoříme jednotlivé položky toho kterého SELECTu. Pomocí jednoduché podmínky nastavíme aktuální datum a čas na selected.

  <div class=“formrow“>
    <div class=“formdesc“>Vydat</div>
    <div class=“forminput“>
<select name=“from_day“ size=“1″ class=“ultranarrow“>
  <?php
  // vlozi SELECTY a nastavi aktualni datum a cas na „selected“
  
  // dnesni datum
  $from_day = (int)Date(„j“);
  $from_month = (int)Date(„n“);
  $from_year = (int)Date(„Y“);
  $from_hour = (int)Date(„H“);
  $from_minute = (int)Date(„i“);
  // den
  for($i=1;$i<=31;$i++) {
    echo ‚<option value=“‚ . $i . ‚“‚;
    if($from_day==$i) echo “ selected“;
    echo „>“ . $i . „</option>\n“;
  }
  ?>
  </select>
  <select name=“from_month“ size=“1″ class=“wide“>
  <?php
  // mesic
  $month = Array(1=> „ledna“, „února“, „března“, „dubna“, „května“, „června“, „července“, „srpna“, „září“, „října“, „listopadu“, „prosince“);
  for($i=1;$i<=12;$i++) {
    echo ‚<option value=“‚ . $i . ‚“‚;
    if($from_month==$i) echo “ selected“;
    echo „>“ . $month[$i] . „</option>\n“;
  }
  ?>
  </select>
  <select name=“from_year“ size=“1″ class=“narrow“>
  <?php
  // rok
  for($i=2001;$i<=2004;$i++) {
    echo ‚<option value=“‚ . $i . ‚“‚;
    if($from_year==$i) echo “ selected“;
    echo „>“ . $i . „</option>\n“;
  }
  ?>
  </select>
  
  <select name=“from_hour“ size=“1″ class=“ultranarrow“>
  <?php
  // hodina
  for($i=0;$i<=23;$i++) {
    echo ‚<option value=“‚ . $i . ‚“‚;
    if($from_hour==$i) echo “ selected“;
    if(StrLen($i) == 1) $i = „0“ . $i;
    echo „>“ . $i . „</option>\n“;
  }
  ?>
  </select>
  
  <select name=“from_minute“ size=“1″ class=“ultranarrow“>
  <?php
  // minuta
  for($i=0;$i<=59;$i++) {
    echo ‚<option value=“‚ . $i . ‚“‚;
    if($from_minute==$i) echo “ selected“;
    if(StrLen($i) == 1) $i = „0“ . $i;
    echo „>“ . $i . „</option>\n“;
  }
  ?>
  </select>    
    
    </div>
  </div>
  <div class=“formrowsubmit“>
    <input type=“submit“ name=“send“ value=“Vložit“ class=“submit“>
  </div>
</div>
</form>

Výpis článků a stránkování

Pod formulář vypíšeme pomocí funkce Select_Articles() již napsané články, které bude autor moci mazat či upravovat.

<h3 class=“heading“>Administrace článků</h3>
<?php
// zobrazi clanky
echo Select_Articles();
MySQL_Close();
?>

V proměnné $limit nastavíme počet článků na stránce, v proměnné $page_number je pak číslo stránky, která se má zobrazit.

$limit = 10; // pocet clanku na strance
$page_number = IsSet($_GET[‚page_number‘]) ? $_GET[‚page_number‘] : 1; // stranka, ktera se zobrazi

Na základě proměnných $user_id a $user_type, které byly popsány minule, sestavíme podmínku pro výběr článků. Vybrané články zpracujeme funkcí Article(), jež byla popsána v druhém článku. Ke každému článku přidáme odkazy umožňující daný článek smazat či upravit. Na závěr pomocí funkce Page_Links() přidáme ještě odkazy na stránky s dalšími články.

// vybere clanky
function Select_Articles()
{
  global $page_number, $limit, $user_id, $user_type;
  // na zaklade typu autora sestavi podminku (A = admin – ma prava ke vsem clankum, U = autor – ma prava pouze k vlastnim clankum)
  if($user_type==“A“) $sql = “;  
  if($user_type==“U“) $sql = „AND author = $user_id“;
  $start = ($page_number-1)*$limit;  // prvni clanek, ktery se zobrazi
  $query = @MySQL_Query(„SELECT article.id AS article_id, title, message, author, publish_date, name, email FROM article, author WHERE author = author.id $sql ORDER BY publish_date DESC LIMIT $start,$limit“) or Weblog_Error(2);
  
  if(MySQL_Num_Rows($query)!=0) {
    $article = “;
    while($result = MySQL_Fetch_Array($query)) {
      $article .= Article($result, false);
      
      // ke kazdemu clanku prida odkazy „Smazat“ a „Upravit“
      $article .= ‚<div class=“articlemenu“>‘;
      $article .= ‚<a href=“update.php?article_id=‘ . $result[‚article_id‘] . ‚“>Upravit</a>‘;
      $article .= ‚<a href=“index.php?action=delete&article_id=‘ . $result[‚article_id‘] . ‚“>Smazat</a>‘;
      $article .= „</div>\n“;
    }
    $article .= Page_Links();  // na zaver se vlozi odkazy na dalsi stranky
    
  } else {
    $article = ‚<p class=“message“>Ještě jste nenapsal žádný článek.</p>‘;
  }
  return $article;
}

Abychom mohli vypsat odkazy na další stránky, musíme nejprve zjistit počet článků, ke kterým má autor práva a následně vypočítat počet stran, na kterých se články zobrazí. Aby to nebylo příliš jednoduché, pokusíme se vypsat vždy pouze 10 dalších odkazů, tedy 5 před a 5 za právě zobrazenou stránkou. Ne vždy to však jde tak jednoduše, po prvním výpočtu se totiž do proměnných $start_page a $end_page často vloží záporné či příliš velké hodnoty. Pomocí několika dalších podmínek a výpočtů však docílíme toho, že se v proměnných $start_page a $end_page objeví korektní hodnoty. Můžeme tedy vytvořit odkazy na stránky v intervalu $start_page$end_page, na první a poslední stránku a také odkazy vpřed a vzad posouvající uživatele vždy jen o jednu stránku.

// vytvori odkazy na jednotlive stranky s clanky
function Page_Links()
{
  global $user_type, $user_id, $limit, $page_number;
  // Admin muze pracovat se vsemi clanky, aUtor pouze s vlastnimi
  if($user_type==“A“)  $sql = “;  
  if($user_type==“U“) $sql = „WHERE author = $user_id“;
  $query = @MySQL_Query(„SELECT count(id) FROM article $sql“) or Weblog_Error(2);
  $result = MySQL_Fetch_Array($query);
  $pages = Ceil($result[‚count(id)‘]/$limit);  // pocet stranek
  $link = ‚<div class=“articlemenu“>Zobrazit stranu: ‚;
  // vypocet pocatecni a koncove stranky (snazime se vypsat vzdy 10 odkazu)
  $start_page = $page_number-5;
  $end_page = $page_number+5;
  
  // pri prvnim vypoctu mohly byt do promennych vlozeny nekorektni (zaporne nebo prilis velke) hodnoty proto musime provest dodatecnou kontrolu
  if($start_page < 1) $end_page += Abs($start_page) + 1;
  if($end_page > $pages) {
    $start_page = $start_page – ($end_page-$pages);
    $end_page = $pages;
  }
  if($start_page < 1) $start_page = 1;
  
  // odkazy
  if($start_page > 1) $link .= ‚<a href=“index.php?page_number=1″>‘ . 1 . ‚</a> … ‚; // odkaz na prvni stranku
  for($x = $start_page;$x <= $end_page;$x++) $link .= ‚<a href=“index.php?page_number=‘ . $x . ‚“>‘ . $x . ‚</a>  ‚; // odkazy na sranky v intervalu $start_page – $end_page
  if($end_page < $pages) $link .= ‚… <a href=“index.php?page_number=‘ . $pages . ‚“>‘ . $pages . ‚</a>‘; // odkaz na posledni stranku
  if($page_number > 1) $link .= ‚  <a href=“index.php?page_number=‘ . ($page_number-1) . ‚“>&lt;&lt;</a>‘; // odkaz vpred
  if($page_number < $pages) $link .= ‚  <a href=“index.php?page_number=‘ . ($page_number+1) . ‚“>&gt;&gt;</a>‘; // odkaz vzad
  $link .= ‚</div>‘;
  return $link;
}

Hotovou aplikaci si můžete prohlédnout a vyzkoušet. V příštím článku, který tuto sérii prozatím ukončí, bude popsán způsob přidávání, mazání a úpravy článků.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Vopiat

    Dub 21, 2010 v 17:55

    Hm bylo by dobrý napsat kam a jakej script patří
    a né napsat toto bude v index.php a pak dlouho dlouho nic.Jsem z toho z maten a nevim kam to dát.Fakt dobrej popis „v azbuce bych to snáz pochopil“

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *