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) . '"><<</a>'; // odkaz vpred
if($page_number < $pages) $link .= ' <a href="index.php?page_number=' . ($page_number+1) . '">>></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.
Další aktuální články na interval.cz
- Malware: android pod palbou, mobily v ohrožení?
- Pozvánka na Microsoft TechDays 2012
- Reklamní slepota: co to je a jak s ní bojovat?
- Pět důvodů, proč vybrat redakční systém Drupal
- Čeština pro WordPress 3.3.1 k dispozici
Tematicky související články
- Weblog v PHP - registrace a přihlášení autorů
- Weblog v PHP - databázové tabulky a úvodní stránka
- Weblog v PHP - vkládání, mazání a úprava článků
- Weblog v PHP - archivní stránky
- OOP v PHP: Standard PHP Library (SPL) - základní rozhraní
Dejte vědět i ostatním o článku
Komentáře ke článku
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"

