Hook auf eine private Funktion

Hallo liebes Forum,

ich würde gerne Die Action “articleByNumber” in dem Controller Emotion in einem Plugin überschreiben. Jedoch funktioniert es nicht.

Beim betrachten der Funktion ist mir aufgefallen, dass diese als private deklariert ist, wie kann ich diese jetzt überschreiben?

Anbei den Code von dem Plugin:

public function install()

 { $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_Widgets\_Emotion\_articleByNumber', 'onArticleByNumberAction' ); return true; } public function onArticleByNumberAction(Enlight\_Event\_EventArgs $args){ die('geht nicht! :/'); }

 

Private Methoden kannst du nicht hooken. Hier wirst du dir einen anderen Weg suchen müssen.

Viele Grüße

Ups, ich hab die Frage ausversehen als Diskussion gespeichert. Blush​ Kann das bitte jemand ändern? 

@Aquatuning GmbH schrieb:

Private Methoden kannst du nicht hooken. Hier wirst du dir einen anderen Weg suchen müssen.

Viele Grüße

Danke für deine Antwort. Aber wie soll ich das machen?

Wenn ein Artikel in der Einkaufwelt angezeigt werden soll passiert doch folgendes: Es wird auf die private Funktion getArticle zugegriffen und (wenn man ein ausgewähltes Produkt hat) dann auf articleByNumber, welches ebenfalls privat ist. Danach wird es schon im Template angezeigt. 

Hi,

hängt etwas davon ab, was du machen möchtest - die sGetPromotionById, die da benuztzt wird, kannst du recht vielseitig erweitern, über Hooks, Events oder Dekorieren der darin aufgerufenen StoreFront-Komponenten. 

Vielleicht kommst du ja so zum Ziel?

Daniel

Hallo Daniel,

aber wie soll ich den auf das sGetPromotionById kommen ohne getArticle anzupassen?

Hi,

bspw. über einen Hook auf \sArticles::sGetPromotionById oder Dekorierung des ListProduct-Service wie in Example plugin: storefront extension beschrieben. Du “weißt” da natürlich nicht, dass der Call über den Widget-Controller kam - das ist erstmal immer global. Aber normalerweise ist das ja sogar erwünscht, oder?

Daniel

1 „Gefällt mir“

Ok ich glaube es verstanden zu haben. 

Ich muss die Funktion sGetPromotionById von sArtikel überschreiben. Da prüfe ich ab, ob der mode fix ist und kann da mein Artikel holen wie ich möchte.

 

Vielen Dank [@Daniel Nögel](http://forum.shopware.com/profile/4010/Daniel Nögel „Daniel Nögel“)‍

 

Hallo [@Daniel Nögel](http://forum.shopware.com/profile/4010/Daniel Nögel “Daniel Nögel”)‍, ich hätte noch eine Frage. Ich habe das Plugin jetzt so umgeschreiben, dass es auf sGetPromotionById geht. Hier der Quellcode:

 public function install() { $this-\>subscribeEvent( 'sArticles::sGetPromotionById::replace', 'onSGetPromotionById' ); return true; } public function onSGetPromotionById(Enlight\_Event\_EventArgs $args) { $mode = $args-\>get('mode'); $category = $args-\>get('category'); $value = $args-\>get('value'); $withImage = $args-\>get('withImage'); $notifyUntil = Shopware()-\>Modules()-\>Articles()-\>eventManager-\>notifyUntil( 'Shopware\_Modules\_Articles\_GetPromotionById\_Start', array( 'subject' =\> $this, 'mode' =\> $mode, 'category' =\> $category, 'value' =\> $value ) ); if ($notifyUntil) { return false; } $value = Shopware()-\>Modules()-\>Articles()-\>getPromotionNumberByMode($mode, $category, $value, $withImage); if (!$value) { return false; } $result = Shopware()-\>Modules()-\>Articles()-\>getPromotion($category, $value); if (!$result) { return false; } return $result; }

 

An sich hat der Code den selben Stand, wie die Orginalfunktion nur habe ich das ‘$this’ durch ‘Shopware()->Modules()->Articles()’ ersetzt. Jetzt laden die Artikel in den Einkaufswelten nicht mehr. Die Fehlermeldung welche ich durch den Browser bekomme ist:  Call to a member function notifyUntil() 

Kann es damit zusammenhämgem dass notifyUntil private ist? 

 

#Edit: Fehlerteufel#

 

Hi,

ja, so solltest du das nicht machen - wenn überhaupt kannst du den Eventmanager auch über Shopware()->Events()->notifyUntil aufrufen. 

Generell ist ein Methoden-Replace ist immer etwas problematisch, einfach weil dafür dann viel kopiert wird und ggf. andere Plugins brechen. Falls du da mit einem after- oder before-Hook auch arbeiten kannst (oder sogar einem Event), wäre das sicher vorzuziehen.

Daniel