wie Hook auf Shopware\Components\Api\Resource\Order::prepareOrderDetailsData() ?

tach zusammen,

 

ich mach mal wieder etwas API.

dabei geht’s darum das Order/Details/Attribute nicht gespeichert werden:

$client->put('Orders/12345?useNumberAsId=true', array(
   'orderStatusId' => 0,
   'paymentStatusId' => 17,
   'details' => array(
      array(
         'id' => 968,
         'status' => 1,
         'shipped' => false,
         'attribute' => array(
            'attribute2' => 'attributeValue'
         )
      )
   )
));

die zuständige methode ist:

Shopware\Components\Api\Resource\Order::prepareOrderDetailsData()

 

darin befindet sich:

$detailWhiteList = array(
   'status',
   'shipped',
   'id'
);

dadurch wird verhindert, dass attribute1-6 geschrieben werden und $detailModel->setAttribute() fehlt auch.

jetzt wollte ich halt per plugin diese methode überschrieben.

das subscribeEvent wäre meiner meinung nach:

$this->subscribeEvent(
   'Shopware\Components\Api\Resource\Order::prepareOrderDetailsData::replace',
   'prepareOrderDetailsDataReplace'
);

leider geht das nicht  :(

hat jemand ein tip für mich, danke.

Ist die Klasse überhaupt hookable?

na ich hoffe doch.

es sollten doch alle klassen gehen?

es sollten doch alle klassen gehen?

Das wär so schön…

Hi,

nein, es sind nicht alle Klassen hookable. Im Falle der API fehlt eine direkte Möglichkeit, Methoden zu überschreiben, um zu verhindern, dass sich mehrere API-Konsumenten ins Gehege kommen. Von daher könntest du in deinem Fall ggf. einen Issue aufmachen, falls da im Core die Attribute nicht richtig gehandelt werden.

Daniel

1 Like

Hallo zusammen,

ich habe ein ähnliches Problem.
Es ist sehr bedauerlich, dass sich die Klasse „Shopware\Components\Api\Resource\Order“ nicht erweitern lässt.

Die getList Methode bietet für eine Abfrage auf die Bestellungen aktuell keine Möglichkeit auf Order-Attribute zu filtern oder diese auszulesen.

Es fehlt ein leftJoin und AddSelect

$builder->addSelect(['attribute']);

$builder->leftJoin('orders.attribute', 'attribute');

Macht es Sinn dafür auch eine Issue zu eröffnen?
Würden die Shopware Entwickler hier etwas ergänzen?

Eigentlich möchte ich unabhängig ob von Shopware eine solche Erweiterung irgendwann umgesetzt wird, diese Möglichkeit gerne jetzt nutzen ohne den Quellcode im Shopware Core anzupassen und Shopware damit nicht mehr updatefähig zu machen.

Wie kann man da vorgehen, wenn die Klasse nicht hookbar ist?
Kann man eine eigene Resource für die API schreiben?

Beste Grüße
David

Kann man eine eigene Resource für die API schreiben?

Klar, in den dev-docs für SW4 ist dazu ne Anleitung (evtl nicht 1:1 auf SW5 übertragbar).

Du solltest von manchen (alle?) Orders-API-Klassen auch erben können .

1 Like
$this->subscribeEvent(
    'Enlight_Controller_Dispatcher_ControllerPath_Api_Bundle',
    'getController'
);

...

public function getController(){
    return $this->Path() . 'Controllers/Api/Bundle.php';
}

 

dein Controllers/Api/Bundle.php beinhaltet alle Actions (index, get, post und put).

damit machst du dir deine resource.

ich hab einfach auf 

Enlight_Controller_Action_PostDispatch_Api_Orders

ein subscribe gemacht. damit läst sich einfluss nehmen.

hätte halt lieber an die eigentliche methode angedockt, aber naja.

danke euch für eure hilfe.