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.
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.
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.
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?
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.