# Hook auf eine private Funktion

**URL:** https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273
**Category:** Programmierung
**Tags:** shopping-worlds, widgets
**Created:** [15. Juli 2016 um 11:13 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273 "2016-07-15T11:13:33Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![Soda](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@Soda](https://forum.shopware.com/u/Soda)
#### Post date: [15. Juli 2016 um 11:13 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/1 "2016-07-15T11:13:33Z")

</div>

Hallo liebes Forum,

ich würde gerne Die Action “articleByNumber” in dem Controller Emotion in einem Plugin&nbsp;ü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! :/'); }

```

&nbsp;

---

<div class="post-metadata">

### Author: ![EikeBrandtWarneke](https://avatars.discourse-cdn.com/v4/letter/e/cdc98d/32.png) [@EikeBrandtWarneke](https://forum.shopware.com/u/EikeBrandtWarneke)
#### Post date: [15. Juli 2016 um 11:15 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/2 "2016-07-15T11:15:07Z")

</div>

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

Viele Grüße

---

<div class="post-metadata">

### Author: ![Soda](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@Soda](https://forum.shopware.com/u/Soda)
#### Post date: [15. Juli 2016 um 11:15 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/3 "2016-07-15T11:15:25Z")

</div>

Ups, ich hab die Frage ausversehen als Diskussion gespeichert. ![Blush](https://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/blush.png "Blush")​&nbsp;Kann das bitte jemand ändern?&nbsp;

---

<div class="post-metadata">

### Author: ![Soda](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@Soda](https://forum.shopware.com/u/Soda)
#### Post date: [15. Juli 2016 um 11:23 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/4 "2016-07-15T11:23:18Z")

</div>

> [@Aquatuning GmbH schrieb:](https://forum.shopware.com/profile/11752/Aquatuning%20GmbH "Aquatuning%20GmbH")
> 
> 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&nbsp;getArticle zugegriffen und (wenn man ein ausgewähltes Produkt hat) dann auf&nbsp;articleByNumber, welches ebenfalls privat ist. Danach wird es schon im Template angezeigt.&nbsp;

---

<div class="post-metadata">

### Author: ![DanielNogel](https://avatars.discourse-cdn.com/v4/letter/d/96bed5/32.png) [@DanielNogel](https://forum.shopware.com/u/DanielNogel)
#### Post date: [15. Juli 2016 um 11:28 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/5 "2016-07-15T11:28:53Z")

</div>

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.&nbsp;

Vielleicht kommst du ja so zum Ziel?

Daniel

---

<div class="post-metadata">

### Author: ![Soda](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@Soda](https://forum.shopware.com/u/Soda)
#### Post date: [15. Juli 2016 um 11:34 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/6 "2016-07-15T11:34:34Z")

</div>

Hallo Daniel,

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

---

<div class="post-metadata">

### Author: ![DanielNogel](https://avatars.discourse-cdn.com/v4/letter/d/96bed5/32.png) [@DanielNogel](https://forum.shopware.com/u/DanielNogel)
#### Post date: [15. Juli 2016 um 11:56 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/7 "2016-07-15T11:56:30Z")

</div>

Hi,

bspw. über einen Hook auf&nbsp;\sArticles::sGetPromotionById oder Dekorierung des&nbsp;ListProduct-Service wie in&nbsp;[Example plugin: storefront extension](https://developers.shopware.com/developers-guide/example-plugin/) 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

---

<div class="post-metadata">

### Author: ![Soda](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@Soda](https://forum.shopware.com/u/Soda)
#### Post date: [15. Juli 2016 um 12:14 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/8 "2016-07-15T12:14:14Z")

</div>

Ok ich glaube es verstanden zu haben.&nbsp;

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

&nbsp;

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

&nbsp;

---

<div class="post-metadata">

### Author: ![Soda](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@Soda](https://forum.shopware.com/u/Soda)
#### Post date: [15. Juli 2016 um 14:33 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/9 "2016-07-15T14:33:51Z")

</div>

Hallo [@Daniel Nögel]([http://forum.shopware.com/profile/4010/Daniel](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&nbsp;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; }

```

&nbsp;

An sich hat der Code den selben Stand, wie die Orginalfunktion&nbsp;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:&nbsp;&nbsp;Call to a member function notifyUntil()&nbsp;

Kann es damit zusammenhämgem dass&nbsp;notifyUntil private ist?&nbsp;

&nbsp;

#Edit: Fehlerteufel#

&nbsp;

---

<div class="post-metadata">

### Author: ![DanielNogel](https://avatars.discourse-cdn.com/v4/letter/d/96bed5/32.png) [@DanielNogel](https://forum.shopware.com/u/DanielNogel)
#### Post date: [16. Juli 2016 um 22:18 UTC](https://forum.shopware.com/t/hook-auf-eine-private-funktion/38273/10 "2016-07-16T22:18:17Z")

</div>

Hi,

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

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
