Vielen Dank für den Denkanstoß.
In der Zwischenzeit habe ich mich mit dem ersten Teil nochmal beschäftigt und habe es hinbekommen, dass ich im Bearbeitungsmodus eines Mitglieds ein Uploadfeld habe, das auch nur das Home-Verzeichnis des ausgewählten Mitglieds anzeigt wie gewünscht.
Irgendwas ist allerdings trotzdem schief gelaufen, denn im Frontend wird nun ein Fehler bei den Seiten produziert, auf denen ich das Login und das Registrierungsmodul eingebunden habe.
Folgendes habe ich angelegt:
src/EventListener/MemberUploadListener.php
PHP-Code:
<?php
// Datei: src/EventListener/MemberUploadListener.php
namespace App\EventListener;
use Contao\CoreBundle\ServiceAnnotation\Hook;
use Contao\DataContainer;
class MemberUploadListener
{
/**
* @Hook("onSubmitCallback")
*/
public function onOnsubmitCallback(DataContainer $dc): void
{
// Code, der ausgeführt werden soll, wenn das Mitglied bearbeitet wird
if ($dc->table === 'tl_member') {
//Den Benutzernamen nutzen, um das Verzeichnis zu erstellen
$member = \Contao\MemberModel::findByPk($dc->id);
if ($member !== null && $member->username) {
$memberDirectory = 'files/customers/' . $member->username;
if (!is_dir(TL_ROOT . '/' . $memberDirectory)) {
\System::getContainer()->get('filesystem')->mkdir(TL_ROOT . '/' . $memberDirectory);
}
}
}
}
}
src/Resources/contao/dca/tl_member.php
PHP-Code:
<?php
// Datei: src/Resources/contao/dca/tl_member.php
$GLOBALS['TL_DCA']['tl_member']['fields']['documentUpload'] = [
'label' => ['Dokument hochladen', 'Laden Sie ein Dokument in das Home-Verzeichnis dieses Mitglieds hoch.'],
'inputType' => 'fileTree',
'eval' => ['filesOnly'=>true, 'fieldType'=>'radio', 'tl_class'=>'clr', 'extensions'=>'pdf,doc,docx', 'folder'=> '',],
'sql' => "binary(16) NULL",
];
// Callback hinzufügen, um den Ordner für das Uploadfeld zu setzen
$GLOBALS['TL_DCA']['tl_member']['fields']['documentUpload']['eval']['folder'] = function ($dc) {
$memberId = $dc->id;
return 'files/customers/' . $memberId;
};
// onload_callback hinzufügen
$GLOBALS['TL_DCA']['tl_member']['config']['onload_callback'][] = function (\DataContainer $dc) {
// Prüfung, ob die ID des Mitglieds vorhanden ist
if ($dc->id) {
// Zielverzeichnis dynamisch basierend auf der Mitglieds-ID
$GLOBALS['TL_DCA']['tl_member']['fields']['documentUpload']['eval']['path'] = 'files/customers/' . $dc->id;
}
};
$GLOBALS['TL_DCA']['tl_member']['fields']['documentUpload'] = [
'label' => ['Dokument hochladen', 'Laden Sie ein Dokument in das Home-Verzeichnis dieses Mitglieds hoch.'],
'inputType' => 'fileTree',
'eval' => [
'filesOnly' => true,
'fieldType' => 'radio',
'tl_class' => 'clr',
'extensions'=> 'pdf,doc,docx',
'path' => '', // Dieser Wert wird über den onload_callback gesetzt
],
'sql' => "binary(16) NULL",
];
// Das Feld dem Paletten-Array hinzufügen, um es im Backend anzuzeigen.
Contao\CoreBundle\DataContainer\PaletteManipulator::create()
->addField(['documentUpload'], 'language', Contao\CoreBundle\DataContainer\PaletteManipulator::POSITION_AFTER)
->applyToPalette('default', 'tl_member');
In der services.yml habe ich folgenden Eintrag hinterlegt:
Code:
# Datei: config/services.yml
services:
App\EventListener\MemberUploadListener:
tags:
- { name: 'contao.hook', hook: 'onSubmitCallback' }
Nun erhalte ich nach Aufruf der Loginseite im Frontend folgende Meldung:
Code:
[2024-10-21T09:05:13.259246+02:00] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2024-10-21T09:05:13.301089+02:00] request.CRITICAL: Uncaught PHP Exception ArgumentCountError: "Too few arguments to function Contao\DcaLoader::{closure}(), 0 passed in .../vendor/contao/core-bundle/src/Resources/contao/modules/ModuleRegistration.php on line 78 and exactly 1 expected" at ../var/cache/prod/contao/dca/tl_member.php line 221 {"exception":"[object] (ArgumentCountError(code: 0): Too few arguments to function Contao\\DcaLoader::{closure}(), 0 passed in .../vendor/contao/core-bundle/src/Resources/contao/modules/ModuleRegistration.php on line 78 and exactly 1 expected at .../var/cache/prod/contao/dca/tl_member.php:221)"} []
Aktuell komme ich da nicht weiter. Hat jemand einen Tipp, wie ich den Fehler beheben kann?
Vielen Dank.