Hooks auf keine Core-Class ?

Ich wünsche einen super sonnigen Guten Morgen :wink: Ist es möglich per Hook Plugin auf Shopware/Models/Document/Order.php zuzugreife? $event = $this-\>createHook( 'Shopware\_Models\_Document\_Order', 'getPositions', 'mygetPositions', Enlight\_Hook\_HookHandler::TypeReplace,0); $this-\>subscribeHook($event); (ich weiß, ich könnte es ja einfach probieren. Aber über eine AW würde ich mich freuen :wink: ) Danke

Ja - class Shopware\_Models\_Document\_Order extends Enlight\_Class implements Enlight\_Hook

Kurz und Knapp :wink: Merci

Frage zurück gezogen

Hi Stefan, ich brauche noch mal deine Hilfe. Mein Code geht nicht :frowning: class Shopware\_Plugins\_Backend\_OttschoPDFPositionOrder\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function install() { $event = $this-\>createHook( 'Shopware\_Models\_Document\_Order', 'getPositions', 'mygetPositions', Enlight\_Hook\_HookHandler::TypeReplace,0 ); $this-\>subscribeHook($event); $form = $this-\>Form(); $form-\>setElement('text', 'order\_by', array('label'=\>'Order By','value'=\>'od.articleordernumber DESC')); $form-\>save(); return true; } static function mygetPositions(Enlight\_Hook\_HookArgs $args) { $config = Shopware()-\>Plugins()-\>Backend()-\>OttschoPDFPositionOrder()-\>Config(); $this-\>\_positions = new ArrayObject(Shopware()-\>Db()-\>fetchAll(" SELECT od.\*, at.attr1, at.attr2, at.attr3, at.attr4, at.attr5, at.attr6, at.attr7, at.attr8, at.attr9, at.attr10, at.attr11, at.attr12, at.attr13, at.attr14, at.attr15, at.attr16, at.attr17, at.attr18, at.attr19, at.attr20 FROM s\_order\_details od LEFT JOIN s\_articles\_groups\_value g ON g.ordernumber=od.articleordernumber AND g.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_details d ON (g.articleID=d.articleID OR d.ordernumber=od.articleordernumber) AND d.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_attributes at ON at.articledetailsID=d.id WHERE od.orderID=? ORDER BY ".$config-\>order\_by,array($this-\>\_id)), ArrayObject::ARRAY\_AS\_PROPS); foreach ($this-\>\_positions as &$position){ $position["meta"] = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById('fix',0,$position["articleordernumber"]); } } Plugin ist installiert und aktiviert. Aber es ändert sich nichts. Mache ich die Änderung direkt in der Datei (ohne Plugin) so funktioniert es! Hast du eine Idee?

Lösche die Proxy-Klasse im Ordner /engine/Shopware/Proxies mal kurz und checke ob es danach funktioniert -

Leider war es das nicht. Ich habe das Plugin deinstalliert, die Proxie Datei gelöscht und das Plugin installiert. Die Proxie Datei wurde neu erstellt, aber es funktioniert trotzdem nicht!

Hey Stefan, ich habe noch was festgestellt. Wenn ich in der Belegerstellung auf Vorschau klicke, erhalte ich diesen Fehler: Fatal error: Using this when not in object context in /var/www/engine/Shopware/Plugins/Community/Backend/OttschoPDFPositionOrder/Bootstrap.php on line 55 ich habe nun noch die Deklaration hinzugefüht: protected _positions; Aber Fehler bleibt erhalten. Ich hoffe du hast eine Idee:shopware:

Ich konnte nun die ersten Fehler entfernen. In dem ich statt this-\>\_position nur _position verwende. Aber nun kommt: Fatal error: Call to a member function getArrayCopy() on a non-object in /var/www/engine/Shopware/Models/Document/Order.php on line 196 Der Plugin-Code sieht so aus: class Shopware\_Plugins\_Backend\_OttschoPDFPositionOrder\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { protected $\_positions; protected $\_id; public function install() { $event = $this-\>createHook( 'Shopware\_Models\_Document\_Order', 'getPositions', 'mygetPositions', Enlight\_Hook\_HookHandler::TypeReplace,0 ); $this-\>subscribeHook($event); $form = $this-\>Form(); $form-\>setElement('text', 'order\_by', array('label'=\>'Order By','value'=\>'od.articleordernumber DESC')); $form-\>save(); return true; } static function mygetPositions(Enlight\_Hook\_HookArgs $args) { $config = Shopware()-\>Plugins()-\>Backend()-\>OttschoPDFPositionOrder()-\>Config(); $\_positions = new ArrayObject(Shopware()-\>Db()-\>fetchAll(" SELECT od.\*, at.attr1, at.attr2, at.attr3, at.attr4, at.attr5, at.attr6, at.attr7, at.attr8, at.attr9, at.attr10, at.attr11, at.attr12, at.attr13, at.attr14, at.attr15, at.attr16, at.attr17, at.attr18, at.attr19, at.attr20 FROM s\_order\_details od LEFT JOIN s\_articles\_groups\_value g ON g.ordernumber=od.articleordernumber AND g.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_details d ON (g.articleID=d.articleID OR d.ordernumber=od.articleordernumber) AND d.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_attributes at ON at.articledetailsID=d.id WHERE od.orderID=? ORDER BY ".$config-\>order\_by,array(\_id)), ArrayObject::ARRAY\_AS\_PROPS); foreach ($\_positions as &$position){ $position["meta"] = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById('fix',0,$position["articleordernumber"]); } return true; } } Der Fehler kommt dann in der originalen Order.php Datei beim kopieren des Array. Muss ich das noch irgendwie von meinem Plugin in die Order.php übergeben? Hab nun dies noch hinzugefügt: $args->setReturn($position); ich verstehe es aber eig. nicht. Durch das Replace ersetze ich ja die komplette Funktion. Wenn ich doch dann die original Funktion kopiere und abändere, müsste es doch gehen?

Niemand eine Idee? :shopware:

Stefan, ich bin ein Stück weiter. Aber bringt mir nicht viel. Ersetze ich den Funktion komplett über TypeReplace so erhalte ich wenn $this->_position und $this->_id verwendet wird ein Fehler, dass $this nicht verwendert werden kann. Entferne ich $this, erhalte ich beim kopieren des Array einen Fehler, vermutlich weil es das Array dann nicht gibt bzw. in Order.php nicht verfügbar ist. Versuche ich es mit dem Type:After habe ich mit $this die gleichen Probleme. Entferne ich das $this, so sind die verwendeten Variablen _id und _position leer. Gebe ich statt _id direkt die OrderID aus der DB an, so wird der Code bzw. Sql Statement korrekt ausgeführt und in das Array $position geschrieben. Leider ist nun in der Order.php die $position des Pluigns unbekannt und es wird die original $position verwendet. Ich drehe mich hier im Kreis :frowning:

Stefan, hast du hier bitte noch einen Tipp, wie ich das Plugin hinbekomme? (ich will es eig. ungern direkt in der Datei machen)

Hallo ottscho, ich gehe mal von deinem Code-Beispiel aus. In einer statischen Klassenmethode gibt es kein $this. Hier ist ein Beispiel, wie es zu lösen ist: http://www.professionelle-softwareentwi … tatic.html Oder du holst dir die Instanz der Klasse in deiner statischen Funktion und greifst dann darüber auf die Variablen zu: $instance = Enlight_Class::Instance(__CLASS__); Vermute das war das Problem, oder?

Hey Ralf, danke für den Tipp. Das ist bestimmt das Problem, aber ich glaube ich raffe es noch nichts ganz. Habe den aufruf nun statt this-\>\_id so klassenname::_id Nun erhalte ich folgende Meldung: Fatal error: Cannot access protected property Shopware_Models_Document_Order::$_id Komplette Code: class Shopware\_Plugins\_Backend\_OttschoPDFPositionOrder\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function install() { $event = $this-\>createHook( 'Shopware\_Models\_Document\_Order', 'getPositions', 'mygetPositions', Enlight\_Hook\_HookHandler::TypeReplace,0 ); $this-\>subscribeHook($event); $form = $this-\>Form(); $form-\>setElement('text', 'order\_by', array('label'=\>'Order By','value'=\>'od.articleordernumber ASC')); $form-\>save(); return true; } static function mygetPositions(Enlight\_Hook\_HookArgs $args) { $config = Shopware()-\>Plugins()-\>Backend()-\>OttschoPDFPositionOrder()-\>Config(); Shopware\_Models\_Document\_Order::$\_positions = new ArrayObject(Shopware()-\>Db()-\>fetchAll(" SELECT od.\*, at.attr1, at.attr2, at.attr3, at.attr4, at.attr5, at.attr6, at.attr7, at.attr8, at.attr9, at.attr10, at.attr11, at.attr12, at.attr13, at.attr14, at.attr15, at.attr16, at.attr17, at.attr18, at.attr19, at.attr20 FROM s\_order\_details od LEFT JOIN s\_articles\_groups\_value g ON g.ordernumber=od.articleordernumber AND g.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_details d ON (g.articleID=d.articleID OR d.ordernumber=od.articleordernumber) AND d.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_attributes at ON at.articledetailsID=d.id WHERE od.orderID=? ORDER BY ".$config-\>order\_by,array(Shopware\_Models\_Document\_Order::$\_id)), ArrayObject::ARRAY\_AS\_PROPS); foreach ($\_positions as &$position){ Shopware\_Models\_Document\_Order::$position["meta"] = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById('fix',0,Shopware\_Models\_Document\_Order::$position["articleordernumber"]); } } }

Wenn ich es mithilfe von $instance = Enlight_Class::Instance(__CLASS__); mache. Wie komme ich zur _id aus der original Class? Ich kann damit ja nur Methoden aufrufen. Oder?

Nein, dass war nur dafür gedacht, wenn du auf Variablen in der Plugin-Klasse zugreifen willst - Code auf Seite 1 unten. Ich würde es mal so probieren (nicht getestet): $order = $args->getSubject(); $id = $order->_id;

1 Like

Oh man, so hatte ich es auch schon ohne Erfolg. Habe es nun ohne Unterstrich probiert $id = $args->getSubject()->id; So geht es. Komisch… Jetzt muss ich es nur noch hinbekommen, dass das Array $position an die original Klasse übergeben wird. Habe es einfach nur mit $position versucht, mit parent::$position und auch mit Shopware_Models_Document_Order::$position leider ohne Erfolg. Es kommt die Fehlermeldung: Fatal error: Call to a member function getArrayCopy() on a non-object in /kunden/117539_78141/webseiten/testshop/engine/Shopware/Models/Document/Order.php on line 196 An dieser Stelle wird normalerweise in der original Klasse das Array $position kopiert. static function mygetPositions(Enlight\_Hook\_HookArgs $args) { $config = Shopware()-\>Plugins()-\>Backend()-\>OttschoPDFPositionOrder()-\>Config(); $id = $args-\>getSubject()-\>id; $\_positions = new ArrayObject(Shopware()-\>Db()-\>fetchAll(" SELECT od.\*, at.attr1, at.attr2, at.attr3, at.attr4, at.attr5, at.attr6, at.attr7, at.attr8, at.attr9, at.attr10, at.attr11, at.attr12, at.attr13, at.attr14, at.attr15, at.attr16, at.attr17, at.attr18, at.attr19, at.attr20 FROM s\_order\_details od LEFT JOIN s\_articles\_groups\_value g ON g.ordernumber=od.articleordernumber AND g.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_details d ON (g.articleID=d.articleID OR d.ordernumber=od.articleordernumber) AND d.articleID=od.articleID AND od.modus=0 LEFT JOIN s\_articles\_attributes at ON at.articledetailsID=d.id WHERE od.orderID=? ORDER BY ".$config-\>order\_by,array($id)), ArrayObject::ARRAY\_AS\_PROPS); foreach ($\_positions as &$position){ $position["meta"] = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById('fix',0,$position["articleordernumber"]); } var\_dump($position); $args-\>set('position',$position); } Danke dir für deine Mühe.

Sorry, ‚_id‘ ist ja protected, da kann der Zugriff nicht funktionieren. Es geht mit ‚id‘, da am Ende der Klasse eine öffentliche (public) __get-Funktion ist.

Hast du auch noch eine Idee, wie ich die das Array $_positions von meinem Plugin dann rüber in die original Klasse bekomme? Habe nun alles mögliche versucht: args-\>setReturn(_positions); args-\>set(\_positions,_positions); parent:\_positions = _positions; parent:positions = _positions;

[quote=„ottscho“]Hast du auch noch eine Idee, wie ich die das Array $_positions von meinem Plugin dann rüber in die original Klasse bekomme? Habe nun alles mögliche versucht: args-\>setReturn(_positions); args-\>set(\_positions,_positions); parent:\_positions = _positions; parent:positions = _positions;[/quote] Die Brute Force Methode. :wink: Nein, hab auf die Schnelle leider keine Idee. Evtl. mal bei Shopware fragen, ob die ein Enlight->Event reinbauen? :wink: