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)-4, 4, true) != 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!