JQuery Ajax und eigener Frontend Controller

Guten Abend,

ich versuche gerade per Ajax Informationen von einem eigenen Frontend Controller nachzuladen. Leider erhalten ich jedoch immer nur die Meldung 503 (Service Unavailable), bzw. eine Smarty-Fehlermeldung das mir die entsprechende tpl (sw_article.tpl) fehlen würde. Aber ich möchte ja kein neues Template laden, sondern einfach nur ein paar Daten nachladen nachdem der Benutzer das Drop-Down verändert hat.

Hier mal meine beteiligten Klassen:

Frontend Controller:

Request()->getParam('group', []);

        $this->View()->selection = $selection;
    }

}

Jquery mit Ajax aufruf

$.overridePlugin('swAjaxVariant', {

    onChange: function(event) {
        var $form = $(event.target).parents('form');
        var exist = true;
        var values = {};

        $.each($form.serializeArray(), function(i, item) {
            if (item.name === '__csrf_token') {
                return;
            }

            values[item.name] = item.value;
            $(event.target.options).each(function(){
                if(item.value == $(this).val()) {
                    if($(this).attr("noVariant")) {
                        exist = false;
                    }
                }
            });
        });

        if(exist) {
            this.superclass.onChange.apply(this, arguments);
        } else {
            $.ajax({
                url: "http://localhost/shopware/SwArticle/index",
                data: values,
                method: 'GET',
                success: function(result, data) {
                    console.log(result);
                    console.log(data);
                }
            });
        }
    }
});

Vielleicht kann mir jemand erklären wie ich dies richtig machen muss. Leider hab ich nichts dazu gefunden.

Dann musst du das in deiner Action Shopware auch mitteilen, da Shopware mittlerweile ein Template Verzeichnis erwartet, bzw. eben eine Template Datei.

$this->container->get('front')->Plugins()->ViewRenderer()->setNoRender();

 

1 Like

So geht es. Danke!

Hätte ich das irgendwo in der Doku finden können?

 

P.S. Als Hinweis falls mal jemand anderes mit diesem Problem hierhin kommt. Im Frontend-Controller muss die Rückgabe über echo erfolgen. Es würde dann also so aussehen:

Request()->getParam('group', []);

        $this->container->get('front')->Plugins()->ViewRenderer()->setNoRender();

        echo json_encode($selection);
    }

}

$.overridePlugin('swAjaxVariant', {

    onChange: function(event) {
        var $form = $(event.target).parents('form');
        var exist = true;
        var values = {};

        values['changedGroup'] = event.target.name.substring(6, event.target.name.length - 1);

        $.each($form.serializeArray(), function(i, item) {
            if (item.name === '__csrf_token') {
                return;
            }

            values[item.name] = item.value;
            $(event.target.options).each(function(){
                if(item.value == $(this).val()) {
                    if($(this).attr("noVariant")) {
                        exist = false;
                    }
                }
            });
        });

        if(exist) {
            this.superclass.onChange.apply(this, arguments);
        } else {
            $.ajax({
                url: "http://localhost/shopware/SwArticle/index",
                data: values,
                method: 'GET',
                success: function(response) {
                    var result = $.parseJSON(response);
                }
            });
        }
    }
});

 

@Tomoffel schrieb:

So geht es. Danke!

Hätte ich das irgendwo in der Doku finden können?

Ja hier -> Shopware 5 upgrade guide;

Unter den Security mode.