TOPlist
Weblog v PHP – administrační rozhraní

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ů.



Michal Kebrt (6.1. 2003)




Vyhledávání

Rozšířené vyhledávání




Nejčtenější






Knižní novinka



ASP.NET – krok za krokem
ASP.NET – krok za krokem
Osvojte si ASP.NET metodou krok za krokem v přeložené knize od Micosoft Pressu!

Cena: 490 Kč 441 Kč




Diskuzní kotel





Četli jste už?






Hodnotilo: 69 čtenářů
Výsledek: 2,82


 Tisk
 Doporučit článek

Diskuze: Weblog v PHP – administrační rozhraní
06.01.2003, 10:26 Štěpán Horák Chybné zobrazování data v archivu
06.01.2003, 19:16 Michal Kebrt ccChybné zobrazování data v archivu
13.01.2003, 21:49 mysql Help
14.01.2003, 18:38 Michal Kebrt ccHelp
13.01.2003, 21:49 mysql Help
Zobrazit všePřidat nový
Redakce Interval.cz |  Inzerce na Interval.cz |  Hledáme nové autory ISSN 1212-8651 
 © Zoner software, s.r.o., všechna práva vyhrazena, tento server dodržuje právní předpisy o ochraně osobních údajů.