Also, seit Shopware 5.2 gibt es eine neue Plugin Struktur, die meiner Meinung nach sauberer ist. Ich verwende auch nur noch die. Im Prinzip ist das recht ähnlich, weswegen vermutlich auch noch nicht an vielen Stellen die Dokumentation aktualisiert wurde. Anstatt von extra subscribeEvent aufzurufen, hast Du jetzt eine Methode, die auf einmal alle Events zurück gibt, die Du in Deinem Plugin brauchst.
Die Plugins nach der neuen Struktur liegen unter custom/plugins. Dort trägt jedes Plugin einen Namen. Es ist mehr oder weniger Konvention, dass ein Plugin Namen mit dem Firmen-Namen losgeht und mit dem eigentlichen Namen weitergeht (getrennt durch Großbuchstaben). Also zum Beispiel „Musterfirma“: MusterfirmaFarbvarianten.
Der korrekte Pfad zum Plugin wäre demnach custom/plugins/MusterfirmaFarbvarianten. Der Namespace des Plugins würde auch MusterfirmaFarbvarianten lauten. Anstatt der Bootstrap.php Datei hast Du nun eine MusterfirmaFarbvarianten.php Datei (gleicher Klassenname, gleicher Namespace) im Stammordner des Plugins:
custom/plugins/MusterfirmaFarbvarianten.php:
Die Datei custom/plugins/MusterfirmaFarbvarianten/Resources/services.xml:
Die Datei custom/plugins/MusterfirmaFarbvarianten/Subscriber/BaseSubscriber.php:
container = $container;
}
final protected function getPath()
{
if (empty($this->path)) {
$paths = explode(DIRECTORY_SEPARATOR, __DIR__ );
unset($paths[count($paths) - 1]);
$this->path = implode(DIRECTORY_SEPARATOR, $paths);
}
return $this->path;
}
/**
* A function that gives you the controller, view and request object from the EventArgs object
*
* Call it using
* list($controller, $view, $request) = self::getEverythingfromArgs($args);
*
* @param \Enlight_Event_EventArgs $args
* @return array
*/
protected static function getEverythingFromArgs(\Enlight_Event_EventArgs $args)
{
/**
* @var \Enlight_Controller_Action $controller
*/
$controller = $args->getSubject();
/**
* @var \Enlight_View_Default $view
*/
$view = $controller->View();
/**
* @var $request \Zend_Controller_Request_Http
*/
$request = $controller->Request();
return array($controller, $view, $request);
}
}
Die Datei custom/plugins/MusterfirmaFarbvarianten/Subscriber/AssetsCompiler.php:
'onCollectLessFiles',
'Theme_Compiler_Collect_Plugin_Javascript' => 'onCollectJavaScriptFiles'
];
}
public function onCollectLessFiles()
{
return new LessDefinition(
[],
[
$this->getPath() . '/Resources/Views/frontend/_public/src/less/all.less'
]
);
}
public function onCollectJavaScriptFiles()
{
$jsFiles = array(
$this->getPath() . '/Resources/Views/frontend/_public/src/js/main.js',
);
return new ArrayCollection($jsFiles);
}
}
Die Datei custom/plugins/MusterfirmaFarbvarianten/Subscriber/PluginFrontend.php:
'onPostDispatchDetail'
];
}
public function onPostDispatchDetail(\Enlight_Event_EventArgs $args)
{
/**
* @var \Enlight_Controller_Action $controller
* @var \Enlight_View_Default $view
* @var $request \Zend_Controller_Request_Http
*/
list($controller, $view, $request) = self::getEverythingFromArgs($args);
if (strtolower($request->getActionName()) === 'index') {
// Action: index
// [...]
}
}
}
Du kannst natürlich auch alle Events in die Datei custom/plugins/MusterfirmaFarbvarianten/MusterfirmaFarbvarianten.php packen, aber das wird recht schnell unübersichtlich. Deswegen gibt es die Möglichkeit, diese auszulagern. Und damit Shopware weiß, wo diese Subscriber liegen, gibt es unter Resources/services.xml eine Datei, die das beschreibt. Diese muss auch zwingend in diesem Pfad vorhanden sein, weil Shopware danach sucht. Bei allen anderen Ordnernamen und/-oder Unterordner bist Du frei.
Doctrime ist Objektrelationales Mapping Framework, das heißt Du hast PHP Klassen wie Datenbanktabellen. Weiterhin hat Doctrine eine Abstraktionsschicht geschaffen, die es möglich macht datenbankübergreifenden SQL zu schreiben, oder besser gesagt anhand ähnlich klingender Methoden generieren zu lassen. Das Paket hierzu nennt sich DBAL (Database Abstraction Layer).
Man kann mit Doctrine Datenbankunabhängige Queries schreiben, was die darunter liegende Datenbank austauschbar macht. Leider ist das bei Shopware nicht so. Für Shopware muss es MySQL sein. Außerdem entsprechen auch nicht ganz die gemappten PHP Klassen den entsprechenden Tabellen. Also in den Details, wie zum Beispiel Schlüsselbeziehungen. Das würde jetzt aber zu weit führen und deswegen möchte ich nicht weiter darauf eingehen. Wurde hier auch schon öfters im Forum diskutiert.
MFG
derwunner