Seite 1 von 1

[BUG 4.9.8] function scanDirectory()

Verfasst: Mi 19. Aug 2015, 10:37
von beloved_behated
Hallo,

in der contenido/includes/functions.file.php in Zeile 244 wird eine falsche Klasse aufgerufen:

Code: Alles auswählen

function scanDirectory($sDirectory, $bRecursive = false) {
    cDeprecated('This method is deprecated and is not needed any longer');
    return cFileHandler::read($sDirectory, $bRecursive, false, true);
}
Statt cFileHandler müsste hier cDirHandler aufgerufen werden:

Code: Alles auswählen

function scanDirectory($sDirectory, $bRecursive = false) {
    cDeprecated('This method is deprecated and is not needed any longer');
    return cDirHandler::read($sDirectory, $bRecursive, false, true);
}

Re: [BUG 4.9.8] function scanDirectory()

Verfasst: Do 20. Aug 2015, 09:01
von frederic.schneider_4fb
Upps! Vielen Dank für Deine Meldung. Ich habe das als Ticket für die nächste Version aufgenommen.

Re: [BUG 4.9.8] function scanDirectory()

Verfasst: Do 8. Okt 2015, 09:10
von frederic.schneider_4fb
Das Problem ist in der nächsten Version behoben

Re: [BUG 4.9.8] function scanDirectory()

Verfasst: Di 20. Okt 2015, 20:15
von rethus
BTW: In der API steht die noch drin, die Logs in 4.9.8 melden es aber als Deprecated.

Zwei Dinge wären gut:
  1. Die Fehlermeldung aussagekräftiger gestalten... z.B. "Use cFileHandler::read($sDirectory, $bRecursive, false, true); instead" ergänzen
  2. In der API die Funktion als Deprecated markieren, und auch den Hinweis dazu, was jetzt zu nutzen ist: http://api.contenido.org/con498/functio ... ctory.html
Wobei, ist die Implementierung überhaupt richtig. Wäre hier nicht die php-eigene Funktion scandir() sinvoller? Hier geht es ja nicht um das einlesen einer Datei, sondern um eine Dateiliste?!

Re: [BUG 4.9.8] function scanDirectory()

Verfasst: Mi 21. Okt 2015, 15:03
von rethus
Verwendet man Module, die z.B. den Template-Ordner des Moduls auslesen sollen muss der Aufruf von scanDirectory gegen folgendes ersetzt werden:

Code: Alles auswählen

$module = new cModuleHandler($cCurrentModule);
$tplFiles = $module->getAllFilesFromDirectory('template');

Re: [BUG 4.9.8] function scanDirectory()

Verfasst: Mi 28. Okt 2015, 19:21
von rethus
Hier nochmal eine Ergänzung...

Da ich gerade ein altes Modul auf 4.9 migriere, war ich auf der Suche nach einer Funktion, die nur kursiv die Verzeichnisse einliest.
Dabei bin ich auf cDirHandler gestoßen - leider macht diese Klasse Ihre arbeit stellenweise nicht gut.

Der Aufruf:

Code: Alles auswählen

// zum Vergleich:  
// public static function read($dirname,$recursive = false, $dirOnly = false, $fileOnly = false)
             cDirHandler::read($cfgClient[$client]['path']['frontend'].$cfgClient[$client]['upload'],true,true,false);
 
liefert alle Verzeichnisse & Dateien zurück anstatt wie gewünscht nur die Verzeichnisse.

Mal wird über opendir() ausgelesen [alte variante], mal wird es "state of the Art" via SPL-Directory-Iterator gemacht.

Ab PHP-Version 5.3 ist ja die SPL-Erweiterung fest einkompiliert und nicht mehr deaktivierbar... somit kann man die von der Erweiterung angebotenen Iteratoren nutzen (http://php.net/manual/de/spl.iterators.php), weshalb ich bitte ein Ticket zu öffnen mit dem Inhalt, dass die Datei komplett aktualisiert wird.

Was mich wundert... es wird bereits in der class.dirhandler.php mit dem DirectoryIterator gearbeitet, aber dann wird nicht die iteratoreigene Methode "DirectoryIterator::isDir()"genutzt, sondern die Dateisystem-Basierte Methode "is_dir()" gearbeitet. :shock:

Beispiel-Iteration, wie es aussehen könnte (so habe ich es in meinem Modul jetzt erstmal überbrückt)

Code: Alles auswählen

$iterator = new DirectoryIterator($cfgClient[$client]['path']['frontend'].$cfgClient[$client]['upload']);
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isDir() && !$fileinfo->isDot()) {
        echo $fileinfo->getFilename() . "\n";
    }
}
Bitte ggf. ein Ticket dazu ergänzen/erstellen (ich komme nicht in den Issue-Tracker - sonst würde ich es selbst machen)