[PLUGIN][PHP][REQUEST] POST-Variable als Array wird nur teilweise übergeben (?)

Hi,

ich habe mal wieder eine Frage technischer Natur:
Wenn ich ein Array per Post übergebe, bspw. so:

 

{block name="frontend_listing_list_inline" prepend}

{/block}


{block name="frontend_listing_box_article_buy"}
  
    
    {s namespace="frontend/listing/box_article" name="ListingBuyActionAdd"}{/s}
  
{/block}

{block name="frontend_listing_list_inline" append}
  
{/block}

und diese dann - in einem PreDispatchEvent -…

public static function getSubscribedEvents()
{
  return [
    'Enlight_Controller_Action_PreDispatch_Frontend_Checkout' => 'extendAddArticle'
  ];
}

… - versuche folgendermaßen auszulesen …

$one = $args->getRequest()->getPost();
$two = Shopware()->System()->_POST["sAdd"];
$three = $_POST["sAdd"];

… funktioniert das leider für mich nicht.

 

Zum klarstellen, das hier geht rein (kein LESS sondern Form Data, aber so ist’s deutlicher :slight_smile: ):

sAdd: SW10006
sAdd: SW10005
sAdd: SW10004
__csrf_token: WBu14Hx8v6gpnztSxyMxM1AMFacZ1i
isXHR: 1

und das hier kommt dabei dann raus:

{"sAdd":"SW10004","__csrf_token":"WBu14Hx8v6gpnztSxyMxM1AMFacZ1i","isXHR":"1"}

Ist das ein Bug? Oder ein Feature? ^.^

Ich könnte das Array verdammt gut gebrauchen, ich glaube man kann schon erraten wofür…

Übersehe ich hier was? Arrays per $_POST zu übergeben sollte ja eigentlich kein Hexenwerk sein… & ich währe für einen hilfreichen Tipp (oder gar eine Lösung) schon sehr dankbar :)

 

Lg Flo

 

P.s.: Im Forum hab ich übrigens zur Version 4 einen Beitrag gefunden, der ein änliches Problem hat(te)… Hat mir nur leider nicht geholfen: https://forum.shopware.com/discussion/28232/variantenwechsel-durch-manipulation-des-post-arrays

Moin.

Werden denn sAdd als Array übergeben? Da du nur den letzten siehst, werden die davor überschrieben, bzw ist es nur ein String.
In deiner Form müssten die sAdd als name=„sAdd[]“  (<= eckige Klammern) angelegt worden sein, damit ein Array übermittelt wird.

..
.

.
..

Kannst ja mal mit

$this->Request();

einfach gegenprüfen ob es überhautp ein Array ist. Das sieht nämlich nicht so aus.

Grüße

1 „Gefällt mir“

Moin optimondo,

ja danke - das ist ja genau das Problem - es wird kein Array übergeben, wo ein’s übergeben werden sollte.
Zu deiner Antwort: Ja, Array’s haben ein dahinter - in PHP. Übergeben kannst du die meines Wissens nach auch ohne (ist m.A. nach sogar semantisch nicht komplett korrekt, dahinter zu setzen, aber das ist ja nur aussehen…).

Naja, & wenn ich das, so wie ich es oben geschrieben habe, in Plain-PHP schreibe geht’s doch auch?! :p

Ich hoffe du & ihr versteht jetzt langsam worauf ich raus will…

 

Lg Flo

P.s.: Deine „Prüfung“, also die Ausgabe mache ich auch, nur halt mit json.serialize -> da werden keine Arrays wegretuschiert o.ä. und ich sehe ALLES - auch im normalen Shopware Debug log (den verwende ich, damit mein chef sieht das ich auch wirklich Probleme habe und nicht nur so tue ;) ).

P.p.s.: Hab’s getestet. Mit eckligen klammern dahinter geht es auch nicht… ^^

Eine Form kann nicht mit dem gleichen name und mehreren Werten übergeben zu werden ohne das es einfach nur ein String wird.
Ist rein technisch nicht möglich und hat mit PHP nichts zu tun. Der Browser wird es nicht umsetzen.

Die Werte werden nur mit eckigen Klammern zu einem assoziativem Array. Deswegen kommt auch nur der letzte Wert (SW10004) an.

Warum dann aber immer noch nichts ankommt weiß ich nicht. Tippe jetzt einfach mal auf den Cache.

Btw. Checkboxen werden nur vom Browser übermittelt wenn sie angehakt sind. Aber das wirste ja wissen  Wink

Grüße

Oh wow optimodo… Das ist leider falsch. Schau dir bitte nochmal meine erste Antwort an.
Ich habe dir geschrieben was der Browser sendet “[STRG+F] Form Data” (ja, es gibt Leute wie mich, die können, wollen und werden das nachvollziehen! Wenn du das nicht mit Wireshark machen willst - über die DevKonsole deines Browsers (Reiter Networks =) ) geht’s auch). 

Aber ich bin dir nicht böse :slight_smile: Nochmal als Link, weil Internet geht ja nicht ohne Quellen… (guck dir bitte auch das UPDATE an :wink: ) php - How to pass an array within a query string? - Stack Overflow

Ich gebe dir in der Hinsicht Recht, das PHP die Variablen mit automagisch Konvertiert - oder konvertieren soll. Nur leider ist diese Konvertierung dann weg, wenn ich es in Shopware wiederverwenden möchte - dann komme ich nämlich zu meinen oben beschriebenen Ergebnissen… 

Ja, das weis ich. Eine Checkbox ist dazu dar, ausgewählt zu werden. Das ist extra so gemacht, damit ich sehe, ob’s nen Unterschied macht, ob ich eine oder mehrere mitschicke, ohne das Plugin neu zu packen und den Cache löschen zu müssen - reine Faul… ähhhe Zeitersparnis :wink:

Lg Flo

P.s.: Schau doch mal bitte die rfc1866 an, Kapitel “8.2.4”. Selbst da werden Variablen schon als Array mitgegeben, und zwar so wie ich es oben beschrieben habe. Ist also sogar De-Facto-Standard. Also sag bitte nicht, es geht technisch nicht! Oder muss ich erst noch mit 'nem PoC um die Ecke kommen damit du mir glaubst?! ^^

Am Rande: wenn du deine checkboxen VOR der standard Shopware buybox hast, dann wird dort dein Array wieder per name=“sAdd”… überschrieben.

Viele Grüße
https://www.digitvision.de

@Aquatuning GmbH schrieb:

Am Rande: wenn du deine checkboxen VOR der standard Shopware buybox hast, dann wird dort dein Array wieder per

Viele Grüße

Per … was? ^^

Sie werden korrekt mitgegeben. Bspw. wenn ich allen einen verschiedenen Namen gebe. Aber das ist verdammt unschön, unperformant, weil PHP/Smarty für jedes ein bisschen mehr generieren/ausgeben muss, ich beim verarbeiten der Form-Data wieder ein paar Funktionsaufrufe mehr habe, was mehr Code bedeuted und das im Front- und in Backend - und SEO leidet auch drunter… ^^
Also alles andere als schön!

Oder wolltest du etwas anderes schreiben…? :slight_smile:

Lg Flo

…this is very much framework-specific.

Dann wirds wohl Shopware rausfiltern, bzw nicht verstehen.

Falsch ist übrigens nix. Form Data ist Form Data, ob mit Submit oder Javascript. Ich schreibe fast nur Plugins auf Ajax-Basis und weiß wie ich Daten, egal welcher Art zum EventHanlder bringe. Auch via -webkit etc… So gehts in SW nicht. 
Du versuchst etwas experimentell zu basteln was du irgend wo gelesen hast und wunderst dich das der Shopware Filter das rausfischt bzw Shopware nicht lesen kann.

Aber hey, back to the roots… Mach es so wie du’s gelernt hast. Anpassen geht später immer noch.

Willste mich rollen? Genau auf das erste deiner Antwort will ich schon die ganze Zeit raus!

Natürlich ist das NICHT experimentell. Die RFC ist von 19… und von Tim selbst schon so im Standart 2.0 verewigt. Es geht in C, Go, RoR und bestimmt noch vielen mehr. Ja, ich kann mehr als Shopware. Ja, ich schreibe dir PoCs, kann ich dir dann auch öffentlich zukommen lassen, aber nicht in der Ringbahn, auf das du dann endlich zufrieden bist.

Ich sehe mir eine qualifizierte Antwort herbei. Also lass mal mitte die anderen Ihre Meinung dazu kundtun, du hast genug gesagt für heute.

Moin zusammen,

wir haben uns hier alle lieb, ja?  Wink

Ich habe das schon mehrfach benutzen müssen und dachte mir, dass ich mir mal die zwei Minuten Zeit nehme, um das zu testen.
Geschwind einen neuen Controller (engine/Shopware/Controllers/Frontend/Foo.php) angelegt: 
( Achtung, Core Anpassung, nicht nachmachen, war jetzt nur ein Test! )

";
        print_r($this->Request()->getParams());
        echo "

"; exit(); } }

Und das dazugehörige Template unter themes/Frontend/Bare/frontend/foo/bar.tpl:

{extends file="parent:frontend/index/index.tpl"}

{block name="frontend_index_content_main"}
    
        Example 1
        
        
        

        Example 2
        
        
        

        
    
{/block}

Die Inputs dann mit 1-6 gefüllt (Feld 1 mit Value 1, Feld 2 mit Value 2, usw.).
Ergebnis:

Array
(
    [module] => frontend
    [controller] => foo
    [action] => test
    [example1] => 3
    [example2] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )
)

Läuft einwandfrei MIT Notation.
Da müsste man also mal im Detail schauen, warum das bei dir auch mit den eckigen Klammern nicht läuft.
Erster Ansatz wäre ggf. das  getPost  durch  getParams  zu ersetzen, magst du das mal testen?
Natürlich ist  getPost  erstmal besser für deinen Fall - aber möglicherweise scheitert’s daran.

Gruß,
Patrick  Shopware

1 „Gefällt mir“

Ok - bei mir fehlte wohl die Hälfte :smiley:

Mein Punkt: wenn du dich VOR die buybox setzt, dann sieht das Ergebniss in etwa so aus:

< input name=sAdd
< input name=sAdd
< input name=sAdd…

Die Shopware buybox überschreibt deine Notation wieder.

Viele Grüße
https://www.digitvision.de

1 „Gefällt mir“

Ich will jetzt nix dazu sagen, aber… genau das was Patrick geschrieben hat, habe ich versucht zu vermitteln. Ohne gehts im SW nicht  Wink

Aber muss ja erst ein Mod mit Beispiel das gleiche schreiben damit es akzeptiert wird  Undecided

Wow! 

@Patrick Stahl schrieb:

Läuft einwandfrei MIT Notation.
Da müsste man also mal im Detail schauen, warum das bei dir auch mit den eckigen Klammern nicht läuft.
Erster Ansatz wäre ggf. das  getPost  durch  getParams  zu ersetzen, magst du das mal testen?
Natürlich ist  getPost  erstmal besser für deinen Fall - aber möglicherweise scheitert’s daran.

Perfekt! Es läuft.

Und zwar über alle drei Methoden (egal ob getPost, getParams, $_POST). Es war für mich wohl einfach zu heiß hier in Berlin, ich entschuldige mich aufrichtig bei allen für den Stress :x

 

Woran es vmtl. lag (durchsuche grad meinen git-log): Aquatuning GmbH hatte Recht und ich hab den Block mit dem Input vergessen zu überschreiben & dachte die ganze Zeit es währe nicht mein Fehler - shame on me :x

 

Ich hab heute viel gelernt :slight_smile: Danke und einen schönen (hoffentlich entspannten) Tag euch allen dreien noch!

Lg Flo