Mappaműveletek gyorsan és egyszerűen
Munkám során számos esetben fordul elő, hogy fájlműveleteket is kell alkalmaznom. Ilyen lehet például egy kép, vagy bármilyen fájl feltöltése, egy tetszőleges dokumentum generálása, az adatbázis biztonsági mentése és még lehetne sorolni.
A problémát az jelenti, hogy a művelet ideje alatt írási jogot kell adni a célmappának, vagy épp létre kell hozni azt. Utóbbira egy egyszerű példa, amikor képet töltünk fel. Egyes tartalomkezelő rendszerek, mint a Wordpress feltöltési dátum alapján hoz létre mappákat, amibe bekerülnek a képek. Ezt éves és havi bontásban teszi, teljesen automatikusan. Hasonló módon valósítja meg a feladatot ennek a weboldalnak az egyedi CMS-e is. Majd a művelet befejezésekor azt vissza is kell állítani, különben biztonsági rést hagynánk.
Erre a célra létrehoztam 4 függvényt. A "folder_create" létrehoz a bemeneti paraméterének értékével azonos elnevezésű mappát. Hogy biztosak legyünk abban, hogy a mappa neve valóban megfelel-e a követelményeknek, a paraméter értékét átalakítjuk az előző példámban már megismert "get_friendly_url" függvényünkkel. Majd a mappa létrehozását követően elhelyezünk benne automatikusan egy "index.php" fájlt, ami meghíváskor mindig az előző mappa szintjére irányít át minket. Ennek az a szerepe, hogy ha a szerveren véletlenül rosszul lenne beállítva a mappák láthatósága, akkor ne listázza ki a böngészőbe a mappa teljes tartalmát.
A "folder_open" függvény megvizsgálja, hogy létezik-e a megnyitni kívánt mappa. Ha igen, akkor ellátja teljes körű írási, olvasási joggal. Ha nem létezik még a mappa, akkor pedig meghívja a "folder_create" nevű függvényt, ami biztosan létre fogja hozni azt és máris ellátja a megfelelő jogokkal.
A "folder_close" pedig visszaállítja a jogokat. A "folder_delete" pedig szükség esetén törli a paraméterében megjelölt mappát. A törlés esetén viszont van még egy feladatunk. A PHP alap esetben nem fogja engedi, hogy a mappát töröljük, amíg annak a tartalma nem üres. Éppen ezért meg kell nyitnunk a mappát és be kell járnunk annak tartalmát. A bejárás során pedig minden fájlt törölnünk kell. Ezt követően már lehet törölni a mappát.
Míg a "folder_create", "folder_open" és "folder_close" függvények bemeneti paramétere befogadja a több mélységű mappa struktúrát, azzal szemben a "folder_delete"-é nem. Ennek az az egyszerű oka, hogy megnyitáskor a teljes elérési útvonalat ellenőríznünk kell, hogy valóban léteznek-e a mappa mélységek és azoknak megfelelőek-e a jogosultságai. Viszont törlés esetén nem feltétlenül szeretnénk a teljes struktúrát törölni. Tehát ebben az esetben bentről kifelé haladva érdemes megadni a mappák útvonalát.
PHP
<?php
function get_friendly_url($string, $extension, $result)
{
if (filter_var($string))
{
$url_old = array('(í|Í)', '(á|Á)', '(é|É)', '(ö|Ö)', '(ő|Ő)', '(ü|Ü)', '(ű|Ű)', '(ó|Ó)', '(ú|Ú)');
$url_new = array('i', 'a', 'e', 'o', 'o', 'u', 'u', 'o', 'u');
$url_regexp = '([^a-zA-Z0-9]+)';
$result_array = array();
$slug_array = explode('/', $string);
foreach ($slug_array as $slug)
{
$slug = preg_quote($slug);
$slug = preg_replace($url_old, $url_new, $slug);
$slug = strtolower(preg_replace($url_regexp, '-', $slug));
$slug = preg_replace('/^[\-]+/', '',$slug);
$slug = preg_replace('/[\-]+$/', '',$slug);
$result_array[] = $slug;
}
$string = implode('/', $result_array);
if (filter_var($extension))
{
$string .= $extension;
}
if ($result == 'get')
{
return $string;
}
elseif ($result == 'print')
{
echo $string;
}
}
}
function folder_create($folder)
{
$folder = get_friendly_url($folder, '', 'get');
if (filter_var($folder))
{
$folder_steps = '';
$slug_array = explode('/', $folder);
foreach ($slug_array as $slug)
{
if (filter_var($slug))
{
if (filter_var($folder_steps))
{
$folder_steps .= '/';
}
$folder_steps .= $slug;
if (!is_dir(__DIR__.'/'.$folder_steps))
{
mkdir(__DIR__.'/'.$folder_steps, 0777);
file_put_contents(__DIR__.'/'.$folder_steps.'/index.php', '', LOCK_EX);
}
}
}
}
}
function folder_open($folder)
{
$folder = get_friendly_url($folder, '', 'get');
if (filter_var($folder))
{
$folder_steps = '';
$slug_array = explode('/', $folder);
foreach ($slug_array as $slug)
{
if (filter_var($slug))
{
if (filter_var($folder_steps))
{
$folder_steps .= '/';
}
$folder_steps .= $slug;
if (!is_dir(__DIR__.'/'.$folder_steps))
{
folder_create($folder_steps);
}
else
{
chmod(__DIR__.'/'.$folder_steps, 0777);
}
}
}
}
}
function folder_close($folder)
{
$folder = get_friendly_url($folder, '', 'get');
if (filter_var($folder))
{
$slug_array = explode('/', $folder);
$slug_count = count($slug_array) - 1;
for ($i = $slug_count; $i >= 0; $i--)
{
$folder_steps = '';
for ($y = 0; $y <= $i; $y++)
{
if (filter_var($slug_array[$y]))
{
if (filter_var($folder_steps))
{
$folder_steps .= '/';
}
$folder_steps .= $slug_array[$y];
}
}
if (filter_var($folder_steps))
{
if (is_dir(__DIR__.'/'.$folder_steps))
{
chmod(__DIR__.'/'.$folder_steps, 0755);
}
}
}
}
}
function folder_delete($folder)
{
$folder = get_friendly_url($folder, '', 'get');
if (is_dir(__DIR__.'/'.$folder))
{
$dir = opendir(__DIR__.'/'.$folder);
while (false !== ($filename = readdir($dir)))
{
if (($filename != '.') && ($filename != '..'))
{
unlink(__DIR__.'/'.$folder.'/'.$filename);
}
}
rmdir(__DIR__.'/'.$folder);
}
}
?>
A példa kedvéért bemutatom, hogyan működik. A letölthető demo tartalmazza a függvényeket és egy mappát benne egy szöveges fájllal. A program lefutásakor létrehozunk egy új mappát, majd azon belül még egyet és ebbe a második mappába bemásoljuk ezt az említett szöveges fájlt. A példában szándékosan használok ékezeteket és szóközöket a mappa megnyitásakor, hogy szemléltessem a "get_friendly_url" függvény működését is.
PHP
<?php
if (file_exists(__DIR__.'/innen-masolunk/fajl.txt'))
{
folder_open('ide másolunk/még egy mappa');
if (copy(__DIR__.'/innen-masolunk/fajl.txt', __DIR__.'/'.get_friendly_url('ide másolunk', '', 'get').'/'.get_friendly_url('még egy mappa', '', 'get').'/fajl.txt'))
{
echo '<p class="alert alert-success">Sikerült a másolás!</p>';
}
else
{
echo '<p class="alert alert-danger">Nem sikerült a másolás!</p>';
}
folder_close('ide másolunk/még egy mappa');
//folder_delete('ide másolunk/még egy mappa');
//folder_delete('ide másolunk');
}
?>
Leírásaink azon kezdő és haladó programozóknak nyújtanak segítséget, akik már minimális szinten foglalkoztak weboldalkészítéssel. Ha szeretnél jobban elmélyülni a témában, vagy elsajátítani alapokat, még tovább fejlődni, akkor nézz körbe tanfolyam kínálatunkban, ahol a kezdőtől a profi szintig nyújtunk képzéseket a számodra.