Replace Hook funktioniert nicht

Hallo,

ich möchte gerne die gesamte Funktion getContent überschreiben. Die Funktion ist dafür zuständig, dass zB der Artikelname beim Anfrageformular in das Feld Artikel übergeben wird.

HIer möchte ich ein weiteres Case für ein weiteres Anfrageformular haben. Erweitere ich die Core-Funktion, dann klappt das auch so wie ich möchte.

   case "detail":
                            if ($this->Request()->getParam('sOrdernumber', null) !== null) {
                                $getName = Shopware()->Modules()->Articles()->sGetArticleNameByOrderNumber($this->Request()->getParam('sOrdernumber'));
                                $text = Shopware()->Snippets()->getNamespace('frontend/detail/comment')->get('InquiryTextArticle');
                                $text .= " " . $getName;
                                $this->_elements[$id]["value"] = $text;
                                $element["value"] = $text;
                            }
                            break;
                            //für ein zweites Anfrage Formular 
                     case "test":
                     if (!empty($this->Request()->sOrdernumber)){
                        $getName = Shopware()->Modules()->Articles()->sGetArticleNameByOrderNumber($this->Request()->sOrdernumber);
                        $text = "Mein Text: Blabla ".$getName;
                        $this->_elements[$id]["value"] = $text;
                        $element["value"] = $text;
                     }
                     break;

Da dies natürlich nicht updatefähig ist, wollte ich die Änderung über ein Plugin realisieren, was einfach nicht klappt. Die Shopwarebeschreibung dazu ist eher mau, von daher die Frage.

Ich habe nun einen Hook erstellt und registriert:

 private function subscribeEvents()
    {
     
       		 $this->subscribeEvent(
            'Shopware_Controllers_Frontend_Forms::getContent::replace',
            'replacegetContent'
        );
        
      
    }

 

Dann wollte ich die komplette Funktion überschreiben:

	 protected function replacegetContent(Enlight_Hook_HookArgs $arguments)
    {
    		Funktion 1zu1 hier wieder aufrufen und mit der kleinen Änderung überschreiben
}  

Leider funktioniert das nicht, ich bekomme im Pluginmanager ein 500 Internal Server Error. Das Plugin liegt unter frontend im Ordner test, darin die Bootstrap.php.

Ich komme hier nicht weiter. Wenn ich den Hook unten wegnehmen, auch dann gibt es den 500er Fehler. Scheinbar ist also vielleicht schon ein Fehler bei der Registrierung, ich mache das aber genauso wie in der Doku beschrieben und finde hier keinen Fehler.

Vielleicht kann mir jemand etwas auf die Sprünge helfen.

Vielen Dank!

 

500 Internal Server Error … hmmm hört sich an, als ob an der PHP-Syntax etwas nicht stimmt. Komma vergessen, Klammer vergessen oder ein Zeichen was da nicht hingehört. Ist jetzt nur so eine Vermutung!

Du solltest einmal deine ShopConfig bearbeiten _ /ShopOrdner/config.php _

    ,'errorHandler' => [

        'throwOnRecoverableError' => false,

    ],

    'front' => [

        'noErrorHandler' => true,

        'throwExceptions' => true,

    ],

    'phpsettings' => [
        'display_errors' => 1,
    ]

 

lass dir mal die Fehlermeldungen ausgeben. Damit findet man oft den Fehler direkt. Die Meldung 500 Internal Server Error sagt ja nur das irgendwas schief geht, aber leider nicht was.

Ah, es lag an einer fehlenden }.

Wenn ich nun die original Funktion nun in den Hook packe, dann gibt es aber auch einen Fehler (diesmal alle Klammern dabei :)).

Ist es überhaupt möglich über replace eine ganze Funktion zu überschreiben? Oder habe ich das flsch verstanden?

 

Hi,

wie Dennis bereits angemerkt hat, solltest du die Fehlerausgabe aktivieren. So siehst du direkt, was los ist. Auch ein Blick ins Shopware-Log kann hier hilfreich sein.

Generell kannst du ganze Methoden hooken und mit einem Replace-Hook auch komplett ersetzen. Du kannst aber nicht einfach den Original-Content kopieren und nur “leicht” abändern, weil dann Aufrufe mit Scrope-Bezug wie $this->doSomething() nicht mehr passen, weil deine Bootstrap / dein Subscriber die Methode doSomething() nicht hat - sondern nur der Original-Controller. Das müsstest du also schon gezielt anpassen. Theoretisch kannst du mit $args->executeParent() arbeiten um die überschriebene Methode aus deinem Callback heraus aufzurufen. Oder du nutzt ein anderes Event / anderen Hook, mit dem du nicht alles ersetzen musst.

Daniel