CMS rendszer készítése PHP nyelven 2.

| | , , , , ,

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:

  • keresőbarát url-ek
  • karbantartás közben is elérhető admin/login oldalak

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-ek

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.

URL feldolgozás

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.

global.inc fájl

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.

requests.inc fájl

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.

httprequests.php fájl

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.

A cikksorozat első része (tartalomjegyzék)

CMS rendszer készítése PHP nyelven 1.

CMS specifikáció

Folyamatosan bővülő CMS specifikáció

0 hozzászólás

Még nem érkezett hozzászólás...

Hozzászólás küldéshez jelentkezz be!

Download Vivaldi Today!

Hasznos oldalak, linkek

Warning: DOMDocument::load(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in /mnt/www/sites/fefy.info/tld/content/content_functions.php on line 184 Warning: DOMDocument::load(http://feeds.feedburner.com/tutorialhu): failed to open stream: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in /mnt/www/sites/fefy.info/tld/content/content_functions.php on line 184 Warning: DOMDocument::load(): I/O warning : failed to load external entity "http://feeds.feedburner.com/tutorialhu" in /mnt/www/sites/fefy.info/tld/content/content_functions.php on line 184 Fatal error: Call to a member function getElementsByTagName() on a non-object in /mnt/www/sites/fefy.info/tld/content/content_functions.php on line 195