Nos elérkeztünk a következő fejezethez. Ahogyan az előző végén is ígértem, lekezeljük az adminisztrációs oldalt, ami így karbantartás üzemmódban is elérhető lesz. Ennek a megvalósításához szükségünk lesz egy pár függvényre.
Az implementáció előtt viszont bővítsük egy-két gondolattal a specifikációnkat, hogy lássuk mi az ami már részben (vagy egészében kész van). Tehát vegyük fel ezt a két dolgot:
Amint látható, nem hosszú a bővítési lista, viszont ez annál több kódot és forrásfájlt jelent. Első lépésben elkészítjük a keresőbarát url-eket, mivel ez csak egy pár soros fájl.
Keresőbarát url-eket a .htaccess fájl segítségével érhetünk el. Ehhez létre kell hozni egy .htaccess nevű fájlt. A karakterkódolását állítsuk iso-8859-1-re, mivel ebbe úgy sem kerülnek olyan dolgok, amik indokoltá tennék az utf-8-at. Természetesen lehet utf-8-as is a fájl, csak a BOM-ot vegyük ki, mert egyből 500 Internal Server Error-t dob a webszerverünk. A fájl tartalma az alábbi legyen:
apache<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.fefy.info
RewriteRule (.*) http://fefy.info/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*[^/]$ /$0/ [R=301,L]
RewriteRule ^admin/$ index.php?type=admin [L]
RewriteRule ^admin/(.*)/(.*)/$ index.php?type=admin&module=$1&setting=$2 [L]
RewriteRule ^login/$ index.php?type=login [L]
RewriteRule ^([a-zA-Z0-9-]+)/$ index.php?type=cikkek&postname=$1 [L]
RewriteRule ^(.*)/page/([0-9]+)/$ index.php?type=cikkek&postname=$1&page=$2 [L]
</IfModule>
A kód az alábbiakat teszi:
<IfModule mod_rwerite.c></IfModule>: A blokkon belüli utasítások csak akkor futnak le, ha az apache mod_rewrite modulja fel van telepítve és be is lett töltve.
RewriteEngine On: engedélyezzük az url újraírást
RewriteBase /: megadjuk a weboldalunk gyökerét (a relatív útvonalakat ehhez viszonyítja a szerver)
RewriteCond %{HTTP_HOST} ^www.fefy.info és RewriteRule (.*) http://fefy.info/$1 [R=301,L]: a www-s domain-ünket átirányítjuk a www nélkülire. Fordított esetben a ^www.fefy.info helyett ^fefy.info lesz, http://fefy.info/$1 helyett pedig http://www.fefy.info/$1 lesz. Természetesen a domain nevek tetszőlegesen változtathatók.
A következő két sor azért lényeges, mert így a létező könyvtárakat (-d végű sor) és fájlokat (-f végű) a szerver kiszolgálja és nem rakja paraméterbe.
RewriteRule ^.*[^/]$ /$0/ [R=301,L]: Ha a fenti szabályok közül egyik sem érvényesült, akkor a url-ünk végére odarakunk egy "/" jelet.
A következő pár sor pedig az url-ünket szépen feldarabolja és a megfelelő get paraméterbe rakja:
RewriteRule ^admin/$ index.php?type=admin [L]: Ha az url-ünk domain.tld/admin/ formátumban néz ki, akkor az admin-t belerakjuk a type paraméterbe
RewriteRule ^admin/(.*)/(.*)/$ index.php?type=admin&module=$1&setting=$2 [L]: Ha az url domain.tld/admin/modul/opcio/ formátumú, akkor az admint belerakjuk a type paraméterbe, a modul nevét a module paraméterbe és értelemszerűen az opciót a setting paraméterbe
A RewriteRule ^login és a maradék két sor is hasonló logika mentén működik.
A továbbiakban térjünk rá a lényegre, vagyis feldolgozó szkriptünkre.
Mivel több dolog is szükséges a feldolgozáshoz, így kezdeném a szokásos bemásolással és utólagos magyarázattal:
php<?php
if(file_exists('.DEBUG')){
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors','On');
}
else{
error_reporting(0);
ini_set('display_errors','Off');
}
require_once("functions/global.inc");
$urltype = requests("http")->get("get", "type");
if(file_exists(".MAINTENANCE") && $urltype != ADMINURL && $urltype != LOGINURL){
include("maintenance.html");
exit(0);
}
elseif($urltype == ADMINURL){
require_once("functions/admin/index.php");
}
elseif($urltype == LOGINURL){
require_once("functions/login/index.php");
}
?>
A fájl szerkezete, mint látható, egy kicsit átalakult. A .DEBUG fájlunk ellenőrzése előre került, valamint a .MAINTENANCE fájlunk ellenőrzése is bővült. Az okok pedig a következők: a fejlesztő mód független attól, hogy éppen karbantartjuk-e az oldalt vagy, nem, így először ennek az ellenőrzését kell elvégezni. Ezután be kell tölteni pár függvényt és konstans értéket, hogy az url-eket valahogyan fel tudjuk dolgozni. A függvények a require_once("functions/global.inc"); segítségével töltődnek be a functions könyvtár global.inc fájljából. Ezután lekérdezzük az url típusát a $urltype = requests("http")->get("get", "type"); sorban és eltároljuk az $urltype változóba. Miután ez megvan, megvizsgáljuk, hogy a login/admin oldalon vagyunk-e, ha igen, akkor nem kapcsolunk karbantartás üzemmódba, függetlenül attól, hogy létezik-e a .MAINTENANCE fájlunk. Valamint az $urltype értékétől függően betöltjük az admin/login oldalt.
Ez a fájlunk tölti be az oldalhoz tartozó függvényeket. A tartalma jelenleg nagyon egyszerű:
php<?php
require_once("configs/constants.php");
require_once("functions/requests/requests.inc");
?>
Az első sorban betöltjük az oldalhoz tartozó konstans értékeket (jelenleg az ADMINURL és LOGINURL változók szerepelnek benne, mint az admin és bejelentkező oldalak url-jei).
A második sorban betöltjük a "kérések" modul inicializáló részét.
Az összes kérés ebben a fájlban található osztályokba/függvényekbe fut bele, ami a kérés típusától függően további modulokat tölt be. Jelenleg az url kezeléshez egyszerű HTTP GET kérésekre van szükség.
A fájl egy egyszerű inicializálós függvénnyel indít, ami megadja az aktuális kérés típusát:
phpfunction requests($type){
return new request($type);
}
Az index.php-ban található requests("http") ezt a függvényt hívja meg http paraméterrel. A függvény egy request típusú objektummal tér vissza, ami jelen esetben a "http" értékkel inicializálódik.
A request osztályunk az alábbi módon néz ki:
phpclass request{
private $requesttype;
public function __construct($type){
$this->requesttype = $type . "requests";
}
public function get($type, $names){
include_once("functions/requests/" . $this->requesttype . ".php");
$requesttype = new $this->requesttype;
return $requesttype->$type($names);
}
}
Van egy privát változója, ami eltárolja a kérés típusát (http). Az eltárolás az osztály példányosításakor jön létre a __construct() függvény segítségével. Az osztálynak jelenleg van egy get metódusa, ami betölti a megfelelő típusú kérést az include_once sorban. Következő lépésben példányosítjuk a betöltött modulunkat a $requesttype = new $this-> requesttype; sorban. Ha a példányosítás megvan, akkor visszatérünk a példányosított objektum paraméterként megkapott metódusának visszatérési értékével. Ez röviden annyit jelent, hogy a $type paraméter a betöltött modul metódusának nevét tartalmazza. Tehát szemléltetve jelenleg a return sor ezzel megegyező:
Van egy privát változója, ami eltárolja a kérés típusát (http). Az eltárolás az osztály példányosításakor jön létre a __construct() függvény segítségével. Az osztálynak jelenleg van egy get metódusa, ami betölti a megfelelő típusú kérést az include_once sorban. Következő lépésben példányosítjuk a betöltött modulunkat a $requesttype = new $this-> requesttype; sorban. Ha a példányosítás megvan, akkor visszatérünk a példányosított objektum paraméterként megkapott metódusának visszatérési értékével. Ez röviden annyit jelent, hogy a $type paraméter a betöltött modul metódusának nevét tartalmazza. Tehát szemléltetve jelenleg a return sor ezzel megegyező: return (httprequests példányosított változata)->get(paraméter(lista));
A cikk utolsó lépéseként jöjjön a httprequests.php tartalma.
phpclass httprequests{
public function get($param){
if(is_array($param)){
$paramvalues = array();
foreach($param as $p){
if(isset($_GET[$p])){
if(!empty($_GET[$p])){
$paramvalues[$p] = $_GET[$p];
}
else
$paramvalues[$p] = NULL;
}
else
$paramvalues[$p] = NULL;
}
}elseif(isset($_GET[$param])){
if(!empty($_GET[$param])){
$paramvalues = $_GET[$param];
}
else
$paramvalues = NULL;
}
else{
$paramvalues = NULL;
}
return $paramvalues;
}
}
Az osztály tartalmaz egy publikus metódust get() néven. A metódus paramétere lehet egy paraméternév, vagy paraméter nevek tömbje. A működése röviden annyi, hogy megnézzük, hogy paraméter tömböt, vagy stringet kaptunk-e. Ha tömböt, akkor a tömb elemeit bejárjuk és egy tömbbe eltároljuk a paraméterek értékeit. Ha egy paraméter nem létezik, vagy nincs értéke, akkor NULL értéket rakunk a neki megfelelő indexű tömbbe. Ha csak egy paramétert kapunk, akkor ugyanúgy vizsgáljuk az értékét és ha üres, vagy nem létező paraméter, akkor NULL értékkel térünk vissza, egyébként pedig visszaadjuk a paraméter értékét.
A letölthető forrásfájlokban található httprequests osztály a post metódussal is ki lett bővítve, viszont a működése 100%-ban megegyezik a get()-tel, így erre nem térnék ki külön.
A cikkben található könyvtárstruktúra és vonatkozó fájlok megtalálhatók a cms-2.zip fájlban.
CMS rendszer készítése PHP nyelven 1.
Honlapkészítés, weboldal készítés kapcsán hasznos leírások
Webprogramozás és grafika, photoshop leírások és kiegészítők
Mindent a webről a kezdőktől a profikig bezáróan
Még nem érkezett hozzászólás...