Plugin Remotecombo mit Attributen nicht mehr möglich! - CSRFWhitelistAware (SW 5.2)

Hallo!

Ich habe gerade mit erschrecken festgestellt, dass per Plugin Remotecombos der Abruf von Attributen nicht klappt.
Mein Aufruf sah bisher immer so aus:

$form->setElement(
            'combo',
            'FooKey',
            array(
                'label' => 'Foo Label',
                'value' => "",
                'valueField' => 'id',
                'displayField' => 'name',
                'triggerAction' => 'all',
                'store' => 'new Ext.data.Store({
                    fields: [
                       "id",
                       "name"
                        ],
                       proxy : {
                         type : "ajax",
                         autoLoad : true,
                         api : {
                             read: document.location.pathname + \'Config/getList?_repositoryClass=attribute\',
                         },
                         reader : {
                         type : "json",
                         root : "data"
                         }
                    }
                    })',
                'required' => false,
                'scope' => Shopware\Models\Config\Element::SCOPE_SHOP
            )
        );

 

Die read Angabe wurde mal von Shopware hier im Forum empfohlen, weil der url controller in gewissen Umständen die URL cached.
Die Comboboxen bleiben leer, wenn ich die Backend URL selbst Aufrufe erhalte ich:

"Ups! Ein Fehler ist aufgetreten!

Die nachfolgenden Hinweise sollten Ihnen weiterhelfen.

The provided CSRF-Token is invalid. If you’re sure that the request should be valid, the called controller action needs to be whitelisted using the CSRFWhitelistAware interface. in engine/Shopware/Components/CSRFTokenValidator.php on line 108"

Was ist also zu tun? Ich benötige unbedingt Hilfe!

Nachtrag

Leider ging an mir die CSRFT Implementierung vorbei.
Habe mich an den Guide unter https://developers.shopware.com/developers-guide/csrf-protection/ gehalten (1:1), komme aber weiterhin nicht zum Erfolg.
Die Remotecombo bleibt leer. Da es ja unendliche viele Plugins gibt, die das gleiche machen werden (Kundengruppen/Freifelder abfragen) muss es da ja eine Lösung für geben …  Undecided

Schöne Grüße,
Niklas

Schöne Grüße,
Niklas

Um das nochmal zusammenzufassen, was ich gemacht habe, aber nicht funktioniert.

  • für den Support für SW < 5.2 „CSRFWhitelistAware.php“ in „Components“ angelegt:

  • in der Plugin-Bootstrap diese einbinden

  • CSRFWhitelistAware per use Anweisung einbinden

  • Interface in der Bootstrap verwenden

 

  • die Interface Methode getWhitelistedCSRFActions() implementieren (ich habe einfach mal ganz blöd alle Konstellationen probiert, nur um sicher zu gehen)

    /**
    * Returns a list with actions which should not be validated for CSRF protection
    *
    * @return string
    */

      public function getWhitelistedCSRFActions()
      {
    
          return array(
              'Config',
              'getList',
              'Config/getList'
          );
    
      }
    
  • der Rest ist Standard Plugin Prozedere, hier die Remotecombo

    $form->setElement(
    ‚combo‘,
    ‚FooKey‘,
    array(
    ‚label‘ => ‚FooLabel‘,
    ‚value‘ => „“,
    ‚valueField‘ => ‚id‘,
    ‚displayField‘ => ‚name‘,
    ‚triggerAction‘ => ‚all‘,
    ‚store‘ => ‚new Ext.data.Store({
    fields: [
    „id“,
    „name“
    ],
    proxy : {
    type : „ajax“,
    autoLoad : true,
    api : {
    read: document.location.pathname + ‚Config/getList?_repositoryClass=attribute‘,
    },
    reader : {
    type : „json“,
    root : „data“
    }
    }
    })‘,
    ‚required‘ => false,
    ‚scope‘ => Shopware\Models\Config\Element::SCOPE_SHOP
    )
    );

Das alles lässt sich installieren, die Combo bleibt aber leer.
Meiner Meinung nach habe ich das so wie in der Doku gemacht.
Trotzdem bleibt die Remotecombo leer, da offensichtlich das HTTP GET nicht funktioniert.

Kann es sein, dass diese ganze CSRF Doku sich nur auf eigene Methoden beziehen, und gar nicht auf Methoden von anderen Backend Controllern?
Wenn ich mir die isWhitelisted() im CSRFTokenValidator angucke, werden ja nur eigene Methoden geprüft.

Habe einen Verweis zu diesem Beitrag ebenfalls im jira angelegt: https://issues.shopware.com/#/issues/SW-15458

Nachtrag 1

Es wird immer schöner … ich glaube, das Whitelisten funktioniert, das Problem liegt wohl eher darin, dass Config/getList?_repositoryClass=attribute gar keine Ergebnisse liefert, da die Methode nicht mehr in 5.2 existiert. Das wurde natürlich nicht in der UPGRADE.md genannt …  Foot-in-Mouth Was ist denn jetzt die alternative um Attribute abzufrufen? Super ärgerlich, da nun offensichtlich extra für 5.2 die URL Abfragen in den Forms angepasst werden müssen. Was dann wieder bedeutet, dass man alle Kunden mit Plugins auf den 5.2 Wechsel die Plugins neu installieren lassen muss … das ist doch blöd

Nachtrag 2

Ich kämpfe mich weiter durch und dokumentiere mal mit. Ich versuche nun herauszufinden, wie Artikel Freitextfelder per Backend Methide zurück kommen können. Der neue Menübereich für die Attribute verwendet …/backend/AttributeData/list?..

Nicht nur, dass egal wie ich die URL mit Parametern änder das nichts an der Selektion macht - ich verstehe auch nicht, welcher Controller wirklich verwendet wird. Einen Backend Controller AttributeData existiert jedenfalls nicht. Ich suche einfach einen Weg, wie per Remotecombo eine Liste mit aktiven und verfügbaren Artikel Freitextfeldern zurück kommt. Das funktionierte jetzt seit über 2 Jahren so wie oben beschrieben ohne Problem …

Bitte um dringende Hilfe!
Niklas

Hi Niklas,

wenn ich das richtig verstehe, möchtest du die vefügbaren Attributefelder in einer Combobox auswählbar machen. Da nun alles von dem Attributmanagement verwaltet wird, läuft der Aufruf etwas anders. In deinem zweiten Nachtrag hast du eigentlich schon die Lösung genannt - und zwar attributeData/list zu verwenden.

Folgendes Beispiel als read Parameter funktioniert bei mir:

read: document.location.pathname + 'attributeData/list?table=s_articles_attributes'

Zusätzlich musst du darauf achten, dass sich die Keys in der Rückgabe geändert haben, somit wird „name“ zu „columnName“.

LG, Jan

Hallo Jan!

Danke für das schnelle Feedback.

Das ist ja schon einmal was, ein großer Unterschied ist nur jedoch zur alten Funktion, dass bei der neuen alle Artikel Freitextfelder zurück kommen und nicht nur die “aktiven”.
Da ich nicht finde, wo der attributeData Controller ist, weiß ich nicht, wie ich nur aktive selektiere könnte.
Das wäre wohl die Eigenschaft “configured” im jeweiligen Freitextfeld - hast Du da noch eine Idee?

Schöne Grüße,
Niklas

Hi Niklas,

vorab - der Controller liegt im AttributeBundle in engine/Shopware/AttributeBundle/Controllers.

Du kannst bei deiner Store-Definition noch mehr Parameter mitgeben wie z.B. filters. Hier mal ein Beispiel um nur die Attribute anzuzeigen, die auch eine ID haben. Das kannst du dann natürlich noch variieren mit anderen Properties usw.

        $form->setElement(
            'combo',
            'FooKey',
            array(
                'label' => 'FooLabel',
                'value' => "",
                'valueField' => 'id',
                'displayField' => 'columnName',
                'triggerAction' => 'all',
                'store' => 'new Ext.data.Store({
                    fields: ["id", "columnName"],
                       proxy : {
                         type : "ajax",
                         autoLoad : true,
                         api : {
                             read: document.location.pathname + \'attributeData/list?table=s_articles_attributes\',
                         },
                         reader : {
                             type : "json",
                             root : "data"
                           }
                        },
                         filters: [
                            function (record) {
                                return record.get("id") != null;
                            }
                        ]
                    })',
                'required' => false,
                'scope' => Shopware\Models\Config\Element::SCOPE_SHOP
            )
        );

 

1 „Gefällt mir“

@Jan Bücker schrieb:

Hi Niklas,

vorab - der Controller liegt im AttributeBundle in engine/Shopware/AttributeBundle/Controllers.

Du kannst bei deiner Store-Definition noch mehr Parameter mitgeben wie z.B. filters. Hier mal ein Beispiel um nur die Attribute anzuzeigen, die auch eine ID haben. Das kannst du dann natürlich noch variieren mit anderen Properties usw.

$form->setElement(
‚combo‘,
‚FooKey‘,
array(
‚label‘ => ‚FooLabel‘,
‚value‘ => „“,
‚valueField‘ => ‚id‘,
‚displayField‘ => ‚columnName‘,
‚triggerAction‘ => ‚all‘,
‚store‘ => ‚new Ext.data.Store({
fields: [„id“, „columnName“],
proxy : {
type : „ajax“,
autoLoad : true,
api : {
read: document.location.pathname + 'attributeData/list?table=s_articles_attributes',
},
reader : {
type : „json“,
root : „data“
}
},
filters: [
function (record) {
return record.get(„id“) != null;
}
]
})‘,
‚required‘ => false,
‚scope‘ => Shopware\Models\Config\Element::SCOPE_SHOP
)
);

 

 

Hallo Jan!

Funktioniert perfekt, vielen vielen Dank!
Einziger Wermutstropfen ist dann die nötige Neuinstallation von Plugins, um die Forms korrekt zu setzen - in Abhängigkeit der eingesetzt Shopware Version.
Aber, das ist dann eben leider so - jedenfalls hat man jetzt mit dem Beispiel wenigstens wieder etwas, was wie vorher funktioniert.

Schöne Grüße und nochmals vielen Dank,
Niklas Teich