Controllers-, oder Core-Klassen mit eigener public function extenden

 Hallo miteinander

Man kann via Events und Hooks ziemlich alle Funktionen editieren, überschreiben oder ähnliches.

Gerne möchte ich aber als Beispiel im enginge/Shopware/Core/sAdmin und engine/Shopware/Controllers/Frontend/Account jeweils eine eigene Funktion hinzufügen.

@Daniel Nögel schriebin diesem Beitrag:

Theoretisch kannst du auch den Controller durch einen eigenen Controller ersetzen (via Event) und den wiederum vom ursprünglichen Controller erben lassen.

Laut Daniel soll dies machbar sien, aber habe nirgends einen Weg gefunden dies zu bewerkstelligen.

Hart codiert funktioniert die Erweiterung bereits, aber nun soll daraus ein Plugin entstehen.

Mit freundlichen Grüssen
Das KMUdo Team

* Push *

Hat jemand eine Idee wie ein Controller oder eine Core-Klasse extendet werden kann?

Hi, 

bin gerade unterwegs, mal sehen, ob ich den Eventnamen zusammen bekomme :

 

Enlight_Controller_Dispatcher_ControllerPath_Frontend_Account. Damit kannst du den Account Controller austauschen. Ich würde aber abraten, das kann tendenziell andere Plugins brechen. Registriere dir lieber einen eigenen controller für deine Action, das hat mir bisher in all den Jahren immer ausgereicht. 

Schönen Gruß, 

Daniel 

Hi Daniel

Danke für Deinen Input.

Einen eigenen Frontend-Controller einzurichten kann ich folgendermassen:
Im gleichen Stil kann ja danach auch ein Controller überschrieben werden.

$this->subscribeEvent(
	'Enlight_Controller_Dispatcher_ControllerPath_Frontend_MeinController',
	'onMeinController'
);

public function onMeinController(Enlight_Event_EventArgs $arguments) {
	$this->Application()->Template()->addTemplateDir(
		$this->Path() . 'Views/'
	);
	return $this->Path(). 'Controllers/Frontend/MeinController.php';
}

Wie ist es dann mit einer Core-Klasse?

Mit einem Hook kann eine bestehende Funktion überschrieben werden, aber wie kann man eine neue Funktion erstellen?
Anbei ein Auszug vom “Wiki” von shopware.

$this->subscribeEvent(
    'sArticles::sGetArticleById::replace',
    'replaceGetArticleById'
);

public function replaceGetArticleById(Enlight_Hook_HookArgs $arguments)
{
    $articleId = $arguments->getId();
 
    $sql= "SELECT article.*, detail.*
           FROM s_articles article
           INNER JOIN s_articles_details detail
              ON detail.articleID = article.id
           WHERE article.id = ?";
 
    $articleData = Shopware()->Db()->fetchRow($sql, array($articleId));
    $articleData['articleName'] = 'Tutorial Artikel';
 
    $arguments->setReturn($articleData);
}

 

Etwas ähnliches wie folgendermassen ist leider nicht möglich.
Es kommt eine 503 Fehlermeldung mit: Fatal error : Call to undefined method Shopware_Proxies_sArticlesProxy::eigeneFunktion() in …
Hard codiert habe ich alles hinbekommen, nur in Plugin-Form leider noch nicht.

$this->subscribeEvent(
    'sArticles::eigeneFunktion::replace',
    'eigeneFunktion'
);

public function eigeneFunktion(Enlight_Hook_HookArgs $arguments)
{
    die("test");
}

Ist es möglich eine Core-Klasse zu extenden?
Kann es funktionieren mit class meineKlasse extends sArticles { … }? Wie kann dies im Bootstrap subscribed werden?

Mit freundlichen Grüssen
Das KMUdo Team

Warum machst du das eigentlich alles… Was hast du vor? Du bist mit Sicherheit auf dem falschen Weg und hast einen Bock in deinem Konzept.

Viele Grüße

Hallo Aquatuning

Das Konzept scheint zu funktionieren, wenn die neue Funktion in der originalen Core-Klasse integriert ist.
Dies ist natürlich nicht korrekt, wenn man in die sArticles direkt hineinschreibt. Somit ist ein Plugin dazu nötig.

Bestehende Core-Klassen zu editieren ist kein Problem, aber eine neue Funktion zu erstellen…
Leider habe ich dazu noch keine Lösung gefunden.

Mit freundlichen Grüssen
Das KMUdo Team