Shopware und Ajax

KingJamez

NGBler
Registriert
18 Juli 2013
Beiträge
440
Hallo,
ich muss gerade an Shopware rumschrauben, ich möchte gerne, das bei Änderung der Variant, nicht das Formular abgesendet wird, sondern Ajax Request gestartet.
Soweit, Sogut, Ansich klappt das auch. Aber die Daten vom Server enthalten die Variantenauswahl nicht mehr, woran liegt das, was mache ich hier falsch?

Ich habe ein kleines Testcase gebaut, um es zu visualisieren, muss die Action- Url aber entfernen, wegen der anonymität

[src=html4strict]
<!-- das ist das normale varianten formular -->
<form method="post" action="<!-- die url zum produkt -->">
<select name="group[149]">
<option value="810">text</option>
</select>

<select name="group[150]">
<option value="823">text</option>
</select>

<select name="group[152]">
<option value="840">text</option>
</select>

<input type="submit" name="name" />
</form>

<div class="dbg"></div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

[/src]

[src=javascript]

var $form = $('form'),
formUrl = $form.attr( 'action' ),
formMethod = $form.attr( 'method' );


function sendForm(){
var serData = {};
$.each( $form.serializeArray(), function( i, data ){
serData[data.name] = data.value;
});


$.ajax({
url: formUrl,
//dataType: 'json',
data: serData,
async: true,
method: 'POST',

success: function( data ){
// es kommt eine antwort, diese enthält auch das produkt,
// allerdings keine varianten auswahl und keinen preis
console.log(data);
$('.dbg').html(data);
},
error : function(e,a,b){
console.log('error');
console.log(e,a,b);
}
})

}


$('input[type=submit]').on('click', function(e){
e.preventDefault();
sendForm();
})
[/src]

Derzeit wird Shopware 4.3.6 eingesetzt.
 
Wieso machst du mehrere selects mit einem option?
Warum nimmst du da nicht checkboxen? das ist doch so sinnlos?
 
Dein Code sieht seltsam aus.

Zuerst initialisierst du serData als Objekt:
var serData = {};

Anschließend beschreibst du es als Array:
serData[data.name] = data.value;

Was willst du denn nun für einen Datentyp haben? Ein Array oder ein Objekt?
Falls es ein Array sein soll wäre die korrekte Initialisierung: serData = [];
Falls es ein Objekt sein soll wäre die korrekte Beschreibung der Felder, falls ich das richtig in Erinnerung habe: serData.{data.name} = data.value;

Du solltest dir auch mal ausgeben lassen, was du an den Server sendest:
console.log('Sending: ' + JSON.stringify(serData));
 
  • Thread Starter Thread Starter
  • #4
Wieso machst du mehrere selects mit einem option?
Warum nimmst du da nicht checkboxen? das ist doch so sinnlos?
Es ist das derzeitig laufende Template, wo ich noch nicht eingreife. Checkboxen würden in dem Fall aber auch in der länge das Design zerstören, da hier über ca. 10 Variantentypen vorkommen. Das oben ist nur ein Testcase.


Dein Code sieht seltsam aus.

Zuerst initialisierst du serData als Objekt:
var serData = {};

Anschließend beschreibst du es als Array:
serData[data.name] = data.value;
Daran sehe ich kein Problem, ich Beschreibe es Ursprünglich als Object, und werfe dann mit der Array Syntax ein. Es ist sicherlich keine sehr elegante Lösung, aber auch kein Fehler.

[src=javascript]
function whatsIt( data ){
return Object.prototype.toString.call( data )
}
[/src]
gibt [object Object] zurück. Auch gibt an das man Object Properties mit punkt notation oder bracket notatation beschreiben und auselesen kann. Auch auf wird es empfohlen, gerade bei Variablen ist es ja auch absolut Sinnvoll.


Das löst aber leider alles nicht mein Problem, die von virtus erwähnte Ausgabe vor dem Senden mache ich natürlich.
[src=javascript]{"group[149]":"810","group[150]":"823","group[152]":"840"}[/src]
Für mich steht er die Frage ob ich evtl. die falsche URL sende, oder ob Shopware prüft irgendwo ob es ein xmlhttprequest ist und gibt mir deshalb weniger Daten zurück.
Da ich Shopware aber kaum kenne, weiß ich nicht genau wonach ich suchen soll. Gibt es evtl. einen extra Controller für die Varianten?
 
Moin KingJamez!

Dein Code sieht seltsam aus.

Zuerst initialisierst du serData als Objekt:
var serData = {};

Anschließend beschreibst du es als Array:
serData[data.name] = data.value;

Das ist so nicht ganz richtig.
Es wird als Objekt deklariert korrekt, die zuweisung von
Object["feldName"] legt hierbei aber automatisch einen Schlüssel an da es sich nicht um einen Integer handelt sondern um einen String.
Anders liese sich das Feld dynamisch nicht anlegen der den Schlüsselnamen beinhaltet.


Zum Problem:
Überprüfe doch mal welche Parameter die PHP Datei ausgibt welche du im Action Feld mit angibst, vielleicht findest du dort einen Grund warum nicht alle Informationen zurückkommen.
Ist jetzt auch sehr allgemein aber ich kenne Shopware leider nicht :(
 
Eventuell hast du auch i.welche Plugins aktiviert, die die Post Daten killen.
Hatten wir schonmal bei einem ^^
 
  • Thread Starter Thread Starter
  • #7
Ich habe einen Ansatz einer Lösung und möchte diesen hier auch teilen, falls jemand nocheinmal ein ähnliches Problem hat.
Im template Ordner/details befindet sich eine ajax.tpl, diese wird vom controller/custom.php aufgerufen.
Diese Datei dient anscheinend eigentlich zur Vorschau, bevor man auf die Detailseite kommt, da wir das aber so nicht verwenden, kann ich diese Datei einfach umbauen, und meine gewünschten Daten dort anlegen. ( - click aufs produkt öffnet ein Modalfenster - dafür scheint das eigentlich zu sein).
Da ich noch keine Shopware erfahrung habe (werde ich jetzt aber ansammeln) weiß ich noch nicht ob und wie ich in der ajax.tpl parameter nutzen kann, was dargestellt werden soll. oder wie ich mehrere ajax.tpl files anlegen kann.

Vielen Dank den Helfern,
vielen dank auf für die erörterung des Object / Array problems. Immer wieder schön hier

__ edit
falls ich noch mehr in erfahrung bringe, was das problem eleganter löst, berichte ich es hier
 
Zurück
Oben