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

tutorial.hu

Honlapkészítés, weboldal készítés kapcsán hasznos leírások


WebPillangó

Webprogramozás és grafika, photoshop leírások és kiegészítők


Blogom

blog.fefy.info bejegyzések

Apró szösszenetek egy informatikus életéből

Valid XHTML1.0 | valid CSS | 100% tableless
© 2011 - 2024 fefy.info | Az oldal betöltődési ideje: 1.9s