Ergebnis 1 bis 8 von 8

Thema: Individueller Backendupload für Mitglieder mit automatischer E-Mailbenachrichtigung

  1. #1
    Contao-Nutzer
    Registriert seit
    26.09.2016.
    Beiträge
    7

    Standard Individueller Backendupload für Mitglieder mit automatischer E-Mailbenachrichtigung

    Ich habe den Fall, dass ein Backendnutzer in das individuelle Home-Verzeichnis von Mitgliedern Dateien hochladen und das Mitglied automatisch eine E-Mail erhalten soll, wenn ein neues Dokument in den jeweiligen Ordner hochgeladen wurde.
    Damit Fehlerquellen, z.B. Upload in das falsche Nutzerverzeichnis minimiert werden, plane ich, dass der Benutzer ein Mitglied bearbeitet und dort ein Uploadfeld ist, was automatisch in das Home-Verzeichnis des ausgewählten Mitglieds die Dateien hochladen soll.

    Jetzt meine Fragen:
    1. Gibt es eine Möglichkeit, relativ simpel ein solches Uploadfeld zu implementieren?
    2. Wie ließe sich eine automatische E-Mailbenachrichtigung bei erfolgreichen Upload an das Mitglied realisieren?

    Ich danke für Hilfe und Denkanstöße.

  2. #2
    Contao-Fan
    Registriert seit
    24.02.2021.
    Beiträge
    984
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Erste Frage:
    Mir ist derzeit keine simple Möglichkeit bekannt. Könntest dir natürlich das Upload-Verhalten mit Fine-Uploader nochmal in einer eigenen Backendmaske mit Selectauswahl der Mitglieder programmieren und Überprüfung Directory, womöglich sehr viel Aufwand, möglich sicherlich aber kann ich aus dem Stegreif nicht einschätzen.

    Zur zweiten Frage
    - PostUpload Hook: https://docs.contao.org/dev/reference/hooks/postUpload/
    - Überprüfe die Pfade, schaue ob es eine Übereinstimmung mit einem Member-Directory gibt.
    - Sende eine E-Mail Benachrichtigung an member email

  3. #3
    Contao-Nutzer
    Registriert seit
    26.09.2016.
    Beiträge
    7

    Standard

    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.

  4. #4
    Contao-Fan
    Registriert seit
    24.02.2021.
    Beiträge
    984
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Wie immer:
    Nutze den Debug-Modus und poste den Stacktrace

  5. #5
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.925
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von fbrk Beitrag anzeigen
    Damit Fehlerquellen, z.B. Upload in das falsche Nutzerverzeichnis minimiert werden, plane ich, dass der Benutzer ein Mitglied bearbeitet und dort ein Uploadfeld ist, was automatisch in das Home-Verzeichnis des ausgewählten Mitglieds die Dateien hochladen soll.
    Ich würde bei den Mitgliedern ein entsprechendes Upload-Widget einbauen, d. h. der "Redakteur" öffnet die Eingabemaske des entsprechenden Mitglieds und läd die Dateien dort hoch - der Zielpfad wird auf das aktuelle Home-Verzeichnis gesetzt.

  6. #6
    Contao-Nutzer
    Registriert seit
    26.09.2016.
    Beiträge
    7

    Standard

    Zitat Zitat von zoglo Beitrag anzeigen
    Wie immer:
    Nutze den Debug-Modus und poste den Stacktrace
    Hier ist der Stacktrace:

    Code:
    ArgumentCountError:
    Too few arguments to function Contao\DcaLoader::{closure}(), 0 passed in /www/htdocs/contao-2023-03/vendor/contao/core-bundle/src/Resources/contao/modules/ModuleRegistration.php on line 78 and exactly 1 expected
    
      at src/Resources/contao/dca/tl_member.php:23
      at Contao\DcaLoader->{closure}()
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleRegistration.php:78)
      at Contao\ModuleRegistration->compile()
         (vendor/contao/core-bundle/src/Resources/contao/modules/Module.php:214)
      at Contao\Module->generate()
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleRegistration.php:55)
      at Contao\ModuleRegistration->generate()
         (vendor/contao/core-bundle/src/Resources/contao/elements/ContentModule.php:98)
      at Contao\ContentModule->generate()
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:623)
      at Contao\Controller::getContentElement(object(ContentModel), 'main')
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:197)
      at Contao\ModuleArticle->compile()
         (vendor/contao/core-bundle/src/Resources/contao/modules/Module.php:214)
      at Contao\Module->generate()
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:70)
      at Contao\ModuleArticle->generate(false)
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:551)
      at Contao\Controller::getArticle(object(ArticleModel), false, false, 'main')
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:393)
      at Contao\Controller::getFrontendModule('0', 'main')
         (vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:194)
      at Contao\PageRegular->prepare(object(PageModel))
         (vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:61)
      at Contao\PageRegular->getResponse(object(PageModel), true)
         (vendor/contao/core-bundle/src/Resources/contao/controllers/FrontendIndex.php:320)
      at Contao\FrontendIndex->renderPage(object(PageModel))
         (vendor/symfony/http-kernel/HttpKernel.php:163)
      at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
         (vendor/symfony/http-kernel/HttpKernel.php:75)
      at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
         (vendor/symfony/http-kernel/Kernel.php:202)
      at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
         (web/index.php:44)

  7. #7
    Contao-Nutzer
    Registriert seit
    26.09.2016.
    Beiträge
    7

    Standard

    Manchmal sieht man den Wald vor lauter Bäumen nicht.

    Mir ist glaube ich eben der Fehler aufgefallen.

    Ich hatte ursprünglich den Fehler gemacht, die MemberID in dem Dateipfad zu hinterlegen. Dabei wird nicht die Member-ID sondern der Benutzername als Home-Verzeichnis angegeben.
    Ich teste gleich mal was aus und poste nochmal den Code für alle, wenn ich erfolgreich bin.
    Geändert von fbrk (21.10.2024 um 12:57 Uhr)

  8. #8
    Contao-Nutzer
    Registriert seit
    26.09.2016.
    Beiträge
    7

    Standard

    Es funktioniert nun.

    Sobald ich ein Mitglied bearbeite, habe ich ein Uploadfeld, das auf das Home-Verzeichnis des aktuellen Mitglieds verweist.

    So habe ich das nun umgesetzt:

    src/EventListener/MemberUploadListener.php

    PHP-Code:
    <?php

    // Datei: src/EventListener/MemberUploadListener.php

    namespace App\EventListener;

    use 
    Contao\DataContainer;

    class 
    MemberUploadListener
    {
        
    /**
         * Callback für den onload_callback in tl_member
         *
         * @param DataContainer|null $dc
         */
        
    public function onLoadCallback(DataContainer $dc null)
        {
            if (
    $dc && $dc->id) {
                
    // Pfad dynamisch basierend auf der Mitglieds-ID
                
    $GLOBALS['TL_DCA']['tl_member']['fields']['documentUpload']['eval']['path'] = 'files/customers/' $dc->id;
            }
        }
    }
    src/Resources/contao/dca
    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',
            
    'path'       => '',
        ],
        
    'sql'       => "binary(16) NULL",
    ];

    Contao\CoreBundle\DataContainer\PaletteManipulator::create()
        ->
    addField(['documentUpload'], 'language'Contao\CoreBundle\DataContainer\PaletteManipulator::POSITION_AFTER)
        ->
    applyToPalette('default''tl_member');
    und die services.yml
    Code:
    services:
        App\EventListener\MemberUploadListener:
            tags:
                - { name: contao.callback, table: tl_member, target: config.onload }
    Im nächsten Schritt versuche ich nun den PostUpload Hook einzubauen und eine E-Mailbenachrichtigung an die member mail zu versenden.
    Geändert von fbrk (21.10.2024 um 13:04 Uhr)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •