Ergebnis 1 bis 9 von 9

Thema: Versandart-Bereich überschreiben und mit eigener Logik anpassen

  1. #1
    Contao-Nutzer
    Registriert seit
    14.04.2023.
    Beiträge
    52

    Standard Versandart-Bereich überschreiben und mit eigener Logik anpassen

    Moin in die Runde,
    ich habe mir nun ein Backend Modul geschrieben, um Filialen, Wochentage und Abholzeiten anzulegen. Fürs Frontend hatte ich ein Modul angelegt, womit ich die Daten aus der Datenbank lesen kann und an ein Template übergeben, sodass quasi der Nutzer eine Filiale auswählen kann, dann einen Wochentag und die passende Abholzeit. Das funktioniert soweit. Nun möchte ich "meine" Logik in den Versandart/Versand -> Checkout Prozess einbauen.
    Ich habe übers Backend eine Versandart "Abholung" angelegt. Komme ich nun zum Checkout, trage die Adresse ein und dann Versand -> Abholung und dann sollten meine 3 Felder erscheinen, die dann auch mit Daten gefüllt sind. Das Template für die Darstellung "iso_checkout_shipping_method.html5" kann ich ja anpassen, so dass meine Formulare dort scheinen. Ich finde allerdings den Einstiegspunkt nicht, um meinen Code dort einzubauen, so dass er dort die Datenbankabfrage macht und dann die Daten an das Template weitergibt.
    Bei der Suche nach einer Lösung kam ich zu dem Punkt eine neue Versandmethode zu schreiben, aber ist das zwingend erfordlich? Kann ich nicht in das bestehende System meinen "Code" ergänzen? Updatesicherheit lassen wir mal außen vor.
    Welche PHP Datei ist quasi die Zieldatei, um meine Logik zu ergänzen?

    Ich hab das an sich ganz simpel gehalten:
    PHP-Code:
    protected function compile()
        {
            
    // Daten aus tl_CC_filialen abrufen
        
    $filialenData Database::getInstance()
            ->
    prepare("SELECT * FROM tl_CC_filialen")
            ->
    execute()
            ->
    fetchAllAssoc();

        
    $wochentagData = [];

        if (!empty(
    $_POST["filialeSelect"])) {
            
    $selectedFilialeId = (int)$_POST["filialeSelect"];

            
    // 'filialid' der ausgewählten Filiale
            
    $selectedFiliale Database::getInstance()
                ->
    prepare("SELECT filialid FROM tl_CC_filialen WHERE id = ?")
                ->
    execute($selectedFilialeId)
                ->
    fetchAssoc();

            if (
    $selectedFiliale) {
                
    $filialid $selectedFiliale['filialid'];

                
    // Wochentage mit derselben 'filialid' wie die ausgewählte Filiale
                
    $wochentagData Database::getInstance()
                    ->
    prepare("SELECT * FROM tl_CC_wochentag_uhrzeit WHERE filialid = ?")
                    ->
    execute($filialid)
                    ->
    fetchAllAssoc();
            }

            
    //Abholzeiten für die ausgewählte Filiale
            
    $abholzeitenData Database::getInstance()
        ->
    prepare("SELECT abholzeiten FROM tl_CC_abholzeiten WHERE filialid = ?")
        ->
    execute($selectedFilialeId)
        ->
    fetchEach('abholzeiten');
        }

        
    // Daten an das Template übergeben
        
    $this->Template->foo 'bar';
        
    $this->Template->template 'mod_testmodule';
        
    $this->Template->filialenData $filialenData;
        
    $this->Template->wochentagData $wochentagData;
        
    $this->Template->abholzeitenData $abholzeitenData;
        } 
    So sieht das für mein Template aus und das funktioniert soweit auch. (siehe Bilder)
    Ich habe dort mein Modul einfach mal unters Kassenmodul geschoben, um es darzustellen.

    Kurzes Update: Übern inserttag bekomme ich mein Modul da rein.
    Allerdings gibts dann folgendes Problem: Ich habe kein JS verwendet, weil ich nicht weiß, wie ich es im Modul nutzen muss, deshalb hab ich es nur über PHP lösen wollen. Ich muss die Filiale bestätigen über den Button und erst, dann kann ich Tage und Zeiten auswählen. Dadurch das standardmäßig ein Button im Checkout Prozess vorhanden ist durch zurück und weiter, erfüllt mein "Filiale bestätigen" Button nun die Aufgabe von weiter, was dazu führt, dass ich den Rest gar nciht auswählen kann, weil ich direkt zum nächsten Step springe. Jemand eine Idee?
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: png 2.png (25,9 KB, 7x aufgerufen)
    • Dateityp: png 1.png (47,7 KB, 8x aufgerufen)
    Geändert von PKoch91 (24.10.2023 um 12:19 Uhr)

  2. #2
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Eine eigene Versandmethode ist der richtig weg, um "dem bestehenden System deinen Code zu erweitern". Logik im Template ist eigentlich falsch, und nur möglich weil wir in den alten Templates noch PHP nutzen. Mach also am besten eine eigene Versandmethode mit einem eigenen Template, dort kannst du dann "alles richtig machen". Falls zur eigenen Versandmethode fragen sind kannst du diese natürlich auch gerne hier stellen ;-)
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  3. #3
    Contao-Nutzer
    Registriert seit
    14.04.2023.
    Beiträge
    52

    Standard

    Zitat Zitat von andreas.schempp Beitrag anzeigen
    Eine eigene Versandmethode ist der richtig weg, um "dem bestehenden System deinen Code zu erweitern". Logik im Template ist eigentlich falsch, und nur möglich weil wir in den alten Templates noch PHP nutzen. Mach also am besten eine eigene Versandmethode mit einem eigenen Template, dort kannst du dann "alles richtig machen". Falls zur eigenen Versandmethode fragen sind kannst du diese natürlich auch gerne hier stellen ;-)
    Danke dir für die Rückmeldung

    Ich habe es vorerst wie folgt gelöst.
    Ich habe die Versandmethode nicht weiter überschrieben bzw geändert, sondern habe mein Frontend Modul einfach in den Warenkorb mit eingebunden. das sieht dann so aus:
    (Bild cart.png)

    Hier funktioniert ja mein eigenes Template und mein Modul soweit, wie es muss, d.h. ich rufe die Filialen aus der Datenbank ab. Wähle eine, dann wird mir durch meine Auswahl die Möglichkeiten der angelegten Tage und Abholzeiten angezeigt. Am Ende bestätige ich die Auswahl und speichere die Daten in einer Session.
    Im Checkout lasse ich den Schritt "Versand" aus, weil es nur eine Option gibt und zwar Abholung. Wie ich das löse, weiß ich noch nicht

    Im Schritt Zusammenfassung übergebe in die Daten der Session dem Template(ja nicht sauber gelöst, aber wusste mir anders vorerst nicht zu helfen).
    Das sieht dann so aus:
    (Bild zusammenfassung.png)
    Für die Email / Bestellbestätigung hab ich mir aus meinem Template einen Token generieren lassen und kann das damit in die Email übergeben. Das funktioniert soweit auch.


    Ich habe nun noch folgendes zu lösen. Wie bekomme ich meine zusätzlichen Informationen ins Backend für die Bestellübersicht?
    Wie kann ich die Anordnung in der Zusammenfassung überarbeiten? Ich hätte dort gerne ebenfalls die Möglichkeit für einen Edit und würde den Bereich Abholung direkt über Informationen haben.
    Ja ist noch einiges zu machen

    Stichwort -> eigene Versandmethode. Ich muss gestehen, dass Isotope für mich Anfänger so umfangreich ist, dat es mir schwer fällt da überhaupt etwas zu finden. Wo muss ich dann angreifen?
    Angehängte Grafiken Angehängte Grafiken
    Geändert von PKoch91 (25.10.2023 um 14:49 Uhr)

  4. #4
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von PKoch91 Beitrag anzeigen
    Wie bekomme ich meine zusätzlichen Informationen ins Backend für die Bestellübersicht?
    am einfachsten über eine eigene Versandmethode


    Zitat Zitat von PKoch91 Beitrag anzeigen
    Stichwort -> eigene Versandmethode. Ich muss gestehen, dass Isotope für mich Anfänger so umfangreich ist, dat es mir schwer fällt da überhaupt etwas zu finden. Wo muss ich dann angreifen?
    Eine Versandmethode funktioniert ziemlich gleich wie ein Modul in Contao. Am besten schaust du dir immer den bestehenden Code an, also in diesem Fall die Standard-Versandmethode. Die gleichen Methoden musst du implementieren, und kannst darin machen was du willst. Registriert wird die Versandmethode in der config.php (aus Isotope abschauen, ist keine $GLOBALS), und das DCA in der tl_iso_shipping brauchst du (gleich wie bei tl_module).
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  5. #5
    Contao-Nutzer
    Registriert seit
    14.04.2023.
    Beiträge
    52

    Standard

    Zitat Zitat von andreas.schempp Beitrag anzeigen
    am einfachsten über eine eigene Versandmethode




    Eine Versandmethode funktioniert ziemlich gleich wie ein Modul in Contao. Am besten schaust du dir immer den bestehenden Code an, also in diesem Fall die Standard-Versandmethode. Die gleichen Methoden musst du implementieren, und kannst darin machen was du willst. Registriert wird die Versandmethode in der config.php (aus Isotope abschauen, ist keine $GLOBALS), und das DCA in der tl_iso_shipping brauchst du (gleich wie bei tl_module).
    Die Standard Versandmethode läuft unter den Namen "ShippingMethod.php". Ist das korrekt?
    Oder meinst du flat, product_price usw. ?
    Geändert von PKoch91 (26.10.2023 um 12:47 Uhr)

  6. #6
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    die Isotope\Model\Shipping\Flat meinte ich.
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  7. #7
    Contao-Nutzer
    Registriert seit
    14.04.2023.
    Beiträge
    52

    Standard

    Zitat Zitat von andreas.schempp Beitrag anzeigen
    die Isotope\Model\Shipping\Flat meinte ich.
    Ich danke dir
    Wir kommen die Ziel ein Stück näher. Ich habe nun meine "eigene" Versandmethode gebaut, die ich auch über das Backend einer neuen Versandart zuweisen kann. Die Logik für die Formulare und die Datenbankabfrage, habe ich ebenfalls in die Versandmethode einbauen können.
    Ich habe die generate() Methode erweitert:
    PHP-Code:
    public function generate()
        {
            
    $this->initializeModules();

            if (empty(
    $this->modules)) {
                
    $this->blnError true;

                
    /** @var Template|\stdClass $objTemplate */
                
    $objTemplate = new Template('mod_message');
                
    $objTemplate->class 'shipping_method';
                
    $objTemplate->hl 'h2';
                
    $objTemplate->headline $GLOBALS['TL_LANG']['MSC']['shipping_method'];
                
    $objTemplate->type 'error';
                
    $objTemplate->message $GLOBALS['TL_LANG']['MSC']['noShippingModules'];

                return 
    $objTemplate->parse();
            }

            
            
    $filialenData Database::getInstance()
                ->
    prepare("SELECT * FROM tl_CC_filialen")
                ->
    execute()
                ->
    fetchAllAssoc();

            
    $wochentagData = [];
            
    $abholzeitenData = [];

           
            if (
    Input::post('FORM_SUBMIT') == $this->objModule->getFormId()) {
               
                
    $selectedFilialeId Input::post('filialeSelect');
             
                
    $selection = [
                    
    'filiale' => $selectedFilialeId,
                    
    'wochentag' => Input::post('wochentagSelect'),
                    
    'abholzeit' => Input::post('abholzeitSelect'),
                ];

                
    $_SESSION['user_selection'] = $selection;
            }

            
    /** @var Template|\stdClass $objTemplate */
            
    $objTemplate = new Template('iso_checkout_shipping_method');
            
    $objTemplate->headline $GLOBALS['TL_LANG']['MSC']['shipping_method'];
            
    $objTemplate->message $GLOBALS['TL_LANG']['MSC']['shipping_method_message'];
            
    $objTemplate->options $this->generateShippingMethodForm($filialenData$wochentagData$abholzeitenData);
            
    $objTemplate->shippingMethods $this->modules;

            return 
    $objTemplate->parse();
        } 
    und eine weitere Methode geschrieben, um mir die Formulare "erschaffen" zu können. Ich habe das probehalber erst mal nur für die Filialen gemacht.
    PHP-Code:
    private function generateShippingMethodForm($filialenData$wochentagData$abholzeitenData)
        {
            
    $html '';

            
    $html .= '<label for="filialeSelect">Filiale auswählen:</label>';
            
    $html .= '<select id="filialeSelect" name="filialeSelect">';
            foreach (
    $filialenData as $filiale) {
                
    $html .= '<option value="' $filiale['id'] . '">' $filiale['filialid'] . ' - ' $filiale['city'] . ' - ' $filiale['street'] . '</option>';
            }
            
    $html .= '</select>';
            
    $html .= '<input type="submit" class="submit button" name="selectFiliale" value="Filiale auswählen">';

            

            return 
    $html;
        } 
    Das Problem ist nun, da ich um die Filiale zu bestätigen, die Datenbankabfragen zu starten und die Session zu speichern einen Submit habe und wir im iso_mod_checkout Template für die Kasse ebenfalls Submits für zurück und weiter habe, erfüllen diese nun alle die selbe Funktion. Drück ich auf Filiale auswählen(siehe Bild) gehe ich zum nächsten Step. Das will ich ja nicht, weil ich eigentlich danach die Tage und Zeiten auswählen können.
    Wir kann ich das lösen? Javascript und Ajax? Allerdings weiß ich nicht, wie man Ajax hier verwendet bzw habe damit noch nie etwas gemacht. Gibts es sonst noch eine andere Lösung mit PHP?
    Angehängte Grafiken Angehängte Grafiken

  8. #8
    Contao-Nutzer
    Registriert seit
    14.04.2023.
    Beiträge
    52

    Standard

    Ich versuche das nun gerade über AJAX zu lösen, aber scheitere an der Route.
    Eigentlich Recht simpel aufgebaut und ich kann auf den Submit und das Problem mit dem anderen Template verzichten, wenn es denn laufen würde
    Vllt hat dazu jemand eine Idee:

    Versandmethode.php:
    ->generate() und loadTimeslots():
    PHP-Code:
    public function generate()
        {
            
    $this->initializeModules();

            if (empty(
    $this->modules)) {
                
    $this->blnError true;

                
    /** @var Template|\stdClass $objTemplate */
                
    $objTemplate = new Template('mod_message');
                
    $objTemplate->class 'shipping_method';
                
    $objTemplate->hl 'h2';
                
    $objTemplate->headline $GLOBALS['TL_LANG']['MSC']['shipping_method'];
                
    $objTemplate->type 'error';
                
    $objTemplate->message $GLOBALS['TL_LANG']['MSC']['noShippingModules'];

                return 
    $objTemplate->parse();
            }

            
    // Daten aus tl_CC_filialen abrufen
            
    $filialenData Database::getInstance()
                ->
    prepare("SELECT * FROM tl_CC_filialen")
                ->
    execute()
                ->
    fetchAllAssoc();

            
    $wochentagData = [];
            
    $abholzeitenData = [];

            if (!empty(
    $_POST["filialeSelect"])) {
                
    $selectedFilialeId = (int)$_POST["filialeSelect"];

                
    // 'filialid' der ausgewählten Filiale
                
    $selectedFiliale Database::getInstance()
                    ->
    prepare("SELECT filialid FROM tl_CC_filialen WHERE id = ?")
                    ->
    execute($selectedFilialeId)
                    ->
    fetchAssoc();

                if (
    $selectedFiliale) {
                    
    $filialid $selectedFiliale['filialid'];

                    
    // Wochentage mit derselben 'filialid' wie die ausgewählte Filiale
                    
    $wochentagData Database::getInstance()
                        ->
    prepare("SELECT * FROM tl_CC_wochentag_uhrzeit WHERE filialid = ?")
                        ->
    execute($filialid)
                        ->
    fetchAllAssoc();

                    
    // Abholzeiten für die ausgewählte Filiale
                    
    $abholzeitenData Database::getInstance()
                        ->
    prepare("SELECT abholzeiten FROM tl_CC_abholzeiten WHERE filialid = ?")
                        ->
    execute($selectedFilialeId)
                        ->
    fetchEach('abholzeiten');
                }
            }

            if (isset(
    $_POST["saveSelection"])) {
                
    $selection = [
                    
    'filiale' => $_POST["filialeSelect"],
                    
    'wochentag' => $_POST["wochentagSelect"],
                    
    'abholzeit' => $_POST["abholzeitSelect"],
                ];

                
    // Auswahl in der Sitzung speichern
                
    $_SESSION['user_selection'] = $selection;
            }

            
    /** @var Template|\stdClass $objTemplate */
            
    $objTemplate = new Template('iso_checkout_shipping_method');
            
    $objTemplate->headline $GLOBALS['TL_LANG']['MSC']['shipping_method'];
            
    $objTemplate->message $GLOBALS['TL_LANG']['MSC']['shipping_method_message'];
            
    $objTemplate->shippingMethods $this->modules;
            
    $objTemplate->filialenData $filialenData;
            
    $objTemplate->wochentagData $wochentagData;
            
    $objTemplate->abholzeitenData $abholzeitenData;

            return 
    $objTemplate->parse();
        }

        public function 
    loadTimeslots()
        {
            
    $response = array();

            if (isset(
    $_POST['filialeId'])) {
                
    $selectedFilialeId = (int)$_POST['filialeId'];

                
    $wochentageData Database::getInstance()
                    ->
    prepare("SELECT name FROM tl_CC_wochentag_uhrzeit WHERE filialid = ?")
                    ->
    execute($selectedFilialeId)
                    ->
    fetchEach('name');

                
    $abholzeitenData Database::getInstance()
                    ->
    prepare("SELECT abholzeiten FROM tl_CC_abholzeiten WHERE filialid = ?")
                    ->
    execute($selectedFilialeId)
                    ->
    fetchEach('abholzeiten');

                
    $response['wochentage'] = $wochentageData;
                
    $response['abholzeiten'] = $abholzeitenData;
            }

            
    // Set the response content type to JSON
            
    header('Content-Type: application/json');

            
    // Prepare your JSON data
            
    $responseData = array(
                
    'wochentage' => $response['wochentage'],
                
    'abholzeiten' => $response['abholzeiten'],
            );

            
    // Output the JSON response
            
    echo json_encode($responseData);
            exit;
        } 
    Das Template sieht so aus:
    PHP-Code:
    <!-- iso_checkout_shipping_method.html5 -->

    <form method="post">
    <input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
        <!-- Filiale auswählen -->
        <label for="filialeSelect">Filiale auswählen:</label>
        <select id="filialeSelect" name="filialeSelect">
            <?php foreach ($this->filialenData as $filiale): ?>
                <option value="<?= $filiale['id'?><?= ($_POST["filialeSelect"] == $filiale['id']) ? 'selected' '' ?>>
                    <?= $filiale['filialid'?> - <?= $filiale['city'?> - <?= $filiale['street'?>
                </option>
            <?php endforeach; ?>
        </select>
        <button type="submit" name="selectFiliale">Filiale auswählen</button>

        <br>

        <!-- Wochentag auswählen -->
        <label>Wochentag auswählen:</label>
        <?php foreach ($this->wochentagData as $wochentag): ?>
            <label>
                <input type="radio" name="wochentagSelect" value="<?= $wochentag['name'?><?= ($_POST["wochentagSelect"] == $wochentag['name']) ? 'checked' '' ?>>
                <?= $wochentag['name'?>
            </label>
        <?php endforeach; ?>

        <br>

        <!-- Abholzeit auswählen -->
        <label>Abholzeit auswählen:</label>
        <?php
        $selectedFilialeId 
    $_POST["filialeSelect"];

        if (!empty(
    $selectedFilialeId)) {
            
    $abholzeitenData Database::getInstance()
                ->
    prepare("SELECT abholzeiten FROM tl_CC_abholzeiten WHERE filialid = ?")
                ->
    execute($selectedFilialeId)
                ->
    fetchEach('abholzeiten');

            foreach (
    $abholzeitenData as $abholzeit) {
                echo 
    '<label>';
                echo 
    '<input type="radio" name="abholzeitSelect" value="' $abholzeit '" ' . ($_POST["abholzeitSelect"] == $abholzeit 'checked' '') . '>';
                echo 
    $abholzeit;
                echo 
    '</label>';
            }
        }
        
    ?>
        <br>
        <button type="submit" name="saveSelection">Auswahl speichern</button>
    </form>

    <?php
    if (isset($_SESSION['user_selection'])) {
        
    $selection $_SESSION['user_selection'];

        
    $filialData Database::getInstance()
            ->
    prepare("SELECT city, street FROM tl_CC_filialen WHERE id = ?")
            ->
    execute($selection['filiale'])
            ->
    fetchAssoc();

        echo 
    '<h1>Auswahl gespeichert:</h1>';
        echo 
    '<p>Filiale: ' $filialData['city'] . ' - ' $filialData['street'] . '</p>';
        echo 
    '<p>Wochentag: ' $selection['wochentag'] . '</p>';
        echo 
    '<p>Abholzeit: ' $selection['abholzeit'] . '</p>';
    } else {
        echo 
    '<p>Keine Auswahl gespeichert.</p>';
    }
    ?>

    <script>
    document.addEventListener("DOMContentLoaded", function () {
        var filialeSelect = document.getElementById('filialeSelect');
        filialeSelect.addEventListener('change', function () {
            var selectedFilialeId = filialeSelect.value;
            loadTimeslots(selectedFilialeId);
        });

        function loadTimeslots(selectedFilialeId) {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'system/modules/library/CheckoutStep/Versandmethode.php?loadTimeslots&filialeId=' + selectedFilialeId, true);

            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    try {
                        var response = JSON.parse(xhr.responseText);
                        var wochentagSelect = document.getElementById('wochentagSelect');
                        var abholzeitSelect = document.getElementById('abholzeitSelect');

                       
                        wochentagSelect.innerHTML = '';
                        for (var i = 0; i < response.wochentage.length; i++) {
                            var option = document.createElement('option');
                            option.value = response.wochentage[i];
                            option.text = response.wochentage[i];
                            wochentagSelect.appendChild(option);
                        }

                        abholzeitSelect.innerHTML = '';
                        for (var j = 0; j < response.abholzeiten.length; j++) {
                            var option = document.createElement('option');
                            option.value = response.abholzeiten[j];
                            option.text = response.abholzeiten[j];
                            abholzeitSelect.appendChild(option);
                        }
                    } catch (e) {
                        console.error('Fehler beim Parsen der JSON-Antwort:', e);
                    }
                }
            };

            xhr.send();
        }
    });
    </script>

    Der Punkt stößt dem System sauer auf:
    xhr.open('GET', 'system/modules/library/CheckoutStep/Versandmethode.php?loadTimeslots&filialeId=' + selectedFilialeId, true); und gibt einen 404 aus. Ich habe da einige Varianten probiert, aber kann nicht auf die richtige Datei verweisen.

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

    Standard

    Am besten baust du dir dafür einen richtigen Controller.
    » sponsor me via GitHub or PayPal or Revolut

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
  •