Neu Frage zu Plugin Entwicklung : IO Request im Admin

vlat

Aktives Mitglied
2. Oktober 2009
48
3
Moin,

ich bin gerade am testen wie man IO Request erstellt da ich es für ein Plugin brauche. Im TestPlugin habe ich folgendes erstellt, bekomme aber HTTP 403. Verstehe aber nicht woran es liegt, habe schon jtl_token mitgeben und habe es auch schon als bearer token versucht.

mein Tpl Inhalt
Code:
{literal}
<script>
$(document).ready(function () {
    // Daten laden beim Start
    loadEntries();

    // Eintrag hinzufügen oder aktualisieren
    $('#entryForm').on('submit', function (e) {
        e.preventDefault();

        const name = $('#name').val();
        const id = $('#entryId').val();
        const jtl_token = $('input[name="jtl_token"]').val();

        const formData = new FormData();
        const requestData = id ? {
            'name': 'UpdateEntry',
            'params': [{'id': id, 'name': name, 'jtl_token': jtl_token }]
        } : {
            'name': 'CreateEntry',
            'params': [{'name': name, 'jtl_token': jtl_token}]
        };

        // Füge die Daten zum FormData-Objekt hinzu
        formData.append('io', JSON.stringify(requestData));

        $.ajax({
            type: 'POST',
            url: '{/literal}{$plugin_url}{literal}', // Hier binden wir die URL korrekt ein
            data: formData,
            processData: false,  // Verhindert, dass jQuery die Daten formatiert
            contentType: false   // Verhindert die automatische Einstellung des Content-Type Headers
        }).done(function (data) {
            if (data.success) {
                $('#entryForm')[0].reset();
                $('#entryId').val('');
                loadEntries();
            } else {
                alert('Fehler: ' + (data.message || 'Unbekannter Fehler'));
            }
        }).fail(function (xhr, status, error) {
            console.error('AJAX Fehler:', status, error);
            alert('Anfrage fehlgeschlagen: ' + xhr.status + ' ' + xhr.statusText);
        });
    });

    // Einträge laden und anzeigen
    function loadEntries(search = '') {
        const jtl_token = $('input[name="jtl_token"]').val();
        const formData = new FormData();
        const requestData = {
            'name': 'ListEntries',
            'params': [{'search': search ,'jtl_token': jtl_token}]
        };

        formData.append('io', JSON.stringify(requestData));

        $.ajax({
            type: 'POST',
            url: '{/literal}{$plugin_url}{literal}',
            data: formData,
            processData: false,  // Verhindert, dass jQuery die Daten formatiert
            contentType: false   // Verhindert die automatische Einstellung des Content-Type Headers
        }).done(function (data) {
            if (data.success) {
                $('#entries').empty();

                data.entries.forEach(entry => {
                    $('#entries').append(`
                        <tr>
                            <td>${entry.name}</td>
                            <td>
                                <button class="btn btn-warning edit-btn" data-id="${entry.id}">Bearbeiten</button>
                                <button class="btn btn-danger delete-btn" data-id="${entry.id}">Löschen</button>
                            </td>
                        </tr>
                    `);
                });
            } else {
                alert('Fehler beim Laden der Einträge: ' + (data.message ));
            }
        }).fail(function (xhr, status, error) {
            console.error('AJAX Fehler:', status, error);
            alert('Anfrage fehlgeschlagen: ' + xhr.status + ' ' + xhr.statusText);
        });
    }
});

</script>
{/literal}


    <form id="entryForm" class="form">
        {$jtl_token}
        <input type="hidden" id="entryId" class="form-control">
        <input type="text" id="name" placeholder="Name" required class="form-control">
        <br>
        <button type="submit" class="btn btn-block btn-info">Speichern</button>
    </form>
    <hr>
    <input type="text" id="search" placeholder="Suche nach Namen" class="form-control">
    <br>
    <table id="entries" class="table">
        <thead>
            <tr>
                <th>Name</th>
                <th>Aktionen</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

Inhalt meiner Bootstrap.php

Code:
private $dispatcher;
public function boot(Dispatcher $dispatcher): void
    {
        parent::boot($dispatcher);
        $this->dispatcher = $dispatcher;
        $this->dispatcherListeners();
    }

    private function dispatcherListeners(): void
    {
        // Hook registrieren
        $this->dispatcher->listen(
            'shop.hook.' . \HOOK_IO_HANDLE_REQUEST_ADMIN,
            function (array &$args) {
                $args['io']->register('ListEntries', [$this, 'listEntries']);
                $args['io']->register('CreateEntry', [$this, 'createEntry']);
                $args['io']->register('GetEntry', [$this, 'getEntry']);
                $args['io']->register('UpdateEntry', [$this, 'updateEntry']);
                $args['io']->register('DeleteEntry', [$this, 'deleteEntry']);
            }
        );
    }

    // CRUD-Methoden
    public function listEntries(array $params): array
    {
        $search = $params[0]['search'] ?? '';
        $db = Shop::Container()->getDB();
        $query = "SELECT * FROM entries WHERE name LIKE :search";
        $entries = $db->getObjects($query,['search' => "%$search%"]);

        return ['success' => true, 'entries' => $entries];
    }
    ...

In der info.xml ist es als normaler tab eingebunden.

Danke für Tips im Voraus.
 
Zuletzt bearbeitet:

FMoche

Moderator
Mitarbeiter
15. Dezember 2014
1.369
347
Halle (Saale)
Auf den ersten Blick sehe ich hier zwei Probleme:
Der Token muss als $_POST['jtl_token'] vorhanden sein.
Also brauchst du wahrscheinlich noch ein
Code:
formData.append('jtl_token', jtl_token);
statt das in dein requestData-Objekt zu packen.
Und die Ziel-URL sollte nicht deine Plugin-URL sein, sondern <shopurl>/admin/io bzw. in alten Shopversionen <shopurl>/admin/io.php
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu Frage zur Übertragung von JTL -> Shopify Shopify-Connector 1
Neu Frage zur mobilen WMS-Anwendung auf Android JTL-WMS / JTL-Packtisch+ - Fehler und Bugs 0
Neu Frage zu SQL Statement - Kunden-Kommentar aus Auftrag auf Pickliste User helfen Usern - Fragen zu JTL-Wawi 1
Frage zu Bestellungen -> Wechsel von Lexware Wawi JTL-Wawi 1.11 1
Neu Frage zu Benutzer/Rechte für Kunden im Onlineshop neues Passwort generieren User helfen Usern - Fragen zu JTL-Wawi 0
Neu Frage an die Shopify Nutzer bzgl. Zahlarten Shopify-Connector 0
Neu Installation von Plugin PayPal Check-Out fehlgeschlagen, keine Verbindung zum Webshop Plugins für JTL-Shop 6
Neu Beim Versuch Paypal-Plugin mit Paypal-Konto zu verbinden Shop nicht mehr erreichbar Plugins für JTL-Shop 2
Neu Neues Plugin: Produktbundles mit Rabatten Plugins für JTL-Shop 0
Neu Widerrufsformular als kostenloses Plugin für Shops ab 5.1.5 Plugins für JTL-Shop 9
Neu Neues Plugin: Kaufimpuls Paket Plugins für JTL-Shop 0
Neu Paypal Checkout Plugin - Ist vorhanden aber nichts funktioniert Plugins für JTL-Shop 9
Neu Neues Plugin: Sauberes Meta-Tracking für JTL-Shop 5 (Pixel + CAPI + Consent) Plugins für JTL-Shop 0
Neu 📢 Plugin "Kreditlimit Plugin für JTL-Shop 5 " von CIN GmbH Plugins für JTL-Shop 0
Neu Händlerbund-Plugin lädt Texte herunter, ersetzt sie aber nicht im Frontend Technische Fragen zu Plugins und Templates 1
Neu 503 Service Unavailable bei Payrexx Webhook nach Plugin-Update - wer hat das auch? Plugins für JTL-Shop 0
Neu JTL-Shop 5.2.3 – Google-Shoppin-Plugin 2.3.0: Mehrere Rückgaberichtlinien (DE + Ausland) bei einem Feed / return_policy_label Plugins für JTL-Shop 0

Ähnliche Themen