Ergebnis 1 bis 7 von 7

Thema: Hook + Callbacks werden nur im Debug-Modus ausgeführt

  1. #1
    Contao-Nutzer
    Registriert seit
    18.01.2019.
    Beiträge
    15

    Standard Hook + Callbacks werden nur im Debug-Modus ausgeführt

    Hallo zusammen,

    ich habe ein seltsames Phänomen, für das ich bisher noch keine Lösung gefunden habe.

    Für diverse Automatismen beim Upload von Audiodateien habe ich eine DCA-Erweiterung sowie zwei Callbacks und einen Hook geschrieben:

    1) Neues Feld im DCA für die Laufzeit der Audiodatei in Sekunden, hinzugefügt über Datei \contao\dca\tl_files.php - das funktioniert auch.

    2) Callback, der bei allen nicht-mp3-Dateien dieses Feld in der Dateiverwaltung ausblenden soll:
    in Datei \src\EventListener\DataContainer\AudioLaufzeitAusb lendenCallback.php :
    PHP-Code:
    namespace App\EventListener\DataContainer;

    use 
    Contao\CoreBundle\DataContainer\PaletteManipulator;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsCallback;
    use 
    Contao\DataContainer;

    class 
    AudioLaufzeitAusblendenCallback
    {
        
    #[AsCallback(table: 'tl_files', target: 'config.onload')]
        
    public function onLoadCallback(DataContainer|null $dc null): void
        
    {
            if (
    null === $dc || !$dc->id || strlen($dc->id) <= 4) {
                return;
            }

            if (
    substr_compare($dc->id'.mp3'strlen($dc->id)-44true) != 0) {
                
    PaletteManipulator::create()
                ->
    removeField('audio_laufzeit')
                ->
    applyToPalette('default''tl_files');
            }
        }

    3) Zweiter Callback, der beim Speichern der Metadaten den Titel im id3-Tag der MP3-Datei speichert
    in Datei \src\EventListener\DataContainer\Id3TagAktualisier enCallback.php , hier jetzt auf das (hoffentlich) wesentliche verkürzt:
    PHP-Code:
    namespace App\EventListener\DataContainer;

    use ...

    class 
    Id3TagAktualisierenCallback
    {
        
    #[AsCallback(table: 'tl_files', target: 'config.onsubmit')]
        
    public function onLoadCallback(DataContainer|null $dc null): void
        
    {
            ... 
    diverses Zeug ...
        }

    4) Ein Hook, der nach dem Upload einer Audiodatei die Laufzeit ermittelt und in dem neuen Feld speichert:
    in Datei \src\EventListener\AudioUploadListener.php , ebenfalls verkürzt:
    PHP-Code:
    namespace App\EventListener;

    use 
    Contao\ContentModel;
    use 
    Contao\Email;
    use 
    Contao\FilesModel;
    use 
    Contao\System;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
    use 
    Contao\CoreBundle\Monolog\ContaoContext;

    #[AsHook('postUpload')]
    class PredigtUploadListener
    {

        const 
    REGEX_MP3 '...';

        public function 
    __invoke(array $arrFiles): void {
            foreach (
    $arrFiles as $pfad) {
                if (
    preg_match(self::REGEX_MP3$pfad) > 0) {
                    
    $file FilesModel::findByPath($pfad);
                                
                    if (
    $file !== null) {            

                        
    $laenge = ... über eine Library auslesen...
                        
                        
    $file->audio_laufzeit $laenge;
                        
    $file->save();
                    }
                }
            }
        }

    Problem:
    Bei eingeschaltetem Debug-Modus funktioniert das alles wunderbar, es ist kein Fehler zu erkennen. Sobald der Debug-Modus aus ist, passiert jedoch gar nichts mehr - weder die Callbacks noch der Hook funktionieren dann noch.
    Fehlt hier noch irgendetwas bei der Registrierung oder dergleichen? Ich hatte das Handbuch so verstanden, dass durch die PHP-Attribute keine weiteren Dinge (wie z.B. eine services.yaml o.ä.) mehr nötig wären. Oder doch?

    Danke schon mal!

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.161
    Partner-ID
    10107

    Standard

    Zitat Zitat von Steinbam Beitrag anzeigen
    Oder doch?
    Ohne Debug-Modus musst du (bei allen Änderungen dieser Art) immer composer install -o ausführen - bzw. cache:clear --no-warmup && cache:warmup (Anwendungs Cache neu aufbauen) bzw. vendor/bin/contao-setup
    Geändert von Spooky (02.12.2024 um 21:49 Uhr)
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    18.01.2019.
    Beiträge
    15

    Standard

    Danke für die Rückmeldung!
    Diese Schritte habe ich natürlich schon mehrmals ausgeführt (über den Contao-Manager). Seit ich die Dateien angelegt habe, habe ich auch das letzte Update auf Contao 5.3.19 durchgeführt, bei dem das ja auch(?) gemacht wird.

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.161
    Partner-ID
    10107

    Standard

    Welche Services stehen dir zur Auswahl, wenn du
    Code:
    bin/console debug:container "App\\" --env=prod
    ausführst?
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    18.01.2019.
    Beiträge
    15

    Standard

    Aaaahh, das war der entscheidende Schritt!
    Beim Ausführen des Befehls auf der Konsole kam eine Exception zum Vorschein, die sonst nirgendwo aufgetreten ist. In einer Klasse, in der ich die Daten für den ID3-Tag der MP3-Datei aufbereite, habe ich per require_once die Library zur Editierung der MP3-Dateien eingebunden. Da habe ich bisher die Umgebungsvariable $_SERVER['DOCUMENT_ROOT'] für den Pfad zu der Library verwendet. Diese Variablen gibt es ja wohl nur beim Aufruf über den Webserver, nicht die Konsole.
    Ich habe die Variable entfernt und den Pfad komplett angegeben - nun funktioniert es auch bei ausgeschaltetem Debug-Modus! Danke!!

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.161
    Partner-ID
    10107

    Standard

    Uff, wieso holst du dir das so mit require_once? Autoloade das doch lieber, wenn es diese Libary nicht ohnehin über Composer gibt.
    Geändert von Spooky (03.12.2024 um 08:06 Uhr)
    » sponsor me via GitHub or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    18.01.2019.
    Beiträge
    15

    Standard

    Ja, das ist in der Tat etwas "rustikal". Das ist eine uralte Library, die ich schon seit vielen Jahren im Einsatz habe, auch mit unserer handgestrickten Vorgänger-Webseite.
    Ich werde mal schauen, wie sich das modernisieren lässt...

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
  •