Autor | Zpráva | ||
---|---|---|---|
Darker Profil |
#1 · Zasláno: 5. 2. 2011, 17:46:55 · Upravil/a: Darker
Začal jsem si vyrábět zprávce souborů. Trošku jsem si ho vylepšil o uživatelské účty s různými oprávněními. Kromě globálních oprávnění jsem zavedl také oprávnění pro jednotlivé soubory a složky. Ta jsou uložena v XML, které převádím na pole. Oprávnění nišší úrovně (hlouběji) mý vyšší prioritu, ta nad sebou přebije. Všechno pěkně funguje, i převedení cesty na pole oprávnění, ale jedna věc mi vadí, a to že používám eval, a jediná alternativa která mě napadá je nějaká složitá rekurzivní funkce.
Oprávnění: <?xml version="1.0" standalone="yes"?> <permissions> <******> <web><OPT_show_dir>0</OPT_show_dir> <admin> <OPT_show_dir>1</OPT_show_dir> <users> <administrator> <OPT_show_dir>0</OPT_show_dir> </administrator> </users> <test> <OPT_read>1</OPT_read> <OPT_rename>0</OPT_rename> <OPT_write>0</OPT_write> <OPT_delete>1</OPT_delete> <OPT_make>1</OPT_make> </test> </admin> </web> </******> </permissions> A takle pak vypadá pole: Array ( [******] => Array ( [web] => Array ( [OPT_show_dir] => 0 [admin] => Array ( [OPT_show_dir] => 1 [users] => Array ( [administrator] => Array ( [OPT_show_dir] => 0 ) ) [test] => Array ( [OPT_read] => 1 [OPT_rename] => 0 [OPT_write] => 0 [OPT_delete] => 1 [OPT_make] => 1 ) ) ) ) ) Teď nastává zmíněný problém, sami vidíte, že pole může mít kolik chce úrovní. function path_permissions($path){ $actual=$_SESSION['perms']; //To je pole co jsem vytahl z XML $permissions=array(); //sem si budeme ukládat oprávnění $options=array("read","write","rename","delete","make","show_dir");//Co hledat $path=str_replace(DATA_ROOT,"",realpath($path)); $path=str_replace("//","/",$path); //Projistotu $path=explode("/",$path); for($i=count($path)-1;$i>=0;$i--){ eval('$perms=$actual["'.implode('"]["',$path).'"];'); //Složíme se lobovolně dlouhou adresu v poli for($j=0;$j<count($options);$j++){ if(!isset($permissions[$options[$j]])&&isset($perms["OPT_".$options[$j]])){ //Jedeme zevnitř, takže pokud je přiřazeno, nepřiřazujeme $permissions[$options[$j]]=$perms["OPT_".$options[$j]]; }; }; unset($path[count($path)-1]); } $global=$_SESSION['rights']['EXPLORER']; for($j=0;$j<count($options);$j++){ //A nakonec přiřadíme obecná oprávnění tam, kde není nic if(!isset($permissions[$options[$j]])&&isset($global[$options[$j]])){ $permissions[$options[$j]]=$global[$options[$j]]; }; }; return $permissions; } Takže otázka zní, jak to udělat chytřeji, lépe a bez eval. |
||
Časová prodleva: 13 let
|
0