Drupal scandir(); onkin file_scan_directories();

Posted on January 16, 2009

0


Drupal tarvitsee vahvaa teemoittamista. Normaalisti eräs käyttäjäystävällinen ja varmatoiminen tapa on käyttää omia hakemistoja tietyn kuvaesitysten kuvien tallentamiseen. Drupalissa tiedostojärjestelmän funktiot eivät kuitenkaan toimi, sen sijaan alusta tarjoaa vastaavia, omia funktioitaan esimerkiksi PHP:n scandir(); -funktion toteuttamiseen.

$myflashphotos = array_diff(scandir('/sites/default/files/flash'), array(".", ".."));

Tavanomainen tiedoston luku palauttaa Drupalissa virheen.

  • warning: scandir(/sites/default/files/flash)[function.scandir]: failed to open dir: not implemented in /home/test/public_html/sites/default/themes/mytheme/page.tpl.php on line 77.
  • warning: scandir() [function.scandir]: (errno 0): Success in /home/test/public_html/sites/default/themes/mytheme/page.tpl.php on line 77.

Virheestä ei pääse yli eikä ympäri, ei edes muokkaamalla .htaccess -tiedostoa. Niinpä pitää turvautua Drupal API:iin. Rajapintaohje kertoo tiedostoja käsittelevässä osiossa funktiosta file_scan_directory() -funktiosta. Funktio tarvitsee parametrikseen hakemistopolun ja säännöllisen lausekkeen, jolla tuloksia seulotaan. Ilman regular expression -sääntöä funktio ei toimi.

$myflashphotos = file_scan_directory("/sites/default/files/flash/", '.*');

Ylläoleva lause ei vielä toimi. Hakemistopolun alusta ja lopusta on poistettava kauttaviiva. Säännönmukainen lauseke .* ei myöskään toimi, vaikka normaalisti piste-tähti palauttaa kaikki mahdolliset arvot. Korjataan lausetta.

$myflashphotos = file_scan_directory("sites/default/files/flash", '.*\.jpg$');

Nyt funktio löytää mainitusta hakemistosta jpg-päätteiset tiedostot. Paluuarvo näyttää tältä:

array(2) { 
  ["sites/default/files/flash/top_picture_2.jpg"]=> 
   object(stdClass)#26 (3) { ["filename"]=>  
   string(43) "sites/default/files/flash/top_picture_2.jpg" ["basename"]=>  
   string(17) "top_picture_2.jpg" ["name"]=>  
   string(13) "top_picture_2" } ["sites/default/files/flash/top_picture.jpg"]=>  
   object(stdClass)#8 (3) { 
   ["filename"]=>  
   string(41) "sites/default/files/flash/top_picture.jpg" ["basename"]=>  
   string(15) "top_picture.jpg" ["name"]=>  
   string(11) "top_picture" } 
} 

Kaikkea tätä informaatiota ei tarvita, tuloksia voi kätevästi supistaa näin:

$myflashphotos = array_keys(file_scan_directory("sites/default/files/flash", '.*\.jpg$'));

Tuloksena taulukko, jossa pelkät tiedostojen nimet polkuineen.

array(2) {
  [0]=>
  string(43) "sites/default/files/flash/top_picture_2.jpg"
  [1]=>
  string(41) "sites/default/files/flash/top_picture.jpg"
}

Säännönmukainen lauseke mahdollistaa file_scan_directory();n laajemman käytön. Esimerkiksi seuraava lauseke

$myfiles = array_keys(file_scan_directory('sites', 'files.*\.(jpe?g|gif|png)$));

palauttaa taulukossa kaikkien jpg, jpeg, gif ja png -päätteisten tiedostojen nimet polkuineen, jotka löytyvät sites-hakemiston alta ja joiden polussa tai nimessä on sana files.

Advertisements
Posted in: Muut