kerepesi lászló - szakdolgozat
DESCRIPTION
Szerző: Kerepesi LászlóCím: Saját fejlesztésű cms létrehozásaNyíregyházi Főiskola 2009TRANSCRIPT
SZAKDOLGOZAT
Kerepesi László
NYÍREGYHÁZA 2009
Saját fejlesztésű CMS létrehozása Kerepesi László
2
NYÍREGYHÁZI FŐISKOLA TERMÉSZETTUDOMÁNYI ÉS INFORMATIKAI KAR
SAJÁT FEJLESZTÉSŰ CMS LÉTREHOZÁSA
Témavezető: Készítette: Falucskai János Kerepesi László főiskolai docens programtervező informatikus alapszakos (BA/BSc) hallgató
Nyíregyháza, 2009.
Saját fejlesztésű CMS létrehozása Kerepesi László
3
Tartalomjegyzék
1. Bevezetés ...............................................................................................................................4
1.1 A tartalomkezelők főbb jellemzői .......................................................................................5
1.2 Drupal ................................................................................................................................7
1.3 Joomla! ..............................................................................................................................8
1.4 WordPress ..........................................................................................................................8
2. Tervezés ............................................................................................................................... 12
3. Megvalósítás ........................................................................................................................ 14
3.1 Index.php ......................................................................................................................... 15
3.2 Regisztrálás ...................................................................................................................... 17
3.3 Login ................................................................................................................................ 20
3.4 Hírek ................................................................................................................................ 22
3.5 Galéria ............................................................................................................................. 25
3.6 Fórum .............................................................................................................................. 30
3.7 Adminisztráció.................................................................................................................. 35
4. Összegzés ............................................................................................................................. 37
Irodalomjegyzék .......................................................................................................................... 38
Saját fejlesztésű CMS létrehozása Kerepesi László
4
1. Bevezetés
Napjainkban az internet rengeteg információt nyújt a használóik számára. A televízióban a
legtöbb reklám végén láthatunk egy olyan sort, mely www-vel kezdődik, s melyből
megtudhatjuk, hogy az adott termékről milyen webcímen tudhatunk meg többet. Sőt, már a
rádióban hallhatóak között is egyre több olyat fedezhetünk fel, amelyben webcímre
hivatkoznak, ha további információkra lenne szükségünk. Viszont ezek az oldalak, ahogy
az internet oldalainak legtöbbjére igaz, igen nehéz munka gyümölcsei. Web programozók
hada szerkeszti, frissíti szerte a világon a portálokat a nap 24 órájában, hiszen egy portál
sikere és hatékonysága nagyban függ attól, hogy mennyire naprakész az adott oldal.
Ahogy olvasói vagyunk az internet információinak, néhány akár nem hozzáértő emberben
is felmerülhet, hogy vajon tudna-e ő is ilyen oldalakat tervezni, melyen megoszthatja
kollégáival, barátaival a közös kirándulásokon készített fotókat, élményeit leírhatja egy
blog-ban, vagy netán egy adott témában fórumot is indíthat, hogy megvitassák a főiskolai
vizsgák előtti utolsó tippeket.
Nem csak magánszemélyek, hanem kis-, és nagyvállalatok számára is igen hasznos, sőt
jövedelmező, ha van saját honlapjuk, hisz nemcsak saját maguk szolgáltatásait tudják
reklámozni, hanem akár egy web-shop segítségével egyből meg is tudják a vásárolni a
termékeiket a látogatóik.
Sajnos igazán szép, mutatós weblapokat nem könnyű megfelelő felkészültség nélkül
szerkeszteni, és ezek hátterében (forrásában) megtekinthető HTML nyelv a mindennapi
felhasználó számára ijesztően hathat. Igaz, vannak HTML szerkesztő programok, melyek
megkönnyítik az egyes űrlapelemek elhelyezését, képek beszúrását, a háttér színezését,
linkek elhelyezését, viszont komolyabb oldalakat, mint például egy webshop, már elég
nehéz velük megszerkeszteni, valamint a karbantartásukra is viszonylag sok időt kell
szánni.
Mi lenne, ha lenne egy olyan eszköz, amivel könnyen, egyszerűen, arra figyelve, hogy mit
szeretnék megjeleníteni, - nem arra, hogy hogyan, - megalkothatnánk a kívánt weblapot,
mindenféle mély szakmai tudás elsajátítása nélkül? Már egyből a webes felületen fel is
tölthetnénk azt, a számunkra fontos hírekkel, képekkel, tartalmakkal, mindenféle nehéz
programozási ismeret nélkül, csupán „kattintgatva” az oldalon.
Saját fejlesztésű CMS létrehozása Kerepesi László
5
A fejlesztők is gondoltak erre az igényre, így az évek során kitaláltak egy rendszert, mely a
„mezei” felhasználók fentebb említett igényeit kielégítik, sőt túl is mutat rajtuk. Ez az
eszköz a tartalomkezelő rendszer, röviden CMS (Content Management System).
A WIKIPEDIA szerint: „A tartalomkezelő rendszerek (angolul Content Management
System, CMS) olyan szoftverrendszer, amely nem strukturált információk, mint például az
internetes portálok akár több felhasználó általi elkészítését, kezelését, és tárolását segíti.
Továbbá gondoskodik a tartalmak strukturált megjelenítéséről, statisztikák készítéséről,
kiegészítő funkciók integrálásáról.” „Olyan, általában web alapú program, amely lehetővé
teszi változatos adatok általában hypertext formátumban való dinamikus publikálását
programozói tudás nélkül. A szó egyébként mindenféle rendszerezett, decentralizált
publikálási feladatot ellátó programrendszerre vonatkozik. Ilyen értelemben véve tehát egy
vállalati /egyetemi/ bármilyen közösségi használatú számítógépes felület.”[Wikipedia®,
2009. január 8.]
A szakdolgozat célja a tartalomkezelő rendszerek általános bemutatása, valamint egy saját
fejlesztésű CMS részletes működésének prezentálása.
1.1 A tartalomkezelők főbb jellemzői
A tartalomkezelő rendszer működése a következőben leírtak alapján foglalható össze: a
rendszer felhasználói a frissíteni kívánt adatokat (szövegeket, képeket, egyéb fájlokat) egy
adminisztrációs felületen feltöltik a CMS rendszer adatbázisába. Ezek után a rendszer
frissíti az oldalt és beteszi a feltöltött tartalmat az előre kiválasztott sablonba, így a
következő látogatásnál már az új tartalmat kaphatja meg, aki felkeresi a honlapot.
„Tartalomnak (content) nevezzük azon információtöredékek halmazát, amelyet összerakva
összefüggő, felismerhető „dolgot” kapunk. Ilyen például egy újságcikk, mely a címből,
rövid összefoglalóból, a cikk törzséből és szerzőjéből állhat. Emellett tartalmazhat például
képeket, referenciákat, kitérőket, hivatkozásokat, amelyek hozzáadnak valamit, gazdagítják
azt, több értéket nyújtva az olvasónak.” [http://cms.whysoft.hu/mi_a_cms.html]
A következőkben pontokba foglalva szeretném a CMS rendszerek főbb jellemzőit
kiemelni:
Saját fejlesztésű CMS létrehozása Kerepesi László
6
• Dinamizmus: A tartalmat, valamint annak megjelenését megfelelő jogosultság
esetén bármikor, bárhonnan meg lehet változtatni. Akár naponta lehet az adatokat
frissíteni, mint például egy blog esetén.
• Egyszerűség: tehát a tartalomkezelő rendszerek jellemzője az egyszerű, laikusok
által is könnyen elsajátítható működtetés. A cél, hogy ne csak a szakavatottak
legyenek képesek mutatós és összetett weboldalak elkészítésére
• Platform függetlenség: vagyis nem számít, hogy milyen operációs rendszer
fut a szerveren, valamint milyen böngészővel tekintjük meg a tartalmat. Lehet ez
akár valamilyen Linux disztribúció, Windows (98/NT/2000/XP) verziók egyike,
vagy akár egyéb más rendszer. Természetesen mindegyik platformon
elengedhetetlen a megfelelő PHP értelmező és adatbázis-kezelő.
• Multiuser rendszerek: vagyis egyszerre többen böngészhetk,szerkeszthetik a
tartalmakat, telepíthetnek kiegészítőket, illetve további a rendszer működését segítő
beállításokat végezhetnek. A kiegészítő modulok segítségével az azonos CMS
alapokon nyugvó honlapok is teljes mértékben testre szabhatók.
A CMS – mint általában a szoftvervilág – két nagy csoportra bomlik: nyílt forráskódú (free
source), illetve zárt forráskódú (proprietary) megoldásokra.
A nyílt forráskódot szokták GPL licenc-nek is nevezni: ez azt tartalmazza, hogy a szoftver
szabadon terjeszthető (akár pénzért is), és szabadon módosítható, de a terjesztései és a
módosítások kötelezően szintén GPL licenc alatt kell, hogy megjelenjenek, így biztosítva,
hogy a szabad tartalmakból készült bármilyen származékos szoftver is szabad maradjon.
Ilyen szoftverek például: Drupal, Joomla, vagy a WordPress.
A CMS szoftverek között, mind az alap funkciók, mind pedig a bővíthetőség terén sok
különbség van. Hazánkban is egyre nagyobb népszerűségnek örvendenek a GPL licens-es
CMS-ek, ennek ékes bizonyítéka, hogy magyar nyelvű támogatói oldallal is rendelkeznek:
Saját fejlesztésű CMS létrehozása Kerepesi László
7
A következőkben a három Magyarországon is népszerű CMS rendszert szeretném egy pár
mondatban bemutatni
1.2 Drupal
A Drupal Cms rendszert Dries Buytaert írta meg elsőként, majd az évek során - mint
megannyi nyílt forráskódú szoftvert - rengeteg „közösségi” fejlesztésen esett át. Bárki
javasolhat módosításokat, amelyeket a fejlesztő közösség véleményez, de a forráskódba
ezeket csak néhány kiemelt személy építheti be. Ezzel biztosítja, hogy az itt található
kódok mindig korrektek és használhatóak.
A rendszer több funkciót is magában foglal:
Ø Tartalomkezelő rendszer (CMS - Content Management System)
Ø Tartalomkezelő keretrendszer (CMF - Content Management Framework)
Ø Web alkalmazásfejlesztő keretrendszer (WAF - Web Application Framework)
A Drupal széles palettáról kínál bővítő modulokat, melyek lehetővé teszik a rendszer
szolgáltatásainak kiterjesztését. Ezen a modulok ingyenesen letölthetőek a következő
oldalról: http://drupal.org/project/Modules .
A Drupal legfontosabb jellemzői:
Ø Többféle, könnyen testre szabható sablon rendszer támogatása
Ø Blogger API
Ø Naplózás és elérési statisztikák készítése
Ø Automatikus védelem túlterhelés esetén
Ø Kiváló bővíthetőség
Ø Beágyazott adminisztrációs felület
Ø Könnyen megjegyezhető URL álnevek támogatása
Ø Csoportos, tartalom szintű jogosultság kezelés
Ø Többféle beviteli formátum (pl. BBCode, Textile, ...)
Ø Verziókezelés
Ø Beépített súgó
Ø Rengeteg beépített tartalom típus (oldal, fórum, blog, szavazás, ...)
Ø Űrlapok
Saját fejlesztésű CMS létrehozása Kerepesi László
8
Ø Szálkövető hozzászólások
Ø Vitafórumok
Ø Saját tartalom típusok kialakításának lehetősége
Ø Indexelt keresés
1.3 Joomla!
„A Joomla! egy olyan tartalomkezelő rendszer (CMS), amit ugyanazok a programozók
készítettek, mint akik a díjnyertes Mambo rendszert is. Tulajdonképpen a két rendszer
ugyanaz, vagy legalábbis a Joomla a Mambo újabb verziójának tekinthető, ezt bizonyítja,
hogy a legutóbbi Mambo (4.5.2-es) verzióhoz való kiegészítők többnyire a Joomla-ra is
telepíthetők. A Joomla! szó a szuhaéli eredetű "Jumla" szó fonetikus kiejtése, mely annyit
jelent, hogy "mindenki együtt" vagy "egy egészként".” [Lovászi Nándor Zsolt: A Joomla!
tartalomkezelő rendszer bemutatása 2007]
„Az interneten a honlapok karbantartását arra feljogosított adminisztrátorok vagy
felhasználók végzik. A Mambo alapú honlapokon, egyszerre akár több ember is kezelheti a
tartalmat. Nem szükséges a HTML nyelv ismerete a honlap frissítéséhez, mivel a
WYSIWYG típusú szövegszerkesztő segítségével a Word-höz hasonlóan formázhatja meg
a szöveget, szúrhat be képeket. Nincs szükség a dokumentumok FTP-n keresztüli
feltöltésére. Csak el kell menteni a begépelt szöveget, majd publikálni és a weboldal máris
elérhető, megtekinthető bárki számára a világon.” [Lovászi Nándor Zsolt: A Joomla!
tartalomkezelő rendszer bemutatása 2007]
1.4 WordPress
„A WordPress egy elegáns, jó felépítésű személyes publikálási rendszer PHP és MySQL
alapokon építve, a GPL licenc alatt kiadva. A b2/cafelog hivatalos utódja. A WordPress
egy viszonylag új portálmotor, de gyökerei, és fejlesztése egészen 2001-ig visszanyúlik. A
WordPress tartalomkezelő helyes működéséhez legalább 4.2-es verziószámú PHP
szerverre és minimum 3.23-as verziójú MySQL szerverre van szükség.” [Mondovics
Mihály: A WordPress tartalomkezelő rendszer bemutatása 2007 Pécs]
Saját fejlesztésű CMS létrehozása Kerepesi László
9
„A WordPress tartalomkezelő rendszer fájljai egy jól strukturált és egyszerű
könyvtárszerkezetben találhatóak. Itt funkcióik szerint vannak különválasztva a fájlok.
A struktúra a következő:
• wp-admin
• wp-content
o plugins
o themes
o uploads
• wp-includes
Wp-admin:
Ebben a mappában az adminisztrációhoz szükséges rendszerfájlok és függvényleírások
találhatóak.
Wp-content:
A felhasználó mappája. Itt találhatóak a pluginek, sablonok és a feltöltött állományok is.
A helyes működés érdekében erre a mappára írási jogot kell adnunk.
Wp-includes:
Az oldal működéséhez szükséges függvények definícióit tartalmazó fájlok lelőhelye.”
[Mondovics Mihály: A WordPress tartalomkezelő rendszer bemutatása 2007 Pécs]
1.5 PHP
A PHP elterjedt nyílt forráskódú szerveroldali programozási nyelv, mely kifejezetten a
dinamikus weboldalak programozásra használják. Szintaktikája leginkább a C
programozási nyelvéhez hasonlít. A nyelvet 1994-ben Rasmus Lerdorf kezdte el fejleszteni
először, majd 1995. június 8-án adta ki a PHP első nyílt forráskódú változatát, hogy a
programnyelv hibáinak keresése minél hatékonyabb legyen.
Két évvel később 1997-ben Zeev Suraski és Andi Gutmans, két izraeli fejlesztő újraírta az
értelmezőt.
A PHP szó jelentése PHP Hypertext Preprocessor kifejezésből ered. (A név eredeti
jelentése az angol Personal Home Page, azaz a személyes honlap kifejezés rövidítése volt.)
Mára a Zend Technologies (Zeev Suraski és Andi Gutmans) a PHP mögött álló első
számú céget, a PHP alapjainak készítői alapították.
Az értelmezőt támogató kereskedelmi termékeket fejlesztenek, terméktámogatással. A
honlapjukon található referenciák egyértelművé teszik a PHP egyre szélesedő
Saját fejlesztésű CMS létrehozása Kerepesi László
10
elfogadottságát a magasabb üzleti szektorban is. A PHP továbbra is ingyenes termék,
minden feladatra elérhetőek általa költségmentes megoldások.
„A PHP egy szerver-oldali szkript nyelv. A válaszlap formátumát leíró utasítások egy
HTML dokumentumba ágyazva helyezkednek el. A Web-szerver a meghívott
dokumentum URL-jéből ismeri fel, hogy a kérést a PHP szervernek kell feldolgoznia. A
minta dokumentum HTML utasításai változtatás nélkül átkerülnek a válaszlapra, a PHP
specifikus elemeket a PHP végrehajtja, és a generált válasz kerül be az eredménylapra.
Ugyan a PHP leíró nyelve nem adatbázis orientált, hanem a C általános programozási
nyelvre épül, mégis tartalmaz adatbázis kapcsolódási kiegészítő modult, amely lehetővé
teszi, hogy elérhessük, és a válaszlapon megjeleníthessük a legkülönbözőbb
adatbázisokban tárolt adatokat is.” [Révész György: A PHP nyelv Pécs, 2004. december
22.] (1. ábra)
1. ábra
A PHP nagyszerűen alkalmas olyan feladatok ellátására, mint például a bejelentkezés, az
adatbázis kezelés, fájlkezelés, kódolás, adategyeztetés, kapcsolatok létrehozása, e-mail
küldése, adatfeldolgozás, dinamikus listakészítés (stb.), melyre a kliens oldali szkriptek
nem alkalmasak. Azokban az esetekben, ahol nagyszámú ismétlődő feladatsort kell
végrehajtani, mint például képek listázása és linkelése, listakészítés stb., szintén kiválóan
alkalmazható. Mindezek mellett a PHP nagyon jól dokumentált nyelv, melyet eddig
számos könyv is magas szinten taglal, valamint több hazai portál is fő témájának
választott.
Saját fejlesztésű CMS létrehozása Kerepesi László
11
„A PHP specifikus utasítások a HTML utasítások közé beillesztve, beágyazva
foglalnak helyet. A HTML utasításoktól való egyértelmű és könnyen kezelhető
szétválasztás érdekében az egyes PHP specifikus utasításokat keretbe foglaljuk. Az
elhatárolás az alábbi változatok valamelyikével lehetséges:
hagyományos : <?php PHP elemek ?>
szkript stílusú : <script language="php"> PHP elemek</script>
rövid : <? PHP elemek ?>
ASP stílusú : <% PHP elemek %>
A fenti kezdő- ill. záró elemek közül az utolsó kettő használatát a php.ini fájlban
engedélyezni kell a short_open_tag=on ill. az asp_tags=on beállításokkal.
A PHP elemek a C nyelvi kifejezésekhez hasonló formátumot öltenek. Egy tagolt rész
több elemi PHP kifejezést, utasítást is tartalmazhat. Ekkor az egyes PHP utasításokat
pontosvesszővel határoljuk el egymástól:
<?php
PHP utasítás1;
PHP utasítás2;
…
?>
A fenti példából is látható, hogy a tagolási rész és a PHP elemi utasítás is, több forrássoron
keresztül is folytatódhat, a sorvégjel nem jelent utasítás határt.
Mivel a HTML fájlok egyszerű szöveges fájlok, bármilyen szövegszerkesztő segítségével
írhatjuk a PHP kódokat is. A HTML-szerkesztők általában viszont nyújtanak valamilyen
különleges támogatást PHP-szerkesztéshez is, ilyenek például a kódszínezés, a kifejezés
szerkesztő vagy a tesztelő.” [Révész György: A PHP nyelv Pécs, 2004. december 22.] Egy
egyszerű program például:
<?php echo "Helló világ!"; // a kiírandó szöveg ?>
Saját fejlesztésű CMS létrehozása Kerepesi László
12
2. Tervezés
Először is, mint minden program fejlesztését gondos tervezésnek kell megelőznie. Fel kell
mérni, hogy milyen képességekkel kell felruházni az oldalunkat, hogy a célnak
megfeleljen.
Esetemben egy képzeletbeli kis vállalat (Reflex Kft.) intranetén futó hírportált terveztem,
amelyet több kitüntetett alkalmazott frissíthet mindig aktuális hírekkel és a vállalat életéről
készült képeket, fel tudja tölteni egy galériába, melyet aztán mindenki kedve szerint
megnézhet. Valamint egy fórumot, melyben a dolgozók tehetnek fel kérdéseket a
vezetőségnek, és azok válaszolhatnak rájuk. Természetesen továbbra is fontos szempont az
egyszerű kezelhetőség és a testreszabhatóság.
Tehát két működési módja kell, hogy legyen az oldalnak: az egyik a „nézegető” mód, a
másik a „szerkesztő” mód. Szerkesztő módban lehet az adatbázis adatait frissíteni,
megfelelő jogosultság birtokában, új híreket beírni, vagy régieket törölni, képeket feltölteni
a galériába illetve törölni őket onnan. A nézegető mód viszont csak az adatok
megtekintésére szolgál. A fórumban regisztrált és bejelentkezett felhasználók írhatnak
majd hozzászólést, viszont nézegető módban megtekinthetőek a témák és azok részletei.
A portál megvalósítása közben, olyan technikákat is alkalmazni fogok, mint például a CSS,
mellyel egy HTML oldal stílusát, kinézetét lehet változtatni globálisan, vagy a JavaScript,
mellyel kisebb beágyazott programokat lehet futtatni az oldalon, annak használatának
kényelmesebbé tétele érdekében.
Az adatok tárolására MySQL adatbázist fogok használni, mert könnyen lehet a PHP
kódból kapcsolódni hozzá és SQL parancsokat (Select, Insert, Delete, Update) lehet
futtatni. Különböző adattáblákat kell létrehozni az egyes funkciók adatainak a tárolása
érdekében: Users, Forum, Hirek, Galeria, stb.
Saját fejlesztésű CMS létrehozása Kerepesi László
13
Az elkészítendő portál látványterve: (2. ábra)
2. ábra
A ’Hírek’, ’Galéria’, ’Fórum’ linkekre kattintva a belső rész változik és megjelenik a
kívánt felület alapértelmezetten csak olvasására, mindig a legfrissebb információ van az
oldal tetején. Ha bejelentkezünk és van megfelelő jogosultságunk, akkor frissíteni is lehet a
tartalmat.
Az oldal működéséhez hozzátartozik, hogy ha a cégnek szüksége lesz egy új modulra,
akkor ne kelljen feltétlenül a program fejlesztő a régi rendszerbe való beillesztésére, hanem
elég legyen egy - két kattintás az új modul (plugin) beillesztésére. Ezt a műveletet, akár a
cég egyik alkalmazottja is megtehesse.
A felhasználók jogosultságai a következőképpen alakul majd, erősségileg emelkedő
sorrendben:
• Sima felhasználó (híreket tud olvasni, képeket tud nézni a galériából és
letölteni, valamint a fórumból megtekintheti a témákat és a hozzászólásokat,
valamint hozzászólásokat tud írni)
• Admin (kiemelt felhasználó, aki tud híreket beírni, módosítani, kategóriákat
létrehozni, törölni és képeket feltölteni, törölni a galériából, valamint a
fórumban új témát indítani)
Saját fejlesztésű CMS létrehozása Kerepesi László
14
• Főadmin (a legmagasabb szintű felhasználó, aki a „Sima felhasználó”-t
előléptetheti „Admin” jogosultságúvá, illetve visszaminősítheti ismét „Sima
felhasználóvá”, felhasználók adatait (elfelejtett jelszó) tudja módosítani,
híreket törölni, kategóriákat törölni, fórum témákat törölni, design
beállításokat átállítani, menük nevét elhelyezkedését állítani, és új modult
tud illeszteni a renszerhez stb.)
3. Megvalósítás
A rendszer fejlesztéséhez és futtatásához, ahogy azt már korábban is említettem szükség
van egy webszerverre és egy php értelmezőre, valamint egy mysql adatbázis kezelő
szoftverre. Ezt a hármast kell összehangolni, hogy futtatni lehessen a rendszert, ezt meg
lehet tenni manuálisan is (ez nem mindig könnyű feladat), vagy lehet egy keretrendszert
használni, ami tartalmazza ezen összetevőket összehangolva munkára készen. Én az
utóbbit választottam.
Ilyen free szoftver pl: a XAMPP, ami a http://www.apachefriends.org/en/xampp.html
oldalról lehet letölteni. Ez a programcsomag tartalmaz még egy phpMyADMIN nevű
programot, mellyel könnyen lehet kezelni a mysql adatbázisokat.
A XAMPP-ot célszerű biztonsági szempontból egy külön partícióra telepíteni az operációs
rendszertől. Ennek megfelelően Windows platformon a php programrészek a
„D:\xampp\htdocs\reflex\” mappába kerülnek. Ezen belül szerveződnek az egyes program
modulok mappái a következő módon: (3. ábra)
3. ábra
Az adatbázis is hasonlóképpen tagolódik fel, minden funkcióhoz egy külön tábla
tartozik.(4. ábra)
Saját fejlesztésű CMS létrehozása Kerepesi László
15
4. ábra
Az egyes táblák szerkezetével bemutatásával az egyes funkciók ismertetésekor fogok
részletesebben is foglalkozni.
3.1 Index.php
Az oldal az index.php értelmezésével kezdődik.
<? session_start(); ob_start(); include('config.php'); //adatbázis kapcsolat include('head.php'); //head beállítások
Itt indul a SESSION kezelés, ami biztosítja bizonyos változók jelenlétét az oldalról való
kijelentkezésig, melynek segítségével, többek között, könnyebben lehet az oldalon
navigáló felhasználó jogosultságait megállapítani. Majd beolvasódik a config.php és a
head.php is, amelyek az adatbázishoz való kapcsolódást, néhány általános függvényt és az
oldal fejlécének beállításait, illetve a stílusokat meghatározó CSS fájl beolvasását
tartalmazzák.
CONFIG.PHP
$sqlserver="localhost"; $sqlhost="intranet"; $sqlpassword="Gtu97lKj34"; $sqldb="laci"; $kapcsolat=@mysql_connect($sqlserver,$sqlhost,$sqlpassword); @mysql_select_db($sqldb); @mysql_query('SET NAMES utf8 COLLATE utf8_general_ci'); ...
Látható, hogy az adatbázishoz nem „root” felhasználóval kapcsolódunk, hanem „intranet”
felhasználóval, aminek az a biztonsági előnye, hogy ha valaki sikeresen feltörné az oldalt,
Saját fejlesztésű CMS létrehozása Kerepesi László
16
akkor az adatbázis kezelőhöz csak az „intranet” felhasználó jogosultságaival férhet hozzá,
nem pedig adminisztrátorként minden adatbázishoz, amit a szerver éppen tárol.
$sql_settings = 'SELECT * FROM `settings` LIMIT 1'; $query_settings=mysql_query($sql_settings); print mysql_error(); while($data_page=mysql_fetch_assoc($query_settings)) { if ($data_page['service']=='0') { print 'Sajnos az oldal eppen karbantartas alatt all. Megerteset koszonjuk.'; } else {
Az oldalnak van egy olyan funkciója, hogy ha valamilyen karbantartási műveletet hajtunk
végre, azt jelezni lehet a felhasználók számára egy rövid üzenettel. Amennyiben nem,
akkor megkeződik a fő oldal táblázatokra bontása. Az oldalunk a tervnek megfelelően 5
nagyobb részre lesz szétbontva: Logó, felső menüsor, baloldali menüsor, középső rész és a
jobb oldali menüsor.
Korábban már megkülönböztetnünk három módot, ahogyan hozzáférhetnek a felhasználók
az oldalhoz, ebből a háromból, egy magasabb szintű és kettő alacsonyabb szintű
hozzáférést különböztethetünk meg annak függvényében, hogy milyen menüpontok
lesznek számukra elérhetőek. Ezért két külön táblában tároljuk a „Sima felhasználók” és az
„Adminok” számára megjelenő adatokat,mint a „Főadmin” számára megjelenő adatokat.
Rögtön az elején az indexben el kell dönteni, hogy a felhasználó, milyen táblából fog
dolgozni:
if($_GET['mode'] == 'admin') //adatbázis kiválasztása { $db = 'admin_menus'; } else { $db = 'page'; }
Mindkét táblában az ALIGN a HREF és a PAGE mezők határozzák meg, hogy az oldalon
HOVÁ, MI és milyen MÓDBAN kerüljenek kiíratásra. (5. ábra)
5. ábra
Saját fejlesztésű CMS létrehozása Kerepesi László
17
Például az index módban a fenti bejegyzések alapján a Down menü balra, a News középre
és a Login menü jobbra fog kerülni, ami a böngészőben a következőképpen jelenik meg:
(6. ábra)
6. ábra
Ahogy azt láthattuk, minden egyes funkciónak külön php fájl felel meg, ami a HREF
mezőben található linkelt fájlból hívódik meg a táblázat megfelelő részébe.
3.2 Regisztrálás
Az egyik legfontosabb modul a login menü, ami a felhasználók azonosítására és
hitelesítésére szolgál. Ha még nincsen felhasználónevünk, akkor csak nézegetni tudunk a
rendszerben, semmilyen bejegyzést nem tudunk tenni. Regisztrálni magunkat a Login
menü alján lévő „regisztráljon” linkre kattintva lehet, ami meghívja a
D:\xampp\htdocs\reflex\login_system\reg.php –t az oldal közepére. Itt négy adatot
szükséges megadnunk és eltárolnunk változókba:
• Felhasználónév - $adatok[’nick’]
• E-mial cím - $adatok[’email’]
• Jelszó - $adatok[’pass1’]
• Jelszó mégegyszer - $adatok[’pass2’]
Ezeket természetesen ellenőrizni kell, mielőtt az adatbázisba bármilyen bejegyzést
tennénk:
function reg_check($adatok){ if($adatok['nick'] == "" | $adatok['email'] == "" | $adatok['pass1'] == "") { return '<div align="center" style="error"><span style="font-weight: bold;">Minden mező kitöltése kötelező!</div>';
Saját fejlesztésű CMS létrehozása Kerepesi László
18
break; }
Meg kell néznünk, hogy minden mező ki lett-e töltve. elseif(!ereg('^[a-zA-Z\-\_áéĂóöüóûà ÉÍÓÖÜÕÛ0123456789]+$', $adatok['nick' ])) { return '<div align="center" style="error"> <span style="font-weight: bold;">A felhasználónévben csak a magyar ABC kis- és nagybetűi, illetve a _ és - jelek engedélyezettek!</div>'; break; }
Meg kell néznünk, hogy a felhasználónév mező nem tartalmaz-e különleges nem engedélyezett karaktereket. elseif($adatok['email'] == (!eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,6}$",$adatok['email']))) { return '<div align="center" style="error"> <span style="font-weight: bold;">Hibás e - mail cím!</span></div>'; break; }
Meg kell győződnünk arról, hogy a mail cím helyes formátumban lett-e megadva. (Ezt a linux-ból is mert szabályos (reguláris) kifejezések segítségével tehetjük meg.) elseif(mysql_num_rows(mysql_query("SELECT nick FROM users WHERE (nick='".$adatok['nick']."')")) > 0) { return '<div align="center" style="error"> <span style="font-weight: bold;">Már regisztráltak ezzel a felhasználónévvel!</div>'; break; }
Meg kell győződnünk arról, hogy az adatbázis nem tartalmaz már egy ilyen felhasználónevet. elseif($adatok['pass1'] !== $adatok['pass2']) { return '<div align="center" style="error"> <span style="font-weight: bold;">A két jelszó nem egyezik meg!</div>'; break; }
Valamint, hogy a két beírt jelszó megegyezik. else { return "rendben"; } } Ha minden adatot helyesen megadott a felhasználó és azok megfeleltek a feltételeknek,
akkor a függvény értéke „rendben” lesz és bekerül a USER táblába egy INSERT INTO
paranccsal:
if (reg_check($_POST) == rendben) { $sql = "INSERT INTO users (id,nick,pass,email,host,regip,regtime) "; $sql.= "VALUES('','".$_POST['nick']."','"; $sql.= md5($_POST['pass1'].'laci')."','".$_POST['email']."','".$_SERVER['HTTP_HOST']."','".$_SERVER['REMOTE_ADDR']."','".time()."')"; $query = mysql_query($sql); if(!mysql_errno())
Saját fejlesztésű CMS létrehozása Kerepesi László
19
{ header('Location: index.php?page=reg&status=ok'); } else { header('Location: index.php?page=reg&status=no'); }
Ahogy az a kódban lehet látni (md5($_POST['pass1'].'laci')), a felhasználó jelszava már a
tároláskor MD5 algoritmussal lesz titkosítva, valamint minden regisztrált felhasználó
jelszavának a végéhez hozzáillesztjük a „laci” szót, ezzel is növelve a biztonságot. Ha
valaki megszerzi a felhasználó jelszavát, és betitkosítja, mert azt is tudja, hogy MD5-el
vannak az oldalon a jelszavak titkosítva, akkor sem egyezik meg a két HASH mert a
támadó próbálkozásához nincs hozzáfűzve a „laci” szó. Ám erre a későbbiekben a
jelszómódosításnál, illetve az admin módban való jelszóadásnál oda kell-e figyelni.
A felhasználónév és a jelszó mellett még a SERVER['HTTP_HOST']." és a
".$_SERVER['REMOTE_ADDR']." változók, valamint az aktuális idő is tárolva lesznek a
felhasználóhoz tartozó rekordban. Minden felhasználóról a következő adatokat tároljuk az
adatbázisban: (7. ábra)
7. ábra
Regisztrálás után (mivel sem az „ADMIN” sem az „ADMINF” mező nem kapott értéket)
az új user „Sima felhasználó”-nak lesz rangsorolva.
Észre vehető, hogy a REGTIME mezőben leírt dátum a „time()” függvény eredménye,
melyet kiíratáskor a CONFIG.PHP-ben található „datum()” függvénnyel alakítunk át:
function datum($time) { $ma = mktime(0, 0, 0, date("m"), date("d"), date("Y")); $tegnap = $ma-(60*60*24); if($time > $ma && $time < $ma + 24*60*60) { $datum = "Ma, " . date("H:i",$time); } elseif($ma > $time AND $time > $tegnap) { $datum = "Tegnap, " . date("H:i",$time); } else { $datum = date("Y.m.d. H:i",$time); } return $datum; }
Saját fejlesztésű CMS létrehozása Kerepesi László
20
Előfordulhat, hogy valamelyik felhasználót ki szeretnénk tiltani a rendszer használatából
valamilyen oknál fogva. Két szempont alapján lehet ezt megtennünk:
• felhasználói név
• regisztrációnál letárolt ip cím
A tiltás műveletet csak Főadmin jogosultsággal lehet végrehajtani. Azáltal, hogy a usert
felvesszük a tiltó listára, mely a BANNLIST nevű táblában van nyilvántartva. Ezekről, az
adminisztrációs műveletekről később még esik szó.
3.3 Login
Most, hogy megismertük a regisztrációt, és a tiltásokat, nézzük meg, hogy hogyan épül fel
a Login folyamat. Ez a modul a D:\xampp\htdocs\reflex\login_system\login.php –ben van
megvalósítva. Az elején létre hozunk egy login osztályt és beállítjuk a belső változóit:
class login { var $nick; var $pass; var $true; var $bann; var $bann_nick; var $bann_ip; function login() { $this->nick = $_POST['nick']; $this->pass = $_POST['pass'].'laci'; $this->true = 1;
Ezután jöhetnek az ellenőrzések:
$sql_bann="SELECT * FROM `bannlist` WHERE `nick`='".$_POST['nick']."' OR `ip`='".$_SERVER['REMOTE_ADDR']."'"; $query_bann=mysql_query($sql_bann); if(mysql_num_rows($query_bann)) { $this->bann_nick = true; $_SESSION['bann'] = true; $sql_comment="SELECT * FROM `bannlist` WHERE `nick`='".$_POST['nick']."' OR `ip`='".$_SERVER['REMOTE_ADDR']."'"; $query_comment=mysql_query($sql_comment); while($banncomment=mysql_fetch_assoc($query_comment)) { ?> <script language="javascript"> alert('Sajnáljuk de az oldalról letiltottunk.\nA leiltás oka: <?= $banncomment['comment'] ?>'); </script> <? } } Ezt a programrész mindenekelőtt megnézi, hogy a felhasználó neve vagy az IP címe
rajtavan-e a tiltó listán, ha nincs, továbbmegy.
Saját fejlesztésű CMS létrehozása Kerepesi László
21
$sql = "SELECT * FROM `users` WHERE pass='".md5($this->pass)."' AND nick='".mysql_real_escape_string($this->nick)."'"; $query = mysql_query($sql) or die('<div align="center" class="error">Az ellenorzĂ©s során hiba lĂ©pett fel!</div>' ); if(mysql_num_rows($query) > 0) { Majd ellenőrzi, hogy a megadott jelszónak a HASH-e szerepel-e az adatbázisban és, ha
igen, akkor megfelel-e hozzá a felhasználónév is. Azért először a jelszót ellenőrizzük, mert
azt nehezebb próbálgatással eltalálni és így a WHERE feltételnek már rögtön az első része
nem teljesül, így nem vizsgálja meg a második feltételt sem (gyorsabb a kiértékelés). Az
mysql_real_escape_string() függvény, pedig kivesz mindenféle speciális karaktert a
felhasználónévből, nehogy SQL injection támadás áldozataivá váljunk.
Ha a megadott felhasználónév, jelszó páros megegyezik az adatbázisban tárolttal, akkor
elkezdődik a SESSION változók beállítása:
$_SESSION['nick'] = addslashes($this->nick); $_SESSION['login'] = true; $user_azonosito=mysql_query("$sql"); while ($user=mysql_fetch_assoc($user_azonosito)) if($user['adminf'] == $this->true) { $_SESSION['rang'] = "Adminf"; $_SESSION['bann'] = 0; $_SESSION['id'] = $user['id']; } elseif($user['admin'] == $this->true) { $_SESSION['rang'] = "Admin"; $_SESSION['bann'] = 0; $_SESSION['id'] = $user['id']; } else { $_SESSION['rang'] = "Sima felhasználó"; $_SESSION['id'] = $user['id']; }
Az addslashes() megtisztítja felhasználónevet a speciális karakterektől, hogy az kerüljön a
session változóba. Most már rendelkezünk SESSION változókkal, amelyekre a program
futása során bárhol hivatkozhatunk a kijelentkezésig. Ezek a változók kulcs szerepet
játszanak a jogosultsági feltételekben.
if($_GET['page'] != "logout") { header('Location:'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']); }
Ezzel visszairányítjuk az oldalt arra a modulra, ahonnan érkezett, immár bejelentkezve.
else { header('Location: index.php?page=index'); }
A kijelentkezett felhasználót ismét a főoldalra lesz irányítva
Saját fejlesztésű CMS létrehozása Kerepesi László
22
} else { print '<br><div align="center" class="error">Hiba! Rossz felhasználó név vagy jelszó!</div>'; } }
Végül, ha a felhasználónév jelszó páros nem egyezett meg, akkor egy hibaüzenet értesíti a
felhasználót, hogy a bejelentkezési folyamat nem sikerült.
Most, hogy a SESSION változók már élnek a jogosultságoknak megfelelően lehet kiíratni
a login menü elemeit:
if($_SESSION['login'] == true) { print 'Üdv '.$_SESSION['nick'].'!'.'<br>'; print 'Jogosultság:'.$_SESSION['rang'].'<br>'; if($_SESSION['rang'] == 'Adminf') { print '<a href="index.php?mode=admin&page=admin_menu">Adminisztráció</a><br>'; print '<a href="index.php?page=taglist">Felhasználók listája</a><br>'; } if($_SESSION['rang'] == 'Admin') { print '<a href="index.php?page=taglist"> Felhasználók listája</a><br>'; } print '<a href="index.php?page=profil&id='.$_SESSION['id'].'">Profil</a><br>'; print '<a href="index.php?page=user_edit">Adatmódodítás</a><br>'; print '<a href="index.php?page=logout">Kijelentkezés</a>'; } A megfelelő linkek átnavigálják a felhasználót a középső részben megjelenő kisebb -
nagyobb adminisztratív feladatok ellátására melyet, mindenki saját jogosultságának
megfelelően megtehet, vagy sem. Ezeket a funkciókat, még később érinteni fogjuk.
A login folyamat párja a logout, mely során kiléptetjük a felhasználót az oldalról és az
összes rá vonatkozó session változót megszüntetjük. Ez a következőképpen megy végbe:
<?php unset($_SESSION['login']); unset($_SESSION['nick']); unset($_SESSION['id']); unset($_SESSION['rang']); unset($_SESSION['bann']); print '<div align="center" style="ok">Sikeresen kiléptél</div>'; ?>
Ezen két technikai művelet után rátérhetünk az oldal funkcionális részeire, úgyismint:
Hírek, Galéria és Fórum.
3.4 Hírek
Elsőként a Hírek modult szeretném bemutatni, ami arra szolgál, hogy egy jogosult
felhasználó a vállalat miden napjait érintő információkat tehessen közzé a belső portálon.
Saját fejlesztésű CMS létrehozása Kerepesi László
23
A híreknek két módja van az egyik a hír olvasása, amelyet mindenki meg tud tenni, tehát
akár belépés nélkül vagy „Sima felhasználó” jogkörben is meg tudunk tenni, a másik a
szerkesztő mód, amelyhez szükséges a bejelentkezés és legalább az „Admin” jogkör.
Ahhoz, hogy megértsük a modul működését, jó, ha átlátjuk az NEWS tábla felépítését: (8.
ábra)
8. ábra
A Hír olvasása a következő módon történik:
<? class news_index {var $id; var $title; var $text; var $from; var $from_id; var $time;
A belső változók létrehozása. function news($news_id) ... <? if($_GET['mode'] == 'all_news') {$sql_news="SELECT * FROM `news` WHERE id='".$news_id."' ORDER BY time"; } else {$sql_news="SELECT * FROM `news` ORDER BY time DESC LIMIT 1"; }
A lekérdezés kiválasztása, hogy csak az utolsó hírt lássuk, vagy az összest. $query_news=mysql_query($sql_news); while($news_data=mysql_fetch_assoc($query_news)) {$this->id = $news_data['id']; $this->title = $news_data['title']; $this->text = $news_data['text']; $this->from = $news_data['from']; $this->from_id = $news_data['from_id']; $this->time = $news_data['time']; ?>
A változók feltöltése a lekérdezésből. <table width="100%" border="0" align="center"> <tr> <td width="75%" class="cmenu_bg"><?= html_entity_decode($this->title) ?></td> <td width="25%" class="cmenu_bg"><div align="right"><?= datum($this->time) ?></div></td> </tr> <tr> <td colspan="2" class="cmenu_bg"><?= html_entity_decode($this->text) ?></td> </tr> <tr>
Saját fejlesztésű CMS létrehozása Kerepesi László
24
<td colspan="2" class="cmenu_bg">A hírt küldte: <?= html_entity_decode($this->from) ?></td> </tr> <tr> <td colspan="2" class="cmenu_bg"><div align="right"><a href="index.php?page=news&mode=all_news">Összes</a> <?if($_SESSION['rang'] == "Admin" OR $_SESSION['rang'] == "Adminf") { print '| <a href="index.php?mode=admin&page=news&news_mode=news_confirm&confirm_page=confirm&news_id='.$this->id.'">Modosítás</a>'; } if($_SESSION['rang'] == "Adminf") { print '| <a href="index.php?mode=admin&page=news&news_mode=news_remove&id='.$this->id.'">Törlés</a>'; } ?> </div></td> </table> <? } ?>
Ebben a részben történik a változók táblázatba való kiíratása, ami magát hírt szövegét is
tartalmazza a $this->text változóban. A html_entity_decode() függvény arra szolgál, hogy az
adatbázisban tárolt szövegben elhelyezkedő ékezetes karaktereket, visszakódolja
számunkra is olvasható ékezetes betűkké. Ha az olvasó „Admin”, akkor az ”Összes” link
mellett, a „Módosítás”, ha „Főadmin”, akkor a „Törlés” link is feltűnik, melyek
átirányítanak a szerkesztő oldalra.
A szerkesztő oldalon két funkció érhető el az „Admin” jogosultságú felhasználóknak ezek:
Új hír küldése, korábbi hír módosítása, valamint a törlés a „Főadmin” számára.
<? class news { var $title; var $text; function news_send() { ...
A program első része kirajzolja a form beviteli mezejét, létrehozza a $text és $title
változókat és megjeleníti a Küldés gombot. Majd kezdődnek az ellenőrzések, hogy
mindent helyesen töltöttünk-e ki:
<? if($_POST['send']) { if($_POST['title']) { if($_POST['text']) { $sql_new_news="INSERT INTO `news` (`title`, `text`, `from`, `time`) VALUES ('".addslashes(htmlentities($_POST['title']))."', '".addslashes(htmlentities($_POST['text']))."',
Saját fejlesztésű CMS létrehozása Kerepesi László
25
'".addslashes(htmlentities($_SESSION['nick']))."', '".time()."')"; mysql_query($sql_new_news);
Ha minden ki lett töltve helyesen, akkor új bejegyzés kerül az adatbázisba, figyelve az
esetleges támadások ellenei védelemre.
A törléskor, a már fentebb említett linkre kattintva az alábbi programrész hívódik meg:
if($_GET['id'] AND $_SESSION['rang']=='Adminf') { $sql_remove_news="DELETE FROM `news` WHERE `id`='".$_GET['id']."' "; $query_remove_news=mysql_query($sql_remove_news); ... } A módosítás funkció form-ja és kódja nagyon hasonlít az új hír bevitelekor használt form-
hoz és kódhoz, szinte csak az SQL parancsban különböznek egymástól:
$sql_update="UPDATE `laci`.`news` SET `news`.`title`='".addslashes(htmlentities($_POST['title']))."', `news`.`text`='".addslashes(htmlentities($_POST['text']))."' WHERE `news`.`id`='".$_GET['news_id']."'"; mysql_query($sql_update);
Továbbra is ki kell emelni, hogy a felhasználó által beírt minden egyes adatot meg kell
„tisztítani” az addslashes(htmlentities()) függvényekkel, nehogy SQL parancsokat illesszenek
be és ezzel megtámadják a MySQL szervert.
3.5 Galéria
A következőkben a Galéria modul működését szeretném bemutatni, melynek célja, hogy az
arra jogosult kiemelt felhasználók könnyedén tudjanak kategóriákba sorolva képeket
megosztani a munkahelyi portálon.
A legfontosabb fájl a D:\xampp\htdocs\reflex\plugins\gallery\pictures.php, amely a képtár
működéséhez szükséges programkódot tartalmazza.
A D:\xampp\htdocs\reflex\plugins\gallery\pic\ könyvtárból nyíló, a kategória „id”-nak
megfelelő mappába kerülnek, a feltöltött fájlok.
Az adatbázisban, két táblában valósul meg a képek neveinek és hivatkozásainak, illetve a
kategóriáknak a tárolása. Az egyik a GALLERY_CAT a másik a GALLERY_FILES.
Nézzük, hogy épülnek föl ezek a táblák:
GALLERY_CAT: itt tárolódnak a kategóriák nevei és a könyvtárak elérési útjai. (9. ábra)
9. ábra
Saját fejlesztésű CMS létrehozása Kerepesi László
26
GALLERY_FILES: ebben tárolódnak a fájlok nevei és az elérési útjaik. (10. ábra)
10. ábra
A két tábla a gallery_cat.gallery_cat_id és a gallery_file.gall_id mezők alapján vannak
összekapcsolva 1:N típusú kapcsolattal. A képtár használatakor mindkét táblán kell
lekérdezéseket futtatni.
Galéria kezdőlapján felsoroljuk a már létrehozott kategóriákat – melyekből linket
készítünk – és, hogy hány darab kép van bennük.
function gallery_cat() { $sql_cat="SELECT * FROM `gallery_cat`"; $query_cat=mysql_query($sql_cat); ?> <table width="100%" border="0" cellspacing="0" cellpadding="0" align="center" class="table_down"> <tr> <td class="cmenu_bg"><div align="center">Kategória neve</div></td> <td class="cmenu_bg"><div align="center">Képek száma</div></td> </tr> <? while($cat=mysql_fetch_assoc($query_cat)) { ?> <tr> <td class="cmenu_bg"><div align="center"><a href="index.php?page=gallery&mode=gallery_page&cat_id=<?= $cat['gallery_cat_id'] ?>"><?= $cat['cat_title'] ?></div></td> <td class="cmenu_bg"> <? $sql_pic_num=mysql_query("SELECT COUNT( * ) AS picture_num FROM `gallery_files` WHERE gall_id=".$cat['gallery_cat_id'] ); $pic_num=mysql_fetch_assoc($sql_pic_num); ?> <div align="center"><?print $pic_num['picture_num']; ?> </div></td> ...
Ezek után, a számunkra szimpatikus kategória linkjére kattintva megtekinthetjük a képek
miniatűrjeit.
function gallery_page() { ?> <table width="100%" border="0" cellspacing="0" cellpadding="0" align="center"> <? $sql_recnum="SELECT COUNT(`id`) FROM `gallery_files` WHERE `gall_id` = '".$_GET['cat_id']."'"; $query_recnum=mysql_query($sql_recnum);
Saját fejlesztésű CMS létrehozása Kerepesi László
27
$recnum=end(mysql_fetch_row($query_recnum)); mysql_free_result($query_recnum);
Ez a lekérdezés az oldalszámozó függvénynek olvassa ki, hogy hány kép van az adott
kategóriában.
$pnum=new pagenumbers; $pnum->set($_GET['page_num'],$recnum); $sql_page="SELECT * FROM `gallery_files` WHERE `gall_id` = '".$_GET['cat_id']."'".$pnum->mysql_limit_string; $sql_path="SELECT `href` FROM `gallery_cat` WHERE `gallery_cat_id` = '".$_GET['cat_id']."'"; $query_path=mysql_query($sql_path); $query_page=mysql_query($sql_page); $path=mysql_fetch_assoc($query_path);
A lekérdezések a képek megjelenítéséhez. $i=2; while($file=mysql_fetch_assoc($query_page)) { $pictures=$file['file_name']; $ext = end(explode('.',$pictures)); $pictures = basename($pictures,'.'.$ext); $pictures =$pictures.'.'.$ext.'_th.jpeg';
A két nevének és kiterjesztésének szétválasztása a linkekhez. print ($i % 4 == 1) ? '<tr>' : ''; print '<td class="cmenu_bg"><a href="'.$path['href'].$file['file_name'].'" target="_blank"><img src="'.$path['href'].'th/'.$pictures.'" border="0" width="150" hight="150"></a>';
A miniatűr kép beillesztése linkként. if($_SESSION['rang'] == "Admin" OR $_SESSION['rang'] == "Adminf") { print '<div align="center"><a href="index.php?page=gallery&mode=pictures&id='.$file['id'].'&mode=delete">[Törlés]</a></div>'; } print '</td>'; print ($i % 4 == 0) ? '</tr>' : ''; $i++; } ?>
A „Törlés” linkek beillesztése „Admin” és „Főadmin” jogosultságúak számára.
Tehát, ezzel a folyamattal ki tudjuk listázni a képek miniatűrjeit, és ha a felhasználó rájuk
kattint, akkor egy új ablakban megjelennek azok, eredeti méretükben.
Ahhoz, hogy képeket tudjunk feltölteni, először kategóriákat kell létrehozni:
function gall_cat_add() { ... if($_POST['send']) { $sql_cat_add="INSERT INTO `gallery_cat` (`cat_title`) VALUES ('".$_POST['cat_name']."')"; $query_cat=mysql_query($sql_cat_add); if(mysql_errno()) { print mysql_error(); }
Beillesztjük a gallery_cat táblába az új kategória nevet.
Saját fejlesztésű CMS létrehozása Kerepesi László
28
else { $id=mysql_insert_id(); // utolsó ID $dirname="plugins/gallery/pic/".$id."/"; $sql_cat_set_href="UPDATE `gallery_cat` SET `href` = '".$dirname."' WHERE `gallery_cat_id`='".$id."'";
Majd módosítjuk a href mezőbe a könyvtár nevét, ahova a kategóriába tartozó képek
kerülnek majd.
$query_cat_href=mysql_query($sql_cat_set_href) if(mysql_errno()) { print mysql_error(); } else { if(mkdir($dirname) && mkdir($dirname.'th/')) { ?> <div align="center" class="ok">A kategória létre lett hozva.</div> <? }
Végül megpróbálja létrehozni a kategóia könyvtárait, és ha sikerül, akkor biztosítja a
felhasználót a művelet sikeréről.
Most nézzük meg a kép feltöltés folyamatát!
function picture_upload() $sql_upload_image_cat="SELECT * FROM `gallery_cat`"; $query_upload_image_cat=mysql_query($sql_upload_image_cat); ?> ... <select name="cat_list" size="1"> <? while($cat_set=mysql_fetch_assoc($query_upload_image_cat)) { ?> <option selected value="<?= $cat_set['gallery_cat_id'] ?>"><?= $cat_set['cat_title'] ?></option> <? }?> </select>
A feltöltendő képeket a már meglévő kategóriákból kiválasztva lehet majd beszúrni a
gallery_file táblába, innen tudjuk, hogy melyik kategóriába tartozik.
... <input type="hidden" name="MAX_FILE_SIZE" value="30000000">
A feltöltendő kép max méretének beállítása bájtokban.
... if($_POST['send']) { $sql_upload_image_href="SELECT * FROM `gallery_cat` WHERE `gallery_cat_id` = '".$_POST['cat_list']."'"; $query_input_href=mysql_query($sql_upload_image_href); $image_href=mysql_fetch_assoc($query_input_href); $filename=$_FILES['up_file']['name']; $tempname=$_FILES['up_file']['tmp_name']; $up_file_size=$_FILES['up_file']['size']; $dirname=$image_href['href'];
Saját fejlesztésű CMS létrehozása Kerepesi László
29
A szükséges változók beállítása, mint például, hogy milyen href hivatkozás kerüljön a
táblába a „HREF” mezőbe.
if (!in_array( end(explode('.',$filename)) , array('jpg','jpeg','bmp','png','gif','JPG','JPEG','BMP','PNG','GIF') )) { print '<div align="center" class="error">Hiba! Csak jpg, bmp, png és gif állományok feltültése engedélyezett.</div>'; return; }
A kiterjesztések vizsgálata, hogy biztos, hogy megjeleníthető képformátumot tölthessenek
fel. Ha nem kép formátum a kiterjesztés, akkor hibaüzenetet jelenít meg, ha viszont
megfelel, akkor beindul a feltöltendő fájl új nevének generátora, hogy biztos legyen, hogy
egyedi neve lesz a feltöltött fájlnak. Ez több lépésből tevődik össze:
else {
Beállítjuk a véletlen szám generátort, hogy 0-9 között generáljon számokat.
$chars = array_merge(array('gall_'),range(0,9)); @srand((double) microtime() * 1000000);
Majd elkezdődik a prefix összeállítása:
do { $prefix_id = array_rand($chars,8); $prefix = ''; foreach($prefix_id as $key=>$id) {$prefix .= $chars[$id]; } $prefix .= '_'; $type = end(explode('.',$filename)); $name = basename($filename); $new_name = $prefix.preg_replace('/([^a-z0-9.,_])/i','_',$name); $new_name .= '.'.$type; } while(file_exists($upload_dir.'/'.$new_name));
Ha a generált fájlnév szerepel már a célkönyvtárban, akkor újragenerálja, ha még nem,
akkor továbbmegy és elvégzi a fájlműveleteket.
$movie=move_uploaded_file($tempname,$dirname.$new_name); $filename=$new_name; if($movie) { $sql_input_up_pic="INSERT INTO `gallery_files` (`gall_id`, `file_name`, `href`) VALUES ('".$_POST['cat_list']."', '".$filename."', '".$dirname."')"; $query_i_u_f=mysql_query($sql_input_up_pic);
Amennyiben sikerült a fájlt a célkönyvtárba helyezni, akkor be is illesztjük az új rekordot a
gallery_files táblába. Esetlegesen a felmerülő hiba esetén, üzenetet küldünk a
felhasználónak, hogy tudja, melyik műveletnél akadt el a feltöltés.
Kép törlése a képtárból a következőképpen történik:
function delete_image() { $sql_delete="SELECT * FROM `gallery_files` WHERE `id`='".$_GET['id']."'"; $query_delete=mysql_query($sql_delete); $del=mysql_fetch_assoc($query_delete);
Saját fejlesztésű CMS létrehozása Kerepesi László
30
$pictures=$del['file_name']; $ext = end(explode('.',$pictures)); $pictures = basename($pictures,'.'.$ext); $pictures =$pictures.'.'.$ext.'_th.jpeg'; $delete = unlink($del['href'].$del['file_name']); $delete_th = unlink($del['href']."th/".$pictures);
A kép adatainak kiolvasása a táblából és törlése fizikailag a fájlrendszerből.
if($delete AND $delete_th) { $sql_remove="DELETE FROM `gallery_files` WHERE `id` = '".$_GET['id']."'"; $query_remove=mysql_query($sql_remove);
Ha a képet és a miniatűrt is sikeresen töröltük, akkor az adatbázisból is törölni kell a rá
volnatkozó rekordot, majd a művelet kimeneteléről értesítjük a felhasználót.
3.6 Fórum
A következőkben az oldalon szereplő fórumot szeretném bemutatni. A fórum a vállalat
életében megvalósíthatja a kommunikációt a dolgozók és a vezetők között. A fórum
témáihoz, csak bejelentkezet felhasználóknak van lehetősége hozzászólni, hogy nevesítve
legyenek a vélemények, a válaszok, valamint azok időpontjai is.
Teremészetesen a fórum is MySQL táblákat használ:
FORUM_TOPICS: ebben tárolódnak a témák (11. ábra)
11. ábra
FORUM_HSZ: ebben tárolódnak a témákhoz való hozzászólások (12. ábra)
12. ábra
A két táblát a forum_topic.topic_id és a forum_hsz.topic_id mezőkön keresztül kapcsoljuk
össze 1:N kapcsolattal.
Mindenekelőtt témaköröket kell létrehozni, hogy aztán hozzászólásokat tudjunk hozzájuk
fűzni. Ezt a következő függvénnyel tehetjük meg:
function topic_add_and_edit($mode) { if($mode == "edit")
Saját fejlesztésű CMS létrehozása Kerepesi László
31
{ $sql_edit_topic="SELECT * FROM `forum_topics` WHERE `topic_id` = '".$_GET['topic_id']."'"; $query_edit_topic=mysql_query($sql_edit_topic); $topic_edit=mysql_fetch_assoc($query_edit_topic); } ... if($_POST['send']) { if($mode == "edit") { $topic_title=mysql_real_escape_string($_POST['new_topic']); $sql_new_topic="UPDATE `forum_topics` SET `topic_title` = '".$topic_title."' WHERE `topic_id` = '".$_GET['topic_id']."'"; $query_sql=mysql_query($sql_new_topic); } else { $topic_title=mysql_real_escape_string($_POST['new_topic']); $sql_new_topic="INSERT INTO `forum_topics` (`topic_title`) VALUES ('".$topic_title."')"; $query_sql=mysql_query($sql_new_topic); }
Ha a szerkesztő módban hívják meg a metódust, akkor módosítja a kiválasztott témakör
nevét, ha nem, akkor csak létrehozza az új bejegyzést a „forum_topics” táblába.
A kezdő oldal, amivel a felhasználó először találkozik az a fórum témáinak a listája:
function topic_list() { ?> <table align="center" width="100%" cellpadding="0" cellspacing="0" border="0"> <tr> <td class="cmenu_bg" width="50%">Téma</td> <td class="cmenu_bg" width="25%"><div align="center">Hozzászólások száma</div></td> <td class="cmenu_bg" width="25%"><div align="center">Utolsó hozzászóló</div></td> </tr> <? $sql_topic_list="SELECT * FROM `forum_topics`"; $query_list=mysql_query($sql_topic_list); while($topics=mysql_fetch_assoc($query_list)) { $sql_hsz_numb="SELECT COUNT( * ) AS hsz_numb FROM `forum_hsz` WHERE `topic_id`='".$topics['topic_id']."'"; $sql_old_user="SELECT * FROM `forum_hsz` WHERE `topic_id`=".$topics['topic_id']." ORDER BY `date` DESC LIMIT 1"; $query_numb=mysql_query($sql_hsz_numb); $query_user=mysql_query($sql_old_user); $numb=mysql_fetch_assoc($query_numb); $old_user=mysql_fetch_assoc($query_user); ?> <tr> <td class="cmenu_bg" width="50%"> <div> <a href="index.php?page=forum&mode=hsz_read&topic_id=<?= $topics['topic_id'] ?>"> <?= htmlspecialchars($topics['topic_title']) ?></a> </div>
Táblázatos formában kiíratjuk a témákat, úgy hogy közben linkeket formálunk belőle.
<? if($_SESSION['rang'] == "Adminf" OR $_SESSION['rang'] == "Admin") {
Saját fejlesztésű CMS létrehozása Kerepesi László
32
?> <div align="left" style="margin-left:5px;" <font size="1"><a href="index.php?page=forum&mode=topic_edit&topic_id=<?= $topics['topic_id'] ?>">Szerkeztés</a> | <? if($_SESSION['rang'] == "Adminf") { ?> <a href="index.php?page=forum&mode=topic_delete&topic_id=<?= $topics['topic_id'] ?>">Törlés</a></font> </div> ...
Ha a bejelentkezett felhasználó rendelkezik magasabb jogosultságokkal, akkor megjelenik
számára a „Szerkesztés” funkció linkje, illetve Főadmin esetén még a „Törlés” is.
<td class="cmenu_bg" width="25%"><div align="center"><?= $numb['hsz_numb'] ?></div></td> <td class="cmenu_bg" width="25%"><div align="center"><a href="index.php?page=profil&mode=see&id=<?= $old_user['from_id'] ?>"> <?= $old_user['from'] ?></a></div></td>
A megfelelő oszlopba kiíratjuk a témához tartozó, már korábban küldött hozzászólások
számát, illetve az utolsó hozzászólást küldő felhasználó nevét.
Amikor valaki rákattint a számára szimpatikus témára, akkor megnyílik a témakörhoz
tartozó összes már korábban tárolt hozzászólás. Ehhez a hsz_read() metódust használjuk.
function hsz_read() { $sql_read="SELECT * FROM `forum_hsz` WHERE `topic_id`='".$_GET['topic_id']."' AND `recent_hsz_id` = '0' ORDER BY `date` DESC"; $query_read=mysql_query($sql_read);
Kilistázzuk a témához tartozó összes hozzászólást, időrendi sorrendben fordítva.
if($_SESSION['login']) { ?> <div align="center"><a href="index.php?page=forum&mode=hsz_add&topic_id=<?= $_GET['topic_id'] ?>">Hozzászólás küldése</a></div> <? } else { print '<div align="center" class="error">Hiba! Jelenkezzen be, ha hozzászólást kíván küldeni. </div>'; }
Ha be vagyunk jelentkezve, akkor megjeleni a link a „Hozzászólás küldése”-ről szóló link
ellenben figyelmeztetés, hogy jelentkezzen be a felhasználó.
while($hsz_data=mysql_fetch_assoc($query_read)) { ?> <table align="center" width="100%" cellpadding="0" cellspacing="0" border="0" class="forum_hsz_table"> <tr> <td width="35%"><b><?= htmlspecialchars($hsz_data['from']) ?></b></td> <td colspan="2" width="65%"><div align="right"><?= datum($hsz_data['date']) ?></div></td> </tr> <tr> <td colspan="3" width="100%"> <?= htmlspecialchars($hsz_data['hsz']) ?>
Saját fejlesztésű CMS létrehozása Kerepesi László
33
<? $sql_replace="SELECT * FROM `forum_hsz` WHERE `recent_hsz_id` = '".$hsz_data['id']."'"; $query_replace=mysql_query($sql_replace); if(mysql_num_rows($query_replace) > 0) { while($replace=mysql_fetch_assoc($query_replace)) { ?> <table align="left" width="100%" cellpadding="0" cellspacing="0" border="0" class="forum_hsz_replace_table"> <tr> <td><?= htmlspecialchars($replace['hsz']) ?></td> </tr> </table> <?
Majd kilistázzuk a felhasználó nevét, a hozzászólás dátumát, magát a hozzászólásokat és a
hozzászólásra érkezett választ, az utóbbit eltérő CSS beállításokkal.
... <a href="index.php?page=forum&mode=hsz_edit&hsz_id=<?= $hsz_data['id'] ?>&topic_id=<?= $_GET['topic_id'] ?>">Szerkeztés</a> | <? if($_SESSION['rang'] == 'Admin' OR $_SESSION['rang'] == 'Adminf') { ?> <a href="index.php?page=forum&mode=hsz_replace&topic_id=<?= $_GET['topic_id'] ?>&hsz_id=<?= $hsz_data['id'] ?>">Válasz</a> | <? if($_SESSION['rang'] == 'Adminf') { ?> <a href="index.php?page=forum&mode=hsz_delete&hsz_id=<?= $hsz_data['id'] ?>">Törlés</a> <? } } ?>
Mindenki tudja szerkeszteni a saját hozzászólását, és lehetőség van az „Admin” és
„Főadmin” jogosultsággal rendelkező felhasználóknak „Válasz” írására is, de
hozzászólásokat, csak a „Főadmin” tud törölni.
A hozzászólások a szerkesztése a következő módon történik:
function hsz_edit()
{...
if($_SESSION['id'] == $edit['from_id'] OR $_SESSION['rang'] == "Adminf") {...
Ha van jogunk a hozzászólást szerkeszteni (saját hozzászólásunk vagy „Főadmin” jogunk
van), akkor tovább megy, és a már korábban megadott adatokat (...) rögzíti az
adatbázisban:
if($_POST['send']) { $hsz_edited=mysql_real_escape_string($_POST['edit_hsz']);
Saját fejlesztésű CMS létrehozása Kerepesi László
34
$sql_edit="UPDATE `forum_hsz` SET `hsz` = '".$hsz_edited."' WHERE `id`='".$_GET['hsz_id']."'"; $query_edit=mysql_query($sql_edit);
Választ a hsz_add() függvényen keresztül adhatunk.
function hsz_add($mode) { ... if($_POST['send']) { if($mode="replace") { $hsz=mysql_real_escape_string($_POST['new_hsz']); $sql_input_hsz="INSERT INTO `forum_hsz` (`topic_id`,`hsz`,`from`,from_id,`date`, `recent_hsz_id`) VALUES ('".$_GET['topic_id']."','".$hsz."','".$_SESSION['nick']."','".$_SESSION['id']."','".time()."','".$_GET['hsz_id']."')"; $query_input=mysql_query($sql_input_hsz); } else { $sql_input_hsz="INSERT INTO `forum_hsz` (`topic_id`,`hsz`,`from`,`date`) VALUES ('".$_GET['topic_id']."','".$hsz."','".$_SESSION['nick']."', '".time()."')"; $query_input=mysql_query($sql_input_hsz); }
Ha választ írunk, akkor a „recent_hsz_id” mező is ki lesz töltve a rekordban, ha csak sima
hozzászólás, akkor erre a bejegyzésre nincs szükség, és e nélkül rögzítődik az új rekord.
A hozzászólás törlése csak a Főadmin privilégiuma:
function hsz_delete() { if($_SESSION['rang'] == "Adminf") { $sql_delete="DELETE FROM `forum_hsz` WHERE `id`='".$_GET['hsz_id']."'"; $query_delete=mysql_query($sql_delete); } }
A témakör törlése ugyancsak a Főadmin privilégiuma:
function topic_delete() { if($_SESSION['rang'] == "Adminf") { $sql_delete="DELETE FROM `forum_topics` WHERE `topic_id` = '".$_GET['topic_id']."'"; $query_delete=mysql_query($sql_delete); ... } else { print '<div align="center" class="error">Témát törölni csak a Főadmin tud.</div>'; } }
Ezzel be is fejeződtek a funkcionális modulok (Hírek, Galéria, Fórum) bemutatásai. Jöjjön
tehát az a modul, amelyet csak a Főadmin joggal érhető el!
Saját fejlesztésű CMS létrehozása Kerepesi László
35
3.7 Adminisztráció
A Főadminisztrátor munkáját megkönnyítve, minden felhasználónak lehetősége van saját
adatainak (e-mail cím, jelszó) megváltoztatására
function data_set() { $sql_set="UPDATE users SET email='".addslashes(htmlentities($_POST['email']))."', WHERE id='".$_SESSION['id']."'"; $query_set=mysql_query($sql_set); ... } function new_pass() { if($_POST['pass1'] === $_POST['pass2']) { $sql = "UPDATE `users` SET `jelszo` = '".md5($_POST['pass1'].'laci')."' WHERE id='".$_SESSION['id']."'"; mysql_query($sql); print '<div align="center" style="ok">A jelszavad sikeresen megváltoztattuk!</div>'; } else { print '<div align="center" style="error">A két jelszó nem eggyezik!</div>'; } }
Az e-mail címét és a jelszavát ezzel a két függvénnyel állíthatja be magának a felhasználó
A „Főadmin”-nak is van lehetősége a felhasználók adatainak a változtatására a
D:\xampp\htdocs\reflex\admin\users.php segítségével.
Itt lehetőség van a Név, E-mail cím, Rang illetve a Tiló listán való szereplés módosítására
is. Az utóbbi a következő SQL parancsokkal tehetjük meg:
if($_POST['bann_add']) { $sql_bann_add="INSERT INTO `bannlist` (`user_id`,`nick`,`ip`,`banntime`,`comment`) VALUES ('".$this->id."','".$this->nick."','".$this->regip."', '".time()."', '".$_POST['bann_comment']."')"; $query_bann_add=mysql_query($sql_bann_add); ... } if($_POST['bann_remove']) { $sql_bann_remove="DELETE FROM `bannlist` WHERE nick='".$this->nick."'"; $query_bann_remove=mysql_query($sql_bann_remove); ... }
Továbbá a „Főadmin” a beépülő program modulokat is menedzselheti a Plugin kezelőben.
Itt lehet megadni, hogy az egyes modulok, hogyan szerepeljenek a PAGE táblában,
ahonnan az INDEX.PHP kiolvassa a hivatkozásokat, mikor felépíti az oldalt. Ezen eszköz
segítségével, egyszerűen lehet beilleszteni új modulokat, különösebb programozói tudás
nélkül is.
Saját fejlesztésű CMS létrehozása Kerepesi László
36
A Plugin kezelő oldal tetején lehetőség van a SETTINGS tábla adatainak
megváltoztatására is, mint például „az oldal szerkesztője”, a „cég neve”, amelyik az oldalt
használja valamit, hogy az oldal éppen karbantartás alatt áll-e.
Az oldalon megjelenő menük feliratát, az egyes menüpontok hivatkozását és
elhelyezkedését, az adminisztrációs menüből nyíló „Menük” hivatkozás segítségével lehet
megváltoztatni a következő SQL paranccsal:
$sql_update_menu="UPDATE `menus` SET `name` = '".$_POST['name']."', `href` = '".$_POST['href']."', align =
'".$where."' WHERE id='".$_GET['menuid']."'";
Ugyan erről a helyről lehet új menüt létrehozni és törölni is:
$sql_input_menu="INSERT INTO `menus` (`name`,`href`,`align`) VALUES
('".mysql_real_escape_string(htmlspecialchars($_POST['name']))."','".mysql_real_escape_string($_POST['href'])."','".$wh
ere."')";
$sql_delete="DELETE FROM `menus` WHERE id='".$_GET['menuid']."'";
Mindezen műveleteket a „Főadmin” webes kezelő felületről teheti meg, és így nem kell
adatbázis szinten ismernie a rendszert, hogy megváltoztathassa a menük sorrendjét vagy
hivatkozását.
Még egy menüpontra szükség van, hogy az oldal kinézetét, stílusát is lehessen egy új CSS
fájl beolvasásával megváltoztatni. Ez a menüpont a Témakezelő, itt lehet váltani a több
eltérő színbeállítással, háttérrel rendelkező design beállítások között. (13. ábra)
13. ábra
Saját fejlesztésű CMS létrehozása Kerepesi László
37
4. Összegzés
Néhány éve már természetes, hogy az internet bárki számára elérhető. Már nem számít
különlegességnek az, hogy bárki passzívan csak használója legyen a világhálónak. Ennek
köszönhetően az aktív részvétel is egyre jobban előtérbe kerül. Így már nem csak
használjuk az internetet, hanem aktív részesei vagyunk a tartalom előállításának.
Ezen dolgok tükrében már természetes az, hogy minden szervezetnek és vállalkozásnak
van saját weboldala. Az általam fejlesztett portál célja, hogy egy vagy több kiemelt
felhasználó tudja szerkeszteni az oldal tartalmát különösebb programozási tudás nélkül is.
Ez úgy valósulhat meg, hogy minden funkcióra külön kezelőfelületet kell biztosítani, hogy
ezek a kiemelt „Admin” szintű felhasználók csak „kattintgatva” tudjanak beállításokat
végrahajtani az oldalon. Akár a hírekről, akár képek feltöltéséről, vagy a fórumról legyen
szó, mindegyik esetben igyekeztem egyszerű megoldást találni a funkciók kezelésére.
Természetesen mielőtt a felhasználók birtokba vennék a rendszert, lehetőségeink szerint
tesztelnünk kell különféle szélsőséges bemeneti paraméterekkel is, hogy lássuk mennyire
stabil a program. Valamint egy dokumentációt (képekkel és magyarázattal), a felhasználók
rendelkezésére kell bocsátani, hogy tudják, hogy az egyes funkciókat, hogyan kell
használni. Ugyanígy megfelelő oktatás kell a Főadmin részére is, a tisztában legyen az
említett adminisztratív feladatokkal. Ezeken felül a fejlesztő elérhetőségét is meg kell adni,
hogy a későbbiekben előforduló üzemzavarok, anomáliák, vagy további fejlesztési igény
esetén legyen kihez fordulni.
Az Adminisztráción belül plugin kezelővel és menük dinamikus változtathatóságával
elértük, hogy egyszerűen változtathassuk kedvünkre az oldal külalakját és funkcionalitását
egyaránt. Ezen eszközök igazán rugalmassá teszik az oldalt, és így nem kell magas szintű
programozói felkészültség, hogy egyénileg testre szabhassuk az oldalt, és ez a CMS
oldalak sikerének titka.
Saját fejlesztésű CMS létrehozása Kerepesi László
38
Irodalomjegyzék
Zandstra, Matt: Tanuljuk meg a PHP4 használatát 24 óra alatt
(2000 Kiskapu Kft.)
Peter Moulding: PHP haladóknak - Fekete Könyv
(2002 ComputerBooks Kft.)
Webvilág - A PHP, a MySQL és az Apache használata
(2003 Panem Kiadó Kft.)
http://hu.wikipedia.org/wiki/CMS
(2009. január 8. Volkov)
http://cms.whysoft.hu/mi_a_cms.html
(2007 WhySoft Hungary Kft.)
http://aeonline.hu/szakdolgozatom/wordpress_tartalomkezelo_bemutatasa.pdf
( 2007 Mondovics Mihály)
http://www.scribd.com/doc/7578164/A-Joomla-Tartalomkezel-Rendszer-Bemutatasa
(2007 Lovászi Nándor Zsolt)
http://www.scribd.com/doc/8451317/A-PHP-nyelv
(2004 Révész György)