WBCE CMS – Way Better Content Editing.
Du bist nicht angemeldet.
Hi Zusammen
Sorry wenn ich hier gleich wieder was poste.
Mein Droplet fliegt aus dem Layout.
Auch im Quellcode steht es komischer Weise ganz am Anfang wo es natürlich nicht hingehört.
Hier das Droplet:
[== PHP ==]
function getFileList($dir)
{
// array to hold return value
$retval = array();
// add trailing slash if missing
if(substr($dir, -1) != "/") $dir .= "/";
// open directory for reading
$d = new DirectoryIterator($dir) or die("getFileList: Failed opening directory $dir for reading");
foreach($d as $fileinfo) {
// skip hidden files
if($fileinfo->isDot()) continue;
$retval[] = array(
'name' => "{$dir}{$fileinfo}",
'type' => ($fileinfo->getType() == "dir") ? "dir" : mime_content_type($fileinfo->getRealPath()),
'size' => $fileinfo->getSize(),
'lastmod' => $fileinfo->getMTime()
);
}
return $retval;
}
$dirlist = getFileList($pfad);
echo "<div class=\"dirlist\">\n";
echo "<table class=\"collapse\" style=\"width: 100%; border:0;\">\n";
echo "<thead>\n";
echo "<tr><th style=\"width: 280px\">Name</th><th>Size</th><th>Last Modified</th></tr>\n";
echo "</thead>\n";
echo "<tbody>\n";
foreach($dirlist as $file) {
echo "<tr>\n";
echo "<td><li><a href=\"{$file['name']}\" target=\"_blank\">",basename($file['name']),"</a></li></td>\n";
echo "<td>{$file['size']}</td>\n";
echo "<td style=\"text-align: right;\">",date('r', $file['lastmod']),"</td>\n";
echo "</tr>\n";
}
echo "</tbody>\n";
echo "</table>\n";
echo "</div>\n";
Der Aufruf erfolgt über
[== HTML ==]
[[Dirlist?pfad=../media/share]]
und sollte im Content 1 Bereich ausgegeben werden...
Doch dann fliegt die Ausgabe aus dem Layout. -> http://new.ballonwoche.ch/pages/test.php
Der IE versagt grad ganz, bei FF wird das Layout wenigstens im Anschluss wieder normal dargestellt...
Vielen Dank für eure Hülfää :-)
Raffi
Beitrag geändert von ecology (07.03.2017 21:46:07)
Offline
Das liegt wahrscheinlich an dem return in der Funktion, das bringt das ganze durcheinander. Frag mich nicht wieso das so ist.
Es funktioniert, wenn Du einen Code2-Abschnitt anlegst, den Typ "PHP" auswählst, da den Code aus Deinem Posting einfügst und die Zeile
$dirlist = getFileList($pfad);
änderst zu
$dirlist = getFileList('../media/share');
Code allein macht nicht glücklich. Jetzt spenden!
Offline
Vielen Dank... Dabei wollte ich ein hübsches Droplet machen...
Offline
Die Erklärung des "Versagens" findet sich in der Droplet Hilfe:
The droplet code can NOT echo or print data to the output stream directly. The Droplet name is replaced by the return value of the PHP code.
Tante Edit sagt: "so sollte es auch als Droplet funktionieren":
$file_array = array();
// add trailing slash if missing
if (substr($pfad, -1) != "/") $pfad .= "/";
// open directory for reading
$d = new DirectoryIterator($pfad) or die("getFileList: Failed opening directory $pfad for reading");
foreach ($d as $fileinfo) {
// skip hidden files
if ($fileinfo->isDot()) continue;
$file_array[] = array(
'name' => "{$pfad}{$fileinfo}",
'type' => ($fileinfo->getType() == "dir") ? "dir" : mime_content_type($fileinfo->getRealPath()),
'size' => $fileinfo->getSize(),
'lastmod' => $fileinfo->getMTime()
);
}
$file_list = '';
$file_list .= "<div class=\"dirlist\">\n";
$file_list .= "<table class=\"collapse\" style=\"width: 100%; border:0;\">\n";
$file_list .= "<thead>\n";
$file_list .= "<tr><th style=\"width: 280px\">Name</th><th>Size</th><th>Last Modified</th></tr>\n";
$file_list .= "</thead>\n";
$file_list .= "<tbody>\n";
foreach ($file_array as $file) {
$file_list .= "<tr>\n";
$file_list .= "<td><li><a href=\"{$file['name']}\" target=\"_blank\">".basename($file['name'])."</a></li></td>\n";
$file_list .= "<td>{$file['size']}</td>\n";
$file_list .= "<td style=\"text-align: right;\">".date('r', $file['lastmod'])."</td>\n";
$file_list .= "</tr>\n";
}
$file_list .= "</tbody>\n";
$file_list .= "</table>\n";
$file_list .= "</div>\n";
return $file_list;
Beitrag geändert von bernd (08.03.2017 01:56:24)
... nein in Europa verwenden wir beim Programmieren nicht € statt $ ...
Offline
florian, thanks
Funktioniert tadellos.
Anbei der Code als Zip zum Import via Droplet-Tool.
Code allein macht nicht glücklich. Jetzt spenden!
Offline
Juhuu.
So cool.
So haben wir wenigstens wieder ein Dirlist (rudimentär), da es das alte ja nicht mehr zum download gibt...
Wer will kann natürlich noch am Code basteln, wie z.Bsp. die Bytes in MB oder so umwandeln...
Dafür reichen meine Kenntnisse leider nicht aus...
Zur Info: Der Aufruf erfolgt noch immer über:
[[dirlist?pfad=weg ins Ziel]]
Gruss Raffi
Beitrag geändert von ecology (08.03.2017 19:38:24)
Offline
Ich hab das alte DirList-Modul (V. 0.23 standalone, ohne kitFramework) noch im Archiv, das funktioniert aber mit PHP7 gar nicht mehr, wirft mit 5.6 eine ganze Latte an depreciated-Fehlern und zum krönenenden Absch(l)uss einen Fatal Error beim Speichern, weil es eine Lepton-class-secure erwartet.
=> Da dann doch lieber die Droplet-Schiene weiterverfolgen.
Code allein macht nicht glücklich. Jetzt spenden!
Offline
Ich hab das alte DirList-Modul (V. 0.23 standalone, ohne kitFramework) noch im Archiv, das funktioniert aber mit PHP7 gar nicht mehr, wirft mit 5.6 eine ganze Latte an depreciated-Fehlern und zum krönenenden Absch(l)uss einen Fatal Error beim Speichern, weil es eine Lepton-class-secure erwartet.
=> Da dann doch lieber die Droplet-Schiene weiterverfolgen.
Und genau das gleiche Problem hatte ich, als ich auf PHP7 umstellte. Plötzlich was das einfachste, kleine Modul Dirlist der Spielverderber.
Eine Alternative habe ich nicht gefunden und deshalb hab ich den Code oben angefangen zu basteln.
Wie gesagt, wenn wir jetzt noch die Möglichkeiten einbauen würden, die Bytes in MB oder GB auszugeben... dann wär's ja schon fast pefekt...
Hier ein Ansatz wie's gemeint wäre:
[== PHP ==]
function formatBytes($bytes, $precision = 2) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
// Uncomment one of the following alternatives
// $bytes /= pow(1024, $pow);
// $bytes /= (1 << (10 * $pow));
return round($bytes, $precision) . ' ' . $units[$pow];
}
Gruss Raffi
Offline
Denke von der Logik der droplets an folgendes:
Das Droplet wird irgendwo im Code aufgerufen, erzeugt etwas und gibt einen entsprechenden code zurück.
Wenn alle Systeme durchlaufen sind, wirft das CMS den eigentlichen html-Code aus.
Sobald du Funktionen einbaust, die etwas direkt ausgeben, funktioniert das nicht mehr, weil dann der code ausgeworfen wird, obwohl der eigentliche html-Code noch gar nicht fertig gebastelt ist.
Somit hatte dein echo zur Folge, dass der Code ausgeworfen wurde BEVOR der eigentliche html Code vom cms ausgeworfen wurde.
Also egal was du in droplets bastelst, sobald irgendetwas direkt ausgeworfen wird (echo, print, Fehlermeldunge) entstehen die vor dem eigentlichen <html>...
grundprinzip:
Bastle einen Content-Container, in dem du alles reinpackst.
$inhalt = "";
function irgendwas(diverses) {
$diverses berechnen;
};
$wert = irgendwas(diverses);
$inhalt .= $wert;
$inhalt .= "irgend ein Inhalt 2";
$inhalt .= "irgend ein Inhalt 3";
return $inhalt;
((das .= bedeutet, dass der inhalt dieses Parameters um diesen Wert erweitert wird.))
Wenn fertig, wirf diesen Inhalt mit "return" zurück.
Wenn man das versteht, kannst eigentlich für (fast) alles ein droplet bauen ;-)
Offline
florian
Sodele,
anbei das Droplet mit Dateigrößenumrechnung.
Schön wär jetzt noch, das Filedatum in Formatierung der gewählten Sprach auszuspucken - da hab ich grade keinen Plan wie.
Und mit der Übergabe von $pfad sollte man noch was machen, wenn ich (hier bei mir lokal) z.B. keinen Pfad übergebe lande ich erbarmungslos auf dem Wurzelverzeichnis der Festplatte ;-)
Dann würde das Dingens langsam richtig rund ...
... nein in Europa verwenden wir beim Programmieren nicht € statt $ ...
Offline
florian, ecology
Hier geht's weiter... -> https://forum.wbce.org/viewtopic.php?id=1099
Offline