Liebe Contao-Experten!
Bin in Contao 3.2.13 auf folgendes Problem gestoßen und würde gerne Eure Einschätzung hören, ob das ein Bug ist.
Ich habe im Frontend ein Login-Formular für registrierte Mitglieder, welches zu einer Seite mit dem Modul "Persönliche Daten" weiterleitet. Die Felder des Moduls habe ich ergänzt um ein Feld für einen Foto-Upload:
PHP-Code:
$GLOBALS['TL_DCA']['tl_member']['fields']['foto'] = array
(
'label' => &$GLOBALS['TL_LANG']['tl_member']['foto'],
'exclude' => true,
'search' => true,
'inputType' => 'upload',
'eval' => array('mandatory' => false,'feEditable' => true,'feViewable' => true,'feGroup' => 'address','tl_class'=>'clr long','extensions'=>$GLOBALS['TL_CONFIG']['uploadTypes'], 'storeFile'=>true, 'uploadFolder' => $this->User->homeDir, 'readonly' => false),
'sql' => "text NULL"
);
Das Upload-Feld wird im Frontend angezeigt und der Upload funktioniert, d.h. die Datei wird im korrekten Verzeichnis abgelegt. Soweit alles gut.
Nun hätte ich aber gerne, dass der Name (oder die UUID) der hochgeladenen Datei auch in der Datenbank in der Tabelle 'tl_member' gespeichert wird. Die entsprechende Spalte 'foto' ist ja in der DCA konfiguriert und nach Datenbank-Update auch in der Datenbank vorhanden. Nur wird da leider nichts drin gespeichert. Bei allen anderen Feldern des Moduls "Persönliche Daten" funktioniert das Speichern in der Datenbank einwandfrei.
Ich bin mal in den PHP-Code abgestiegen und soweit ich sehe passiert hier Folgendes:
Das Modul "Persönliche Daten" ist in der Datei "system/modules/core/modules/ModulePersonalData.php" kodiert. Dort wird nacheinander für alle Felder/Widgets des Formulars die Methode validate() aufgerufen und der Feldwert abgefragt (Zeilen 194-195):
$objWidget->validate();
$varValue = $objWidget->value;
Dieser Wert wird dann im Member Model abgelegt (Zeile 265) und das Model wird gespeichert (Zeile 284), also in die Datenbank geschrieben.
Für das Feld 'upload' ist die Methode validate() in der Datei "system/modules/core/forms/FormFileUpload.php" definiert. Aber diese Methode gibt soweit ich sehen kann gar keinen Wert zurück. Die Methode checkt erstmal auf mögliche Fehler. Wenn kein Fehler vorhanden ist, wird die Datei auf dem Server abgelegt, eine UUID kreiert und der Ordner-Hash aktualisiert. Schließlich werden die Datei-Infos in der Session gespeichert und es wird ein Log-Eintrag generiert. Und das war's. Was ich dort NICHT sehe, ist so etwas wie
$this->varValue = $file['name'];
oder irgendeine andere Zuweisung eines Wertes an $this->varValue. Damit bleibt aber auch im Modul "Persönliche Daten" das $objWidget->value in Zeile 195 undefiniert, und also wird auch nichts im Member Model bzw. in der Datenbank gespeichert.
Nach dieser langen Vorrede jetzt zwei Fragen:
1) Stimmt das soweit oder habe ich was übersehen?
2) Falls es stimmt, ist das ein Bug oder gibt es irgendwelche wichtigen Gründe, warum das Upload-Widget keinen Wert zurückgibt? Anders gefragt: Spricht etwas dagegen, die Methode validate() in der "FormFileUpload.php" folgendermaßen zu ändern (ab Zeile 259):
PHP-Code:
// Add the session entry (see #6986)
$_SESSION['FILES'][$this->strName] = array
(
'name' => $file['name'],
'type' => $file['type'],
'tmp_name' => TL_ROOT . '/' . $strFile,
'error' => $file['error'],
'size' => $file['size'],
'uploaded' => true,
'uuid' => \String::binToUuid($objFile->uuid)
);
// Set the value
$this->varValue = $file['name']; // alternativ die UUID oder das ganze Array aus der $_SESSION['FILES']
// Add a log entry
$this->log('File "'.$file['name'].'" has been moved to "'.$strUploadFolder.'"', __METHOD__, TL_FILES);
Wäre Euch sehr dankbar für Eure Einschätzungen!
Lesezeichen