Systém novinek v PHP a MySQL - administrační část

Po úspěšném provedení instalce systému novinek se, pokud jste dodrželi postup instalace, administrační část nachází na adrese:

http://AdresaVasehoWebu/news/

Kdykoliv potřebujete přidat novinku, zadejte tuto adresu. Systém zobrazí formulář pro zadání přihlašovacího jména a hesla (to jsou ty údaje, které jste zadávali při instalaci). Pokud zadáte správné údaje a odešlete formulář, systém se přepne do tzv. administrační části.

Administrační část

Administrační část se skládá z hlavičky, ve které se zobrazuje Vaše přihlašovací jméno a odkaz pro odhlášení, na dalším řádku se pak zobrazuje počet novinek a možnost přidání nové novinky. Pod touto hlavičkou se pak zobrazuje tabulka se seznamem všech novinek v databázi (verze 1.0 zatím nepodporuje žádné stránkování, proto se zobrazují všechny novinky uložené v databázi). Samozřejmě, že po instalaci systému v databázi žádná novinka není, takže se nezobrazuje ani tato tabulka (zobrazí se po založení první novinky).

Přidávání novinek

Ovládání systému je velice jednoduché. Klepnutím na odkaz Přidat novou novinku se zobrazí formulář pro přidání nové novinky. Ten obsahuje položky:

  • Datum
  • Nadpis novinky
  • Obsah novinky
  • přepínač zobrazovat datum novinky
  • přepínač formátovat obsah novinky

Povinné jsou položky Datum a Obsah novinky. Pokud vyplníte položky Datum a Nadpis novinky a ponecháte přepínač zobrazovat datum novinky zatržený, bude se při vypisování novinky zobrazovat jako její nadpis nejen datum, ale i zadaný nadpis (oddělený od data pomlčkou). Pokud vypnete zatržení přepínače zobrazovat datum novinky, nebude se při vypisování této novinky vypisovat zadané datum, ale položka Nadpis novinky se stane povinnou položkou pro vyplnění formuláře (bude se pak vypisovat místo data).

Přepínač formátovat obsah novinky slouží k tomu, aby se při vypisování novinky na stránkách povolilo (přepínač zapnutý) nebo zakázalo (přepínač vypnutý) formátování zapsaného textu převaděčem Texy (syntaxe viz Texy syntax), který můj systém používá. Doporučuji tento přepínač ponechat zatržený. Vzhledem k tomu, že můj systém umožňuje novinky zobrazovat ve třech módech, je potřeba na to myslet při vyplňování jejich obsahu. Dva zobrazovací módy zobrazují novinky jako seznamy (seznam definic DL a netříděný seznam UL) a při jejich použití je Texy nastaveno tak, aby obsah novinky formátovalo jako řádkový element, nikoliv jako odstavec. Odstavcové formátování obsahu novinek je nastavenou pouze při vypisování třetím módem (odstavce P). Při vypisování obsahu novinek v administrační části k žádnému formátování nedochází.

Editace novinek

Můj systém umožňuje nejen novinky přidávat, ale rovněž je editovat nebo mazat. K tomuto účelu slouží příslušné odkazy u každé novinky zobrazené v tabulce administrační části novinek. Funkčnost těchto odkazů snad není nutné popisovat — je pochopitelná z kontextu.

Zpracování XML dokumentu

Nedávno jsem potřeboval programově zpracovat nějaký XML dokument (v Excelu) a nevěděl jsem jak na to. Tak jsem chvilku hledal a našel jsem řešení v objektu Microsoft.XMLDOM.

Práce s ním je poměrně jednoduchá a místo toho, abych zde popisoval jeho strukturu a práci s ním, tak jen odkážu na stránky Microsoftu, kde je všechno poměrně podrobně popsáno (bohužel v angličtině). Takže více informací viz A Beginner's Guide to the XML DOM.

Systém novinek v PHP a MySQL - verze 1.4

Dnes jsem vystavil ke stažení novou verzi mého systému novinek v PHP a MySQL.

Veškeré úpravy spočívají v tom, že jsem zavedl možnost definovat jazyk přidávané položky (na výběr je čeština, angličtina a němčina).

Aplikace nijak nekontroluje jazyk, který je při psaní položky použit. V podstatě se jedná pouze o přepínač. Nicméně je teď možné definovat položky až ve třech různých jazycích, na což je pak brán zřetel při zobrazování položek.

Více informací naleznete v souboru readme.htm, který je součástí "instalačního balíku" (viz download)

Systém novinek v PHP a MySQL - verze 1.2

Dnes jsem vystavil ke stažení novou verzi mého systému novinek v PHP a MySQL.

Veškeré úpravy spočívají v tom, že jsem zavedl možnost přidávat dva druhy položek do tabulky. Novinky a akce. Novinky jsou informace typu "stalo se", akce jsou informace typu "připravuje se".

Zároveň jsem mírně upravil vzhled administračního rozhraní, přidal do něj filtr na zobrazování (všechno/jen novinky/jen akce) a opravil některé drobné chybky, na které jsem v průběhu práce narazil.

Více informací naleznete v souboru readme.htm, který je součástí "instalačního balíku" (viz download)

Systém novinek v PHP a MySQL - stránkování

Dnes jsem provedl úpravu v mém systému novinek v PHP a MySQL.

Celá úprava v podstatě spočívá jen v tom, že jsem upravil zobrazování seznamu novinek v administrační části tak, aby se seznam rozděloval na stránky po deseti záznamech. Hodnotu počtu záznamů na stránku je možné změnit v souboru dbconnect.php, kde je na to definována konstanta PAGELIMIT.

Zajímavý na celé změně může být snad jen kód, který jsem použil pro zobrazení stránkovače. Rozhodl jsem se, že budu zobrazovat maximálně pět odkazů na jednotlivé stránky, přičemž když bude stránek víc, tak se na začátku (případně na konci) stránkovače zobrazí tři tečky. Aktuální stránka bude vždy (mimo případů ze začátku a z konce) zobrazena uprostřed stránkovače.

Nebudu zde opisovat celý kód, ale spíše jen teorii. Kdo bude mít zájem, může si projekt stáhnout a podívat se do zdrojů.

Nejdřív je potřeba si spočítat počet záznamů v tabulce novinek. Toho lze dosáhnout například následujícím SQL dotazem:

SELECT
Count(id) as Pocet
FROM bb_news;

Aktuální číslo stránky, která má být zobrazena si předáme v URL v parametru page. Ten pak vyčteme z proměnné $_GET. Pro stránkovač je nutné vědět, na kolik stránek budeme stránkovat (tedy počet stránek). Ten vypočítáme tak, že vezmeme podíl počtu všech záznamů a počtu záznamů na jednu stránku (viz konstanta PAGELIMIT):

//vypocitam pocet vsech stran
$pocetstran = ceil($pocetvsechzaznamu/PAGELIMIT);

Pak je třeba ošetřit parametr zadané stránky:

//test cisla strany
if ($strana <= 0):
  //kdyz je mensi nebo rovno nule, nastavim prvni stranu
  $strana = 1;
else:
  if ($strana>$pocetstran):
    //kdyz je vetsi nez pocet stran, nastavim posledni stranu
    $strana = $pocetstran;
  endif;
endif;

Pak je potřeba vypočítat číslo stránky, kterým bude stránkovač začínat a kterým bude končit:

//vypocet cisla stranky, kterym bude strankovac zacinat
if ($strana>3):
  //pokud je stranka vetsi nez 3
  if (($strana + 2) >= $pocetstran):
    //pokud je stranka + 2 vetsi nebo rovna poctu stran
    //je pocatecni hodnota rovna poctu stran minus 4
    $start = $pocetstran — 4;
  else:
  //jinak je pocatecni hodnota rovna stranka minus 2
    $start = $strana — 2;
  endif;
else:
  //neni vetsi ney 3, pocatek je 1
  $start = 1;
endif;
//osetreni na nulu
if ($start<=0): $start=1; endif;

//vypocet cisla stranky, kterym bude strankovac koncit
//vzdy budou zobrazeny odkazy na maximalne 5 stranek
$cil = $start + 4;
//osetreni preteceni posledniho cisla stranky
if ($cil > $pocetstran): $cil = $pocetstran; endif;

Pak už jen v jednoduchém cyklu FOR od proměnné $start do proměnné $cil provedeme naplnění textového řetězce s odkazy na stránky, přičemž v případě, že se jedná o zvolenou stránku místo odkazu zabalíme číslo stránky do tagu STRONG:

//prirazeni retezce pro strankovac
$pager = ”;
for ($i=$start; $i<=$cil;$i++):
  if ($i<>$strana):
  //stranky ktere nejsou zvolenou strankou
    $pager.="<a href=\"?page=" . $i . "\">" . $i . "</a>";
  else:
  //zvolena stranka
    $pager.="<strong>" . $i . "</strong>";
  endif;
  //pokud nejsem na konci cyklu, pridam oddelovac
  if ($i<$cil):
    $pager.=" | ";
  endif;
endfor;

No a nakonec ještě přidám tečky na začátek a konec:

//pridani tecek na zacatek a konec strankovace, pokud je vic jak 5 stranek celkem
if ($pocetstran > 5):
  //pokud je aktualni stranka vetsi nez tri, znamena to, ze zacatek je nad jednickou
  //a musim tedy zobrazit tecky na zacatku
  if ($strana > 3):
    $pager="<a href=\"?page=" . ($start — 1) . "\">...</a> " . $pager;
  endif;

  //pokud je rozdil poctu stran a aktualni strany vetsi nez 2, znamena to, ze do konce je vic
  //nez 2 stranky a musim zobrazit tecky na konci
  if (($pocetstran — $strana) > 2):
    $pager=$pager . " <a href=\"?page=" . ($cil + 1) . "\">...</a>";
  endif;
endif; //pocetstran > 5

Generování náhodného hesla v ASP

Potřeboval jsem pro jeden projekt, který píšu v klasickém ASP (tedy nikoliv ASP.NET) mít možnost generovat náhodné heslo. Proto jsem si pro tento účel napsal následující funkci.

Je to velice jednoduchá funkce a píšu to sem jen proto, abych na to nezapomněl a pro to, že by se to třeba mohlo někomu hodit.

Zde je kód zmíněné funkce:

'*******************************************************************************
'Funkce pro vygenerování náhodného hesla zadané délky
'*******************************************************************************
Function RandomPassword(lLenght)
'mnozina znaku, ze kterych budu skladat heslo
'zamerne je vynechano velke pismeno O, nula a pismena Z a Y (mala i velka)
Const sPosChars = "abcdefghijklmnopqrstuvwxABCDEFGHIJKLMNPQRSTUVWX123456789"
'definice promennych
Dim lRnd 'nahodne cislo
Dim lPrev 'predchozi nahodne cislo
Dim sRand 'pomocny retezec

  'inicializace nahodnych cisel
  Randomize
  'default funkce
  RandomPassword = ""
  'osetreni delky hesla (default je 6)
  If (lLenght <= 0) Then lLenght = 6

  'pomocna promenna
  sRand = ""
  lPrev = 0
  Do
    'vygeneruju nahodne cislo od 1 do delka moznych znaku
    Do
      'a delam to tak dlouho, dokud se nahodne cislo nelisi od predchoziho nahodneho cisla
      'pro pripad, ze by bylo vygenerovano stejne jako predchozi
      lRnd = CLng((Rnd * Len(sPosChars)) + 1)
    Loop Until (lRnd <> lPrev)
    'ulozim aktualni nahodne cislo do jine promenne
    lPrev = lRnd
    'priradim retezec z pole povolenych znaku do pomocneho retezce
    sRand = sRand & Mid(sPosChars, lRnd, 1)
  Loop Until (Len(sRand) = lLenght)
  'priradim hodnotu funkce
  RandomPassword = sRand
End Function

Systém novinek v PHP a MySQL - administrační část

Po úspěšném provedení instalce systému novinek se, pokud jste dodrželi postup instalace, administrační část nachází na adrese:

  • http://AdresaVasehoWebu/news/

Kdykoliv potřebujete přidat novinku, zadejte tuto adresu. Systém zobrazí formulář pro zadání přihlašovacího jména a hesla (to jsou ty údaje, které jste zadávali při instalaci). Pokud zadáte správné údaje a odešlete formulář, systém se přepne do tzv. administrační části.

Administrační část

Administrační část se skládá z hlavičky, ve které se zobrazuje Vaše přihlašovací jméno a odkaz pro odhlášení, na dalším řádku se pak zobrazuje počet novinek a možnost přidání nové novinky. Pod touto hlavičkou se pak zobrazuje tabulka se seznamem všech novinek v databázi (verze 1.0 zatím nepodporuje žádné stránkování, proto se zobrazují všechny novinky uložené v databázi). Samozřejmě, že po instalaci systému v databázi žádná novinka není, takže se nezobrazuje ani tato tabulka (zobrazí se po založení první novinky).

Přidávání novinek

Ovládání systému je velice jednoduché. Klepnutím na odkaz Přidat novou novinku se zobrazí formulář pro přidání nové novinky. Ten obsahuje položky:

  • Datum
  • Nadpis novinky
  • Obsah novinky
  • přepínač zobrazovat datum novinky
  • přepínač formátovat obsah novinky

Povinné jsou položky Datum a Obsah novinky. Pokud vyplníte položky Datum a Nadpis novinky a ponecháte přepínač zobrazovat datum novinky zatržený, bude se při vypisování novinky zobrazovat jako její nadpis nejen datum, ale i zadaný nadpis (oddělený od data pomlčkou). Pokud vypnete zatržení přepínače zobrazovat datum novinky, nebude se při vypisování této novinky vypisovat zadané datum, ale položka Nadpis novinky se stane povinnou položkou pro vyplnění formuláře (bude se pak vypisovat místo data).

Přepínač formátovat obsah novinky slouží k tomu, aby se při vypisování novinky na stránkách povolilo (přepínač zapnutý) nebo zakázalo (přepínač vypnutý) formátování zapsaného textu převaděčem Texy (syntaxe viz Texy syntax), který můj systém používá. Doporučuji tento přepínač ponechat zatržený. Vzhledem k tomu, že můj systém umožňuje novinky zobrazovat ve třech módech, je potřeba na to myslet při vyplňování jejich obsahu. Dva zobrazovací módy zobrazují novinky jako seznamy (seznam definic DL a netříděný seznam UL) a při jejich použití je Texy nastaveno tak, aby obsah novinky formátovalo jako řádkový element, nikoliv jako odstavec. Odstavcové formátování obsahu novinek je nastavenou pouze při vypisování třetím módem (odstavce P). Při vypisování obsahu novinek v administrační části k žádnému formátování nedochází.

Editace novinek

Můj systém umožňuje nejen novinky přidávat, ale rovněž je editovat nebo mazat. K tomuto účelu slouží příslušné odkazy u každé novinky zobrazené v tabulce administrační části novinek. Funkčnost těchto odkazů snad není nutné popisovat — je pochopitelná z kontextu.

Systém novinek v PHP a MySQL - popis instalace

Takže celý systém novinek sestává z několika souborů a podadresářů zahrnutých do adresáře news. Před vlastní instalací na webový server je třeba udělat úpravu do souboru dbconnect.php, který se nachází v podadresáři inc. Tento soubor totiž obsahuje informace o připojení k databázi:

  • adresu serveru,
  • přihlašovací jméno k databázi,
  • přihlašovací heslo k databázi,
  • název databáze.

Po zapsání správných hodnot a uložení souboru je nutné nakopírovat celý obsah adresáře news (tedy včetně tohoto adresáře) na webový server (nejlépe do rootu Vaší webové prezentace). Instalaci pak spustíte zadáním adresy:

  • http://AdresaVasehoWebu/news/news-install.php

V prvním kroku se vytvoří příslušné databázové tabulky a ve druhém kroku Vás instalce vyzve k definici administrátorského účtu (jméno, heslo a e-mail — na zadaný e-mail se zadané informace odešlou). Tím je instalace hotova a můžete začít se systémem pracovat.

Systém novinek v PHP a MySQL - popis tabulek

Než začnu popisovat to, jak celý systém funguje, měl bych asi nejdřív popsat definice tabulek. Celý systém se skládá ze dvou tabulek — tabulka bb_users a tabulka bb_news, přičemž hlavní a nejdůležitější tabulkou je tabulka bb_news, ve které jsou uloženy všechny novinky.

Tabulka bb_users

Tabulka slouží pouze pro uložení přihlašovacího jména, hesla a e-mailu tzv. administrátora novinek. Vzhledem k tomu, že jsem ten systém dělal v podstatě pouze pro sebe, tak se mi nechtělo systém navrhovat moc sofistikovaně a rozhodl jsem se, že k němu bude mít přístup pouze jeden uživatel. Do budoucna to půjde případně rozšířit.

Tabulku jsem vytvořil následujícím SQL příkazem:

CREATE TABLE bb_users (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  user VARCHAR(32) NOT NULL,
  pass VARCHAR(32) NOT NULL,
  mail VARCHAR(255) NOT NULL,
  PRIMARY KEY(id)
)

Obsahuje atributy:

  • id (jednoznačný identifikátor, automaticky se inkrementující),
  • user (jménoo uživatele),
  • pass (heslo),
  • mail (e-mailová adresa).

Tabulka bb_news

Tabulka slouží k uložení všech novinek. Vytvořil jsem ji nálsedujícím SQL příkazem:

CREATE TABLE bb_news (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  date DATE NOT NULL DEFAULT '0000-00-00',
  head VARCHAR(50) NOT NULL,
  cont TEXT NOT NULL,
  showdate ENUM('0','1') NOT NULL DEFAULT '1',
  formatcont ENUM('0','1') NOT NULL DEFAULT '1',
  PRIMARY KEY(id)
)

Obsahuje atributy:

  • id (jednoznačný identifikátor, automaticky se inkrementující),
  • date (datum novinky),
  • head (nadpis novinky),
  • cont (vlastní obsah novinky),
  • showdate (přepínač toho, zda se má při vypisování novinky vypisovat datum novinky),
  • formatcont (přepínač toho, zda se má při vypisování novinky provádět formátování obsahu novinky).

Systém novinek v PHP a MySQL - úvod

Tak se mi dnes (snad) podařilo dokončit můj systém novinek naprogramovaný v PHP a využívající databáze MySQL, jak jsem o tom psal v předchozím příspěvku.

Bohužel teď nemám moc času na to, abych se o tom více rozepsal, takže jen uvedu, že systém bude, kromě přidávání nových novinek, umět novinky editovat i mazat. Zobrazování novinek na stránkách pak bude možné ve třech módech:

  • jako definiční seznamy — DL,
  • netříděné seznamy — UL
  • jako odstavce — P.

Víc o tom napíšu v příštím příspěvku (snad zítra).

Systém novinek v PHP a MySQL - představa

Začínám pomalu ale jistě pronikat do programování MySQL v PHP a rozhodl jsem se, že mým prvním "větším" projektem, na kterém se hodlám učit, bude projekt systému novinek. Abych nezapomněl na to, jakou mám představu, rozhodl jsem se napsat tento článek a možná ho později doplním o další články, ve kterých popíšu moje řešení.

Systém by měl fungovat tak, že bude rozdělen na administrační čast a na funkční část, přičemž funkční část bude obsahovat (asi) jen jednu funkci, řekněme GetNews([pocet]), která bude vracet buď seznam všech novinek v databázi (to v případě nezadání parametru) nebo nastavený počet novinek. Administrační část pak bude obsahovat možnost přihlášení (zatím uvažuju jen o jednom uživateli — viz dále) a po přihlášení možnost přidávání, editace a asi i mazání novinek.

Takže si to představuju zhruba tak, že budou existovat dvě tabulky. Tabulka uživatelů a tabulka novinek. Tabulka uživatelů bude obsahovat položky:

  • jméno,
  • heslo,
  • e-mail.

Tabulka novinek bude obsahovat položky:

  • datum,
  • název,
  • obsah,
  • zobrazit_datum (dvoustavový přepínač),
  • formatovat_obsah (dvoustavový přepínač).

Veškerý kód systému bude v jednom adresáři. Tento adresář bude stačit nahrát na server a pak ho bude možné používat (zadáním adresy www.example.com/news/. Instalace (vytvoření tabulek a registrace "administrátora") se provede při prvním přístupu do systému. Součástí instalce bude definice přihlašovacího jména a hesla administrátora. Zatím nemám v úmyslu umožnit registraci více uživatelů, ale pravděpodobně by se to pak později dalo rozšířit. Po provedení instalace pak již bude možné se sestémem začít pracovat, tedy hlavně přidávat novinky, případně pak editovat a/nebo mazat novinky.

Ještě jednou opakuji, že tento článek slouží spíš jen pro moji potřebu a nemám v úmyslu používat nějaká již hotová řešení. Chci se to naučit sám.


Přeskočit na obsah