Tipps und Tricks Filter
Das Datenbank gestützte Filesystem
Modul Anpassungen für Contao 3.0/3.1
Contao 3 speichert nun nicht mehr die Dateipfade + Dateiname z.B. im Feld singleSRC sondern eine Zahl.
(der Pfad + Dateiname steht nun zentralisiert in einer anderen Tabelle)
Auch beim Update von Contao 2 auf 3 hat der Updater eine Methode updateFileTreeFields für alle fileTree Typen im DCA. Der wandelt alles um beim Update, was den Typ fileTree im DCA hat.
Im Falle meines Banner Moduls z.B. heißt das, wähle ich im Backend ein Bild aus, steht nach dem Speichern kein Pfad sondern eine Zahl im Feld banner_image.
Beim Anzeigen im Frontend, im Backend (DCA Ausgabe) oder im Callback Backend Modul muss nun aus der Zahl wieder der gesuchte Pfad und Dateiname werden. Hier mal ein Auszug wie das geht.
// in singleSRC Spalte steht nun eine Zahl (Contao < 3.2)
// Check for version 3 format
if (!is_numeric($this->singleSRC))
{
return '<p class="error">'.$GLOBALS['TL_LANG']['ERR']['version2format'].'</p>';
}
$objFile = \FilesModel::findByPk($this->singleSRC);
$this->singleSRC = $objFile->path;
Nun ist in $this->singleSRC wieder das gesuchte wie in Contao 2.
Wer sein Modul für 2.9 und 3.x kompatibel machen will, der müsste das etwas abändern. Wenn keine Zahl, dann die Ermittlung überspringen statt Fehlermeldung.
Die Art der Rückmeldung mit dem Versionshinweis, wenn irgendwie doch noch der Pfad und nicht eine Zahl enthalten ist, muss natürlich angepasst werden, jenachdem wo ich mich grad befinde (BE DCA, FE, BE Callback)
Modul Anpassungen ab Contao 3.2
Für Contao 3.2 muss nochmal etwas angepasst werden, da nun keine Zahl sondern eine UUID im Feld steht die als String erkannt werden würde beim "is_numeric" Test. Daher hier ein anderes Beispiel aus Contao 3.2:
// nur für Contao 3.2
$objFile = \FilesModel::findByUuid($this->singleSRC);
// für Contao 3.x, auch in 3.2
// $objFile = \FilesModel::findByPk($this->singleSRC);
// findByPK erkennt selbst ob ID oder UUID
// in $objFile->path steht nun wieder der Pfad+Dateiname
// Test auf altes Format
if ($objFile === null)
{
if (!Validator::isUuid($this->singleSRC))
{
return '<p class="error">'.$GLOBALS['TL_LANG']['ERR']['version2format'].'</p>';
}
return '';
}
Das Feld muss dabei "binary" werden indem die UUID gespeichert werden soll.
'sql' => "binary(16) NULL"
