prepare('INSERT INTO plugin_beispiel_log (ticket_id, event, created_at) VALUES (?,?,?)')->execute([$e['ticketId'], 'created', db_now()]); }); plugin_add_hook('ticket.status_changed', function (array $e) { $pdo = get_db(); $pdo->prepare('INSERT INTO plugin_beispiel_log (ticket_id, event, created_at) VALUES (?,?,?)')->execute([$e['ticketId'], 'status_changed', db_now()]); }); // Baustein in der Ticketansicht (Plugins liefern fertiges HTML und müssen Ausgaben selbst escapen) plugin_add_filter('ticket.view.sidebar', function (string $html, array $ctx) { $stmt = get_db()->prepare('SELECT COUNT(*) FROM plugin_beispiel_log WHERE ticket_id = ?'); $stmt->execute([$ctx['ticketId']]); return $html . '
Protokoll-Plugin
' . (int) $stmt->fetchColumn() . ' Ereignis(se) zu diesem Ticket
'; }); plugin_register_menu('Ticket-Protokoll', 'log'); plugin_register_api('count', function (array $staff, array $request): array { return ['count' => (int) get_db()->query('SELECT COUNT(*) FROM plugin_beispiel_log')->fetchColumn()]; }); plugin_add_hook('cron.run', function () { plugin_set_setting('beispiel', 'last_cron', db_now()); }); // Aufräumen beim Entfernen mit "Daten löschen" plugin_add_hook('plugin.uninstall.beispiel', function () { get_db()->exec('DROP TABLE IF EXISTS plugin_beispiel_log'); });