WBCE CMS Forum

WBCE CMS – Way Better Content Editing.

Du bist nicht angemeldet.

#1 07.03.2017 21:40:48

ecology
Mitglied

Droplet fliegt aus dem Layout

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

#2 07.03.2017 21:54:41

florian
Administrator

Re: Droplet fliegt aus dem Layout

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

#3 08.03.2017 00:32:04

ecology
Mitglied

Re: Droplet fliegt aus dem Layout

Vielen Dank... Dabei wollte ich ein hübsches Droplet machen...  sad

Offline

#4 08.03.2017 01:29:48

bernd
Developer

Re: Droplet fliegt aus dem Layout

Die Erklärung des "Versagens" findet sich in der Droplet Hilfe:

Droplet Readme schrieb:

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

Liked by:

florian, thanks

#5 08.03.2017 08:03:33

florian
Administrator

Re: Droplet fliegt aus dem Layout

Funktioniert tadellos.
Anbei der Code als Zip zum Import via Droplet-Tool.


Code allein macht nicht glücklich. Jetzt spenden!

Offline

#6 08.03.2017 19:27:10

ecology
Mitglied

Re: Droplet fliegt aus dem Layout

Juhuu.
So cool. thumb_up
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

#7 09.03.2017 08:07:31

florian
Administrator

Re: Droplet fliegt aus dem Layout

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

#8 09.03.2017 20:23:44

ecology
Mitglied

Re: Droplet fliegt aus dem Layout

florian schrieb:

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

#9 09.03.2017 20:52:05

berny
Mitglied

Re: Droplet fliegt aus dem Layout

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

Liked by:

florian

#10 09.03.2017 22:27:36

bernd
Developer

Re: Droplet fliegt aus dem Layout

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

Liked by:

florian, ecology

#11 22.03.2017 15:47:34

ecology
Mitglied

Re: Droplet fliegt aus dem Layout

Offline

Fußzeile des Forums

up