Ergebnis 1 bis 32 von 32

Thema: Contao Framework initialize() und getDBConnection in separater Datei per Ajax

  1. #1
    Alter Contao-Hase
    Registriert seit
    28.09.2010.
    Beiträge
    1.364

    Standard Contao Framework initialize() und getDBConnection in separater Datei per Ajax

    Hallo,

    ich bin schon eine Weile raus und suche Hilfe, wie ich in einer "blanken" Datei das Contao Framework initialisieren kann und die DB Klasse für die Verwendung laden kann.

    Eine Datei wird per AJAX Post angesprochen und ich möchte dort manuelle DB Abfragen starten / auswerten.

    PHP-Code:
    $result = \Database::getInstance()->prepare("SELECT * FROM tl_log")->execute(); 
    funktioniert so ja in einer leeren Datei nicht.

    Danke für Hinweise


    Mark

  2. #2
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Hallo, ja sowas suche ich auch. Momentan verwende ich eigene Dateien und baue dort nach herkömmlichen, harten Wege die DB Verbindung auf und frage auch die Tabellen ohne Framework ab.
    Ich hätte aber gerne in einer leeren Datei das Contao Framework initialisiert, die DB Klasse eingebunden und dann verwendet. Auf https://docs.contao.org/dev/reference/services/ ist ganz oben so ein Beispiel, aber da fehlt noch ein oder mehrere includes, um die Contao-Dateien auch einzubinden und das Framework letztendlich zu initialisieren und verwenden zu können. So ein "von Grund auf" Tutorial hab ich leider noch nicht gefunden.

  3. #3
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Oder findet man da hier gute Anleitungen, wie man das Contao-Framework in einer AJAX-Datei, die per POST aufgerufen wird, nutzen kann?
    Ich habe das bislang so gemacht. Per JS ein Event an ein z.B. Formular Element gehängt. Bei Keyup oder ähnlichem einen JQuery Ajax-Post gesendet, an eine Datei, die im /files Verzeichnis liegt.
    Und die ist komplett leer und da baue ich hart die DB Verbindung auf. Schöner wäre es halt, wenn man auch das das Contao Framework verwenden würde. Nur fehlt mir dazu ein Beispiel.

  4. #4
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Kann es sein, dass für die neueren Versionen von Contao nicht mehr so "von Grund auf" Anleitungen vorhanden sind? Also auch für jemanden, der/die noch nicht so bewandert ist, um das ganze zu begreifen?

  5. #5
    Community-Moderatorin & Contao-Urgestein Avatar von mlweb
    Registriert seit
    10.07.2011.
    Beiträge
    5.658
    Partner-ID
    7421
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Da würde ich eher sagen: Nein. gerade die neueren Versionen haben eine deutlich bessere Doku als die älteren.
    Entwicklerdoku: https://docs.contao.org/dev/
    Ich habe Dir mit meinen Hinweisen geholfen und Du möchtest Dich bedanken?
    Unterstütze bitte das Contao-Projekt (Button Links)
    Weitere Spendenmöglichkeiten
    ------------------------------------------------------------------------------------------------------
    Contao-Dokumentation: Contao-Handbuch und Contao-Entwickler-Doku
    Contao-Online-Video-Kurse: Contao Academy
    Funktionalität erweitern: Contao-Erweiterungen

    Für Dinge die man mit html5 und css3 lösen kann, braucht man kein javascript.




  6. #6
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.775

    Standard

    Was Du willst, ist eine eigene Route (https://docs.contao.org/dev/framework/routing/), dann bleibst Du innerhalb des Contao (Symfony) Frameworks.

    Edit: und für den Datenbankzugriff lässt Du Dir eine \Doctrine\DBAL\Connection „injecten“.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  7. #7
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Was Du willst, ist eine eigene Route (https://docs.contao.org/dev/framework/routing/), dann bleibst Du innerhalb des Contao (Symfony) Frameworks.

    Edit: und für den Datenbankzugriff lässt Du Dir eine \Doctrine\DBAL\Connection „injecten“.
    Gibt es dazu auch gute Beispiel / Dokumentationen auf Deutsch? Das wäre super.

  8. #8
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.775

    Standard

    Nein, die Contao Entwickler Doku (siehe Link „Docs“ oben hier im Forum) gibt es nur auf englisch. Vielleicht hilft Dir der Beispielcode schon weiter oder Du nutzt etwas wie Google Translator.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  9. #9
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Puh, ich hab mir das nun eine Weile angeschaut, allerdings komme ich damit nicht zurecht.
    Alleine die Erstellung der Verzeichnis / Dateistrukur ist hier:

    https://docs.contao.org/dev/framework/routing/

    nur sehr rudimentär beschrieben und wenn man sie nur daran orientiert, kommt man gar nicht weiter und ich neu ist dabei.

    z.B: "you can create a config/routes.yaml" ... aber wo, in welchem Verzeichnis?
    oder "This will tell Symfony that any controller defined under src/Controller" ... aber wo?

    Ist dies hier eventuell für ein Von-Grund-auf Tutorial zielführender?

    Es wird in den Beschreibungen, die ich gefunden habe, so viel vorausgesetzt und kaum Hinweise, wie sich warum etwas aufbaut.

    Wäre schön, wenn es dafür noch ein konkreteres von 0 auf 100 Beispiel gäbe.

    Thomas

  10. #10
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.140
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Es wird u.U. schon davon ausgegangen das erweiterte Programmierkenntnisse vorhanden sind. Das betrifft in dem Fall nicht nur PHP sondern auch Symphony. Contao ist ja ein Symphony App ... weiß man also, wie man das in einer Symphony App macht, weiß man auch wie es in Contao sein müsste.

    Ergo: Symphony ist der Schlüssel.

  11. #11
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.775

    Standard

    Zitat Zitat von Thomas Pyrin Beitrag anzeigen
    z.B: "you can create a config/routes.yaml" ... aber wo, in welchem Verzeichnis?
    Die angegebenen Pfade beziehen sich immer auf das Installationsverzeichnis Deiner Contao Installation.
    Verzeichnisse und Dateien müssen angelegt werden, falls sie nicht bereits existieren.

    Du legst als das Verzeichnis config und darin eine Datei routes.yml an.


    oder "This will tell Symfony that any controller defined under src/Controller" ... aber wo?
    Dito. Verzeichnis src anlegen, darin Verzeichnis Controller anlegen und darin dann die PHP-Dateien der Controller, deren Namen in den Codebeispielen angegeben ist.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  12. #12
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Danke, ich versuche mich auch paralelle gerade an:

    https://github.com/georgpreissl/cont...bundle-routing

    Allerdings habe ich keinen Kommandozeilen-Zugriff, kann man die Autoload Konfiguration wie hier im Beispiel auch anderweitig aktualisieren?


    Thomas

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

    Standard

    Ja über die Systemwartung im Contao Manager.
    » sponsor me via GitHub or PayPal or Revolut

  14. #14
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Das meiste, was URLs betrifft, kann man doch auch mit den Standard-Backend-Mitteln erreichen. Wie würde man denn im Backend eine eigene Route mit einer Seite im Contao Backend Verknüpfen? Also Seitentemplate zuweisen usw?

    Thomas

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

    Standard

    https://docs.contao.org/dev/framewor...entcomposition

    Beachte aber den Hinweis, dass das noch sehr rudimentär ist. Wird erst in Contao 5.x ausgereifter sein.
    » sponsor me via GitHub or PayPal or Revolut

  16. #16
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Ah, interessant, dann wären die Routings bislang eher für Seiten / Urls nützlich, die nicht im Seitenbaum verankert sind oder was wären sinnvolle Beispiele für Routings?

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

    Standard

    Wei meinst du "für routings"? Meinst du Anwendungsbeispiele für Page Controller? Oder für normale Controller?
    » sponsor me via GitHub or PayPal or Revolut

  18. #18
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Sowohl als auch. Mir fehlt da noch das Verständnis zu Symphony und der Verbindung zu Contao.
    Und irgendwie finde ich keinen Einstieg, der das wirklich gut erläutert. Das FrustrationsLevel ist da gerade etwas hoch.

    Im Test habe ich das hier zum Laufen bekommen:

    https://github.com/georgpreissl/cont...bundle-routing

    aber da eine Datenbank Verbindung reinzubekommen, ist schon schwierig.
    Die Art und Weise des Routings kann ich grob nachvollziehen, obwohl da auch noch viel "warum?" mitschwebt.

    Und eben die Verwendung der Datenbank dann in diesem Controller.
    Geändert von Thomas Pyrin (16.02.2022 um 11:06 Uhr)

  19. #19
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Kann jemand da eine gute deutsche Einführung in Symfony / Contao empfehlen?
    Vor allem was die Entwickler-Seite angeht?

    Thomas

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

    Standard

    Zitat Zitat von Thomas Pyrin Beitrag anzeigen
    Sowohl als auch. Mir fehlt da noch das Verständnis zu Symphony und der Verbindung zu Contao.
    Und irgendwie finde ich keinen Einstieg, der das wirklich gut erläutert. Das FrustrationsLevel ist da gerade etwas hoch.

    Im Test habe ich das hier zum Laufen bekommen:

    https://github.com/georgpreissl/cont...bundle-routing

    aber da eine Datenbank Verbindung reinzubekommen, ist schon schwierig.
    Die Art und Weise des Routings kann ich grob nachvollziehen, obwohl da auch noch viel "warum?" mitschwebt.

    Und eben die Verwendung der Datenbank dann in diesem Controller.
    Vielleicht ist es besser wenn du erklärst, was genau du denn erreichen willst?
    » sponsor me via GitHub or PayPal or Revolut

  21. #21
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Im Grunde ist es folgendes:

    Es soll ein input-form Field geben, welches per onKeyUp eine Route aufruft, die sich Inhalte aus der DB zieht und der Response soll in einem HTML-ELement dargestellt werden.
    Also klassische Ajax-Funktionalität.

    Mit dem Routing hätte man die Ausgabe "pur", die man dann in das HTML Element ausgeben würde.

    Aber ich habe keine DB VErbindung im Controller zustande gebracht.

    https://github.com/georgpreissl/cont...bundle-routing -> das hatte mir beim Routing geholfen, auch wenn ich hier noch nicht so richtig weiss, warum das so funktionert.
    Und ich würde es halt gerne verinnerlichen, anstatt Copy&Paste zu arbeiten.

    Danke


    Thomas

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

    Standard

    Zitat Zitat von Thomas Pyrin Beitrag anzeigen
    Im Grunde ist es folgendes:

    Es soll ein input-form Field geben, welches per onKeyUp eine Route aufruft, die sich Inhalte aus der DB zieht und der Response soll in einem HTML-ELement dargestellt werden.
    Also klassische Ajax-Funktionalität.
    Ja, genau dafür sind Controller da


    Zitat Zitat von Thomas Pyrin Beitrag anzeigen
    Aber ich habe keine DB VErbindung im Controller zustande gebracht.
    Poste deinen Code.
    » sponsor me via GitHub or PayPal or Revolut

  23. #23
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Der TestController.php sieht so aus (was die DB Verbindung angeht habe ich eingefügt):


    PHP-Code:

    namespace AppBundle\Controller


    use 
    Contao\CoreBundle\Exception\PageNotFoundException;
    use 
    Contao\CoreBundle\Framework\ContaoFramework;
    use 
    Contao\FilesModel;
    use 
    Contao\StringUtil;
    use 
    Contao\Validator;
    use 
    Contao\Database
    use 
    Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use 
    Symfony\Component\HttpFoundation\BinaryFileResponse;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\HttpFoundation\Session\Session;

    class 
    TestController extends Controller
    {

        
    /**
         * @Route("/test/")
         */
        
    public function loadAction($height$width)
        {

          
    $db = \Contao\System::getContainer()->get('database_connection'); 
          
    $sql "SELECT * FROM tl_logs LIMIT 0,10";
          
    $stmt $db->prepare($sql);
          
    $statement $stmt->executeQuery();




            
    $strBuffer '<!DOCTYPE html>
    <html lang="de">
    <head>
      <meta charset="utf-8">
      <title>Frontend Route - Contao Open Source CMS</title>
    </head>
    <body>
           <h1>Frontend Route</h2>
                <p>Parameter: '
    .$height.' '.$width.'</p>
    </body>
    </html>'
    ;
            
    $objResponse = new Response($strBuffer);
            
    $objResponse->headers->set('Content-Type''text/html; charset=UTF-8');
            return 
    $objResponse;

        }


    Dabei lädt der TestController.php aber ewig lange und hängt sich auf.


    Thomas

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

    Standard

    Verwendest du aus einem bestimmten Grund AppBundle statt App? Unter welchem Pfad genau liegt diese Datei?
    » sponsor me via GitHub or PayPal or Revolut

  25. #25
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Die Verzeichnisstruktur dafür ist auf Root-Ebene:

    app
    - ContaoMangerPlugin.php

    src
    |
    AppBundle
    - AppBundle.php
    |
    Controller
    - TestController.php
    |
    Ressources
    |
    config
    - routing.yml


    das hatte ich so aus dem Beispiel übernommen und das Routing selber funktioniert auch.

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

    Standard

    Zitat Zitat von Thomas Pyrin Beitrag anzeigen
    das hatte ich so aus dem Beispiel übernommen und das Routing selber funktioniert auch.
    Aus welchem Beispiel? In Contao 4.9 brauchst du weder ein Contao Manager Plugin, noch eine AppBundle Klasse. Siehe https://docs.contao.org/dev/framework/routing/

    Stelle erst mal alles von AppBundle auf App um, so wie empfohlen.
    » sponsor me via GitHub or PayPal or Revolut

  27. #27
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Herrlich,

    da sieht man mal nach gefühlt ein paar Jahren wieder ins Forum und viel geändert hat sich anscheinend nicht. Auf eine einfache Frage kommen unzählig Antwort, aber das Problem ist bis heute nicht gelöst, weil anstatt auf eine einfache Frage eine einfache Antwort zu liefern, meilenweit ums Thema herumgeredet wird. Handbuch, Bundle etc. War doch nie die Frage und Voraussetzung.

    Klar, man könnte jetzt nen geiles fancy Symfony Bundle bauen, aber er sagt ja selbst er weiß nicht wie es geht, weil es halt auch keine richtigen einfachen Anleitungen für Leute gibt, die bisher irgendwelche php Dateien über Templates included haben.

    @Thomas Pyrin
    Installiere dir mal Isotope in deinem Contao und schau dir mal an wie die postsales.php (findest du unter /vendor/isotope/isotope-core/system/modules/isotope arbeitet. Genau das ist deine Lösung!



    Man benötigt demnach genau:


    • Einen Ordner (unter ROOT/system/modules/{wunschOrdner}
    • 3 Dateien (.htaccess, initialize.php, deineFinaleDatei.php)



    PHP-Code:
     initialize.php
    <?php

    $path 
    = \dirname(__DIR__);

    while ((
    $path = \dirname($path)) && $path !== '/') {
        
    $script $path.'/system/initialize.php';

        if (
    file_exists($script)) {
            require_once(
    $script);
            return;
        }
    }

    header('HTTP/1.0 500 Internal Server Error');
    die(
    'Contao initialize.php was not found');

    PHP-Code:
     deineFinaleDatei.php
    <?php


    use was\immer\du\willst

    /**
     * Set the script name
     */
    \define('TL_SCRIPT''system/modules/wunschOrdner/deineFinaleDatei.php');

    /**
     * Initialize the system
     */
    \define('TL_MODE''FE');
    \
    define('BYPASS_TOKEN_CHECK'true);

    require_once(
    'initialize.php');


    class 
    scheissAufIrgendwelchenBundleMist extends \Frontend{

        
    // Hier drin kannst du das komplette System nutzen wie du es bisher kennst

         
    public function api()
        {
         
    $strParameter = \Input::get('parameter');
         
    // Hier kannst du Templates laden, parsen, zurückgeben, json ausgeben, was immer du willst. Alle Contao Klassen stehen ab hier zur Verfügung.

          // Lade die Datenbank, wie du es gewohnt bist
         
    \Database::getInstance()->prepare()->execute();
         }


    }

    $SoEinfach = new scheissAufIrgendwelchenBundleMist();
    $SoEinfach->api()

    }

    Am Ende rufst du im Script einfach den Ajax-Call domain.tld/system/modules/wunschOrnder/deineFinaleDatei.php auf, fertig.



    Programmers don't comment their code. It was hard to write, it should be hard to understand...

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

    Standard

    Das solltest du auf keinen Fall so machen.



    Zitat Zitat von the_scrat Beitrag anzeigen
    aber das Problem ist bis heute nicht gelöst
    Welches Problem genau?
    » sponsor me via GitHub or PayPal or Revolut

  29. #29
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen

    Welches Problem genau?
    Das hier:
    Zitat Zitat von Mark Knochen Beitrag anzeigen

    ich bin schon eine Weile raus und suche Hilfe, wie ich in einer "blanken" Datei das Contao Framework initialisieren kann und die DB Klasse für die Verwendung laden kann.

    Und du nennst noch nicht einmal eine Begründung warum man es nicht so machen soll! Natürlich KANN man es so machen! Warum auch nicht. Wie viele Installationen laufen bis heute mit dem üblichen /system/modules/ Ordnern.
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

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

    Standard

    Zitat Zitat von Mark Knochen Beitrag anzeigen
    ich bin schon eine Weile raus und suche Hilfe, wie ich in einer "blanken" Datei das Contao Framework initialisieren kann und die DB Klasse für die Verwendung laden kann.
    @Mark Knochen, @scrat das Contao Framework musst du nicht initialisieren, um auf die Datenbank zugreifen zu können. In einem Controller, der als Service registriert ist, kannst du dir die Datenbankverbindung per Dependency Injection holen. In der App würde das zB so aussehen:
    PHP-Code:
    # config/services.yaml
    services:
        
    _defaults:
            
    autowiretrue
            autoconfigure
    true

        App
    \:
            
    resource: ../src

        App
    \Controller\:
            
    resource: ../src/Controller
            
    public: true 
    PHP-Code:
    # config/routes.yaml
    app.controller:
        
    resource: ../src/Controller
        type
    annotation 
    PHP-Code:
    // src/Controller/ExampleController.php
    namespace App\Controller;

    use 
    Doctrine\DBAL\Connection;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\Routing\Annotation\Route;

    /**
     * @Route("/example", name=ExampleController::class)
     */
    class ExampleController
    {
        private 
    $db;

        public function 
    __construct(Connection $db)
        {
            
    $this->db $db;
        }

        public function 
    __invoke(Request $request): Response
        
    {
            
    $this->db->executeQuery();

            return new 
    Response('Hello World!');
        }

    » sponsor me via GitHub or PayPal or Revolut

  31. #31
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    50

    Standard

    Danke, dass versuche ich mal, ich will es ja auch verstehen.

    Und warum sollte man das andere Beispiel nicht "machen"?



    Thomas

  32. #32
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Thomas Pyrin Beitrag anzeigen
    Und warum sollte man das andere Beispiel nicht "machen"?
    Kannst du ruhig so auch machen. Das funktioniert halt in Contao 5 nicht mehr, aber darum geht es ja jetzt wohl sowieso nicht. Das Beispiel von Spooky ist halt sauberer. Nicht mehr, nicht weniger.
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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