Hallo zusammen,
ich habe ein kleines Plugin geschrieben, welches Bestellungen, sobald sie bezahl worden sind, an ein Drittsystem überträgt. Dies funktioniert, jedoch bin ich mir nicht sicher, ob der Code so wirklich dem aktuellen Shopware-Standard entspricht. Das Plugin besteht lediglich aus einen Event-Listener, der, sobald der Order-Status auf “completely_paid” gesetzt wird, die Order-ID an das Drittsystem übermittelt. Hier der Code des Subscribers, die Stellen mit TODO wären auch schon meine “Problemzonen”. :
class ThomasGGOrderNotification extends Plugin
{
public function __construct(string $pluginName, ConfigReader $configReader)
{
$this->config=$configReader->getByPluginName($pluginName);
}
public function createOrderFulfillment(\Enlight_Event_EventArgs $args) {
$entity=$args->get('entity');
if ($entity==null || $entity->getPaymentStatus()==null || $entity->getPaymentStatus()->getName()!='completely_paid') {
return;
}
$details=$entity->getDetails();
if ($details==null) {
return;
}
foreach ($details as $num=>$detail) {
$articleID = $detail->getArticleId();
// TODO Ist Shopware() hier noch korrekt?
$article = Shopware()->Models()->find('Shopware\Models\Article\Article', $articleID);
if ($article != null) {
$supplier = $article->getSupplier();
if ($supplier==null || strpos($supplier,'Shirtigo Cockpit')===false) {
return;
}
}
// TODO Wie bekomme ich das durch DI?
$em = Shopware()->Container()->get('models');
// TODO Ist Shopware() hier noch korrekt?
$user = Shopware()->Models()->find('Shopware\Models\User\User', 51);
$component = new FulfillmentCreatorComponent($user, $entity, $this->config['ThomasGGShirtigoIntegrationReference']);
$dataArray = $em->toArray($details);
$component->createFulfillment($dataArray);
}
}
}
Meine Fragen wären:
- Wie kann ich das User-Model über den Namen, und nicht über die ID laden?
- Ist die Logik in dieser Klasse überhaupt korrekt aufgehoben? Oder sollte sie lieber in die Bootstrap.php ausgegliedert werden?
- Sind die Shopware()-Aufrufe an dieser Stelle korrekt? Meines Wissens sollte Shopware() generell vermieden werden.
Danke für eure Hilfe!
Thomas