Ich bin gerade dabei, eine Website mit vielen Bildern unter Contao 5.2.8 neu aufzusetzen. Es gibt viele Galerien, die eine Ansicht in der Lightbox erlauben. Hat ein Bild einen Titel, so wird der dort auch angezeigt. Keines der Bilder hatte bisher einen Titel, aber "sprechende Dateinamen" - die wollte ich nutzen. Also habe ich mir ein Skript geschrieben, dass die Datenbankeinträge so anpasst, dass der Dateiname (ohne Endung) für den Titel eingesetzt wird.

Bei meiner Suche im Forum hatte ich gesehen, dass hier und da auch andere danach gesucht haben, daher hier mein Skript. Hat bei mir gut funktioniert, ich übernehme aber keine Garantie...

Wichtig: Basiert auf dem Export aus phpMyAdmin. Das Datenbank-Backup aus dem Contao-Manager ist anders aufgebaut. Geht vermutlich auch, braucht aber eine Reihe von Anpassungen.

PHP-Code:
<?php

/*
Skript zum Kopieren der Dateinamen ins Feld "title"
Getestet unter Contao 5.2.8 und phpMyAdmin 5.2.1
Wie üblich: Ich übernehme keine Garantie und jeder wendet das in eigener Verantwortung an... 
1) Ggf. über die Systemwartung die Datenbank aufräumen (wenn nötig alte Versionen und Log-Einträge entfernen)
2) In phpMyAdmin die Datenbank exportieren (als SQL)
3) Das sollte eine Textdatei in UTF-8 ergeben
4) Alle Zeilen von tl_files hinter "-- Daten für Tabelle `tl_files`" kopieren und in eine Datei "files_in.txt" speichern (in UTF-8!)
    Die (meisten) Zeilenanfänge bei mir sind dann so:
    (Zahl, Wert, Zahl, Wert, 'folder', 'files/...',...
    !! Das sieht beim Datenbank-Backup über den Contao-Manager anders aus, dann muss man Anpassungen am Programm vornehmen !! 
5) Man braucht einen "key", um die Zeilen zu erkennen, die man bearbeiten möchte, ich habe die Ordnernamen genommen, 
    alle zu bearbeitenden Dateien waren im Verzeichnis files/Name/fotos und Unterverzeichnissen davon
6) Für die Eigenschaften der Bilder z.B. Titel / Untertitel gibt es ein binäres Feld (blob) an vorletzter Stelle der Zeilen. 
    Dort steht NULL, wenn noch nichts angelegt wurde oder ein Wert mit 0x... wenn was angelegt wurde
    Beim Backup aus dem Manager gibt es noch die Variante von serialisierten Elementen, die fangen dann z.B. mit a:1 an 
    (wenn es nur eine Sprachvariante gibt). Beim Export aus phpMyAdmin gab es die (bei mir) nicht - das macht die Sache einfacher
7) Für diese Stelle in der Zeile wird ein neues Element erzeugt oder das bestehende in einen binären Wert umgewandelt und deserialisiert
8) Der Dateiname (ohne Endung) wird im Feld "Titel" eingefügt und dann wieder serialisiert und in einen hex-Wert umgewandelt
9) und die gesamte Zeile wieder hergestellt und ausgegeben. 
10) Die umgewandelten Zeilen an der ursprünglichen Stelle in die exportierte Datei einfügen 
    (muss die gleiche Anzahl von Zeilen haben! Sonst ist was schief gegangen)
11) Und dann wieder in eine Datenbank importieren. Vielleicht erst mal in eine Test-Datenbank... ;-)
*/

$db_in file("files_in.txt");
$db_out "files_out.txt";

// Suchstring
$key "files/Name/fotos/";      // Anpassen!!

// $separator = " VALUES ";        // Für andere Art des Datenbank-Exports/Backups -> braucht dann etliche Anpassungen!     
$separator2 ", ";


// Ausgabefunktion
function writeLine($str) {
    global 
$db_out;
    
file_put_contents($db_out$strFILE_APPEND);
}

function 
setTitleSerializeAndHex($arr,$str) {  // und hängt 0x davor
    
if ($arr["de"]["title"]=="") {   // Nur einsetzen, wenn noch kein Wert vorhanden
        
$arr["de"]["title"] = $str;
    }
    
$e serialize($arr);
    
$e "0x".bin2hex($e);
    return(
$e);
}

// Zeilenweise einlesen
$count=0;
$output "";
$arr = [];
$arr2 =[];
$filename "";
$newOutput "";
$tmp "";
$pos = -1;
$element "";
$outArr = [];

for(
$i=0;$i count($db_in); $i++){
    
$output $db_in[$i];
    
$newOutput "";
    
    if (!
str_contains($db_in[$i],$key)) {
        
writeLine($output);
        continue;
    }

    
// Nur die, die 'file' sind... 
    
$arr2 explode("'file'",$output);
    if (
count($arr2)!=2) {
        
writeLine($output);
        continue;
    }
    
$newOutput $newOutput.$arr2[0]."'file'";
    
    
// Nur jpg (oder erweitern)
    
$tmp strtolower($arr2[1]);
    
$pos strpos($tmp,".jpg");
    if (
$pos === false) { // nicht vorhanden
        
writeLine($output);
        continue;
    }

    
$filename substr($arr2[1],0,$pos);
    
$pos strrpos($filename,"/");
    
$filename substr($filename,$pos+1);
            
    
// Wir unterteilen zunächst bei den Kommas (die können auch in den Strings stehen!) und nehmen das vorletzte Element
    
$arr2 explode($separator2,$arr2[1]);
    
$element $arr2[count($arr2)-2];
            
    if (
$element=="NULL" ) {
        
$outArr = [
            
"de" => [
                
"title" => "",
                
"alt" => "",
                
"link" => "",
                
"caption" => "",
                
"license" => "",
            ]
        ];
        
$arr2[count($arr2)-2] = setTitleSerializeAndHex($outArr,$filename);
        
$newOutput $newOutput.implode($separator2,$arr2) ;
    } else {
        if(
substr($element,0,2)=="0x") {
            
$element hex2bin(substr($element,2));
            
$outArr unserialize($element);
            
$arr2[count($arr2)-2] = setTitleSerializeAndHex($outArr,$filename);
            
$newOutput $newOutput.implode($separator2,$arr2) ;
        } else {        
// Beim Backup aus dem Manager gab es auch eine serialisierte Variante, 
                        //  wenn im Text für den Blob keine Sonderzeichen standen
            
echo "Wert ist weder NULL noch beginnt er mit 0x - kontrollieren!<br>";
        } 
    }

    
// echo $output."<br>";
    
echo $newOutput."<br><br>";
    
    
$count++;

    
writeLine($newOutput);
}

echo 
"Es sind: ".$count." geänderte Zeilen";

exit;


?>
Kann eine Menge Arbeit sparen...