Directory Driven Solution
(DDS) for PHP
avagy egy
hierarchikus szervezésű
programmegoldás PHP –re
Pár évvel ezelőtt kezdtem
PHP-val foglalkozni, és mint mindenki, magam is a Net-en bogarásztam
állandóan, tanulmányozandó, ki, hogyan csinálja. Próbálgattam a megoldásokat,
keresve a leginkább megfelelőt, így akadtam a PhpClasses-on Colin Sandy Pittendrigh: RoboPage
megoldására, amely azonnal megfogott. A RoboPage úgy működik, hogy adva van a
root könyvtár, ahol ott van minden fájl, ami részt vesz a programban. Az index
fájl beilleszti (include) az osztályt, és a létrehozott RoboPage objektum
megvizsgálja a könyvtárban lévő fájlokat, majd a fájlnevekből elkészíti a
program menüjét. Ennyi az egész. Lenyűgözött, hogy milyen egyszerű, és mégis
működik. Tetszett, hogy bemásoltam a könyvtárba egy jpeg fájlt, és a frissítés
után a kép címe már benne is volt a menűben, azonnal beépült a kép a programba.
A Robo Page ma is elérhető a PhpClasses-on, és egy egyszerű rendszerre
figyelembe vehető alternatíva.
Miután, rövidesen rájöttem,
többre van szükségem, kapóra jött ismét egy megoldás, szintén a PhpClasses-on.
Ez volt Ilya Nemihin: DeepDir osztálya, amely a megadott könyvtár alatti teljes
könyvtárszerkezetet kezeli tömb formában. Így aztán a szereplők lassan kezdtek
összejönni, és néhány kisebb próbálkozás után rögtön látszott, egy használható
megoldás körvonalazódik.
A rendszer bemutatására a
legjobb, ha megnézünk egy egyszerű portál programot, amely a DDS-t alkalmazza.
Ime a könyvtárstruktúra:
_css //
stílus lapok
dds.css
_init //
az inicializációs állományok
config.php
class.deepdir.php
box.php
index.php
_include //
egyéb fájlok
bottom.php
top.php
_image //
képfájlok
logo.jpg
left //
a portál bal oldala
menu.php
language.php
index.php
middle //
a portál középső hasábja
articles.php
gallery.php
home.php
index.php
right //
a portál jobb oldali hasábja
poll.php
login.php
index.php
index.php // a fő index fájl
Rövid útmutatás szükséges. A kiterjesztés nélküliség
könyvtárat jelöl, a behúzás pedig a hierarchia szintet. Az aláhúzással kezdődő
könyvtárak a rendszerfájloké (a Total Commander-ben így fölül látszódnak), a
"left", "middle" és "right" már a működtető szerkezet.
A fő index fájlban egy html tábla van, amely a megjelenő
oldalt definiálja:
<?php
include ("_init/index.php"); ?>
<html>
<head>
<title><?php
echo $title ?></title>
<link
rel="stylesheet" href="_css/dds.css">
</head>
<body>
<?php include
("_include/top.php"); ?>
<table><tr>
<td width="139"
valign="top"><?php include ("left/index.php");?></td>
<td width="100%" valign="top"><?php include
("middle/index.php")?></td>
<td width="139"
valign="top"><?php include
("right/index.php")?></td>
</tr></table>
<?php include
("_include/bottom.php"); ?>
</body>
</html>
Nézzük most meg, mit is csinál az első sorban beillesztett
"init/index.php":
<?php
include
"_init/class.deepdir.php";
$dir =
new DeepDir();
$dir->setDir(
'_init' );
$dir->load();
foreach(
$dir->files as $n => $pathToFile ){
if ((strpos($pathToFile, 'index') === false)and
(strpos($pathToFile, 'deep') === false)){
include ($pathToFile);
}
}
?>
Most alkalmaztuk először a DeepDir-t, és ez mindjárt egy
valódi DDS. Miről is van szó?
A program számára szükséges "include" fájlok beillesztése
történik meg központilag és dinamikusan. Tehát, ha szükséges, hogy valami be
legyen illesztve, ezt most már központilag lehet intézni. Csak annyit kell
tennünk, hogy a fájlt belökjük az "_init" könyvtárba, és kész. A program minden
végrehajtáskor automatikusan behúzza az összes fájlt ebből a könyvtárból.
Lehet, ez így első hallásra soknak tűnik, és talán nem is annyira egyértelmű,
de menjünk csak tovább. A végére remélhetően összeáll a kép.
A fő index fájlt tovább böngészve, jön egy include a "top"
megjelentetéséhez. Ez egy egyszerű tábla, amiben egy fő cím és egy oldal logó
van. Ebben semmi érdekes. A "left/index.php" már annál inkább:
<?php
$dir =
new DeepDir();
$dir->setDir(
'left' );
$dir->load();
foreach(
$dir->files as $n => $pathToFile ){
if (strpos($pathToFile, 'index') === false){
include ($pathToFile);
}
}
?>
Ez már megint egy szép DDS. Talán sokaknak magától értetődő,
miről van szó, de lehet, kapóra jön néhányunknak egy kis magyarázat, mi is
történik a foreach-ben. Tehát, a $dir objektum beolvassa a "left" könyvtár
teljes tartalmát, majd meg kell vizsgálni, az adott fájlnév tartalmazza-e az
"index" kifejezést. Amennyiben nem index fájlról van szó, beilleszti (include).
Ez a "left" könyvtárnál a következőt jelenti.
-
beilleszti a "menu.php"-t, amely előállítja a menüt és
megjelenteti,
-
beilleszti a "language.php"-t, amely egy nyelvválasztó panelt
jelentet meg.
Maradjunk egy kicsit itt a bal oldalon. Mint az várható is
volt, a "menu.php" is egy DDS:
<?php
$menu =
'';
$dir =
new DeepDir();
$dir->setDir(
'middle' );
$dir->load();
foreach(
$dir->files as $n => $pathToFile ){
if (strpos($pathToFile, 'index') === false){
$fn = basename($pathToFile, ".php");
$menu .= ' <a
href="index.php?action='.$fn.'">'.$fn.'</a><br>';
}
}
box('Menu',
$menu, "100%");
?>
Itt a "middle" könyvtár PHP fájljai vannak kiválogatva és a
fájlnevekből egy-egy link képezve, amelyet egy dobozban jelenítünk meg.
Értelemszerűen az index fájlt ebből a fölsorolásból megint kizártuk.
Jelen demo programunkban a "language.php" csak egy szöveget
jelentet meg, semmilyen valós funkciója nincsen.
Tovább tanulmányozva a könyvtárainkat, a "middle" a
következő, amely szintén nem túl érdekes, hiszen az itt lévő index fájl csak
kapcsolgat a megjeleníthető fájlok között.
A jobb oldali hasáb működése ugyanaz, mint a bal oldali.
Olyannyira, hogy a különböző funkcionalitásokat tartalmazó PHP modulok szabadon
cserélgethetők egymás között. Így lehet megváltoztatni, hogy az egyes modulok
melyik oldalon jelenjenek meg.
Összegezve a DDS használatával kapcsolatos tapasztalatokat,
kedvező, hogy nagyon gyorsan összeállítható egy teljes funkcionalitású webes
program a segítségével. Bármilyen bővítés egyszerűen megvalósítható, az
időnként szükséges változtatások gyorsan végrehajthatók. Hierarchikus
menürendszer beépítésével tetszőleges bonyolultságú program könnyedén, jól
áttekinthetően kezelhető.
Hátránya, hogy a programrendszer adminisztrációjára nincs
felhasználóbarát megoldás. Minden módosítás fájlrendszer változtatással jár, és
az FTP műveletek gondosságot és egy bizonyos szintű szakértelmet is igényelnek.
Hasznos linkek:
·
demó program tesztelhető: www.sitkei.com/DDS
·
demó program letölthető: www.sitkei.com/DDS/demo.zip
·
egy éles megvalósítás: www.drawface.hu
·
érdeklődők, kritikai megjegyzések számára: sitkei.pal@itport.hu
Sitkei Pál
2005. szeptember 30.