Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

interval.cz

Weblog v PHP - administrační rozhraní

06. 01. 2003 | Michal Kebrt | PHP | Komentáře: 1

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.


Reklama


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Komentáře ke článku

Přidat nový komentář

Vopiat

Autor komentáře: Vopiat

Datum vložení: 21. Duben 2010, 17:55:43

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"

Zpět na začátek komentářů | Zpět na začátek článku

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.