Guten Morgen zusammen!
Ich stehe vor der Aufgabe, den Artikelpreis beim Speichern eines Artikels zu überschreiben. Hintergrund ist, dass der Kunde gerne den gewünschten Artikelpreis in ein Freitextfeld eintragen möchte. Wird der Artikel gespeichert, soll im Hintergrund der Preis mit von verschiedenen Faktoren beeinflussten Versandkosten addiert und anschließend in das Preisfeld von Shopware geschrieben werden.
Soweit habe ich das bereits geschafft, jedoch leider mit einem Manko: Ich kann mit folgendem Code das Speichern des Artikels abfangen und den Preis anpassen, doch zu diesem Zeitpunkt wurden anscheinend die neuen Werte in den Freitextfeldern noch nicht gespeichert. Daher muss der Artikel immer 2 Mal gespeichert werden, bis der korrekte Preis hinterlegt ist.
...
'Shopware\Models\Article\Price::preUpdate' => 'onAfterSaveArticleList',
...
public function onAfterSaveArticleList(\Enlight_Event_EventArgs $args)
{
$modelManager = $args->getEntityManager();
$model = $args->getEntity();
$article = $model->getArticle();
$articleDetails = $model->getDetail();
$newPrice = $model->getPrice();
$priceGroup = $model->getCustomerGroup();
$priceGroupKey = $priceGroup->getKey();
$articleId = $article->getId();
$articleDetailsId = $articleDetails->getId();
$sql = "SELECT attr15, attr16, attr17, karton1m, karton1m2, preis_endkunde FROM s_articles_attributes WHERE articledetailsID = ?";
$attributes = Shopware()->Db()->fetchRow($sql, $articleDetailsId);
... Versandkosten berechnen und addieren ...
if($priceGroupKey == 'EK') {
$priceEK = (floatval(str_replace(',', '.', $attributes['preis_endkunde'])) + $versandaufpreis) / 1.19;
$sql = "UPDATE s_articles_prices SET price = ? WHERE articleId = ? AND pricegroup = 'EK'";
Shopware()->Db()->prepare($sql)->execute([$priceEK, $articleId]);
$newPrice = $priceEK;
$model->setPrice($priceEK);
} elseif($priceGroupKey == 'EB') {
$priceEB = (ceil(floatval(str_replace(',', '.', $attributes['preis_endkunde'])) * 1.1) + $versandaufpreis) / 1.19;
$sql = "UPDATE s_articles_prices SET price = ? WHERE articleId = ? AND pricegroup = 'EB'";
Shopware()->Db()->prepare($sql)->execute([$priceEB, $articleId]);
$model->setPrice($priceEB);
}
Egal, ob ich mir den Wert aus dem Freitextfeld nun per SQL hole oder aber über das hier hinterlegte ArticleDetail ($articleDetails->getAttribute()->getPreisEndkunde()), ich erhalte immer den „alten“ Wert aus dem Freitextfeld, nicht den Wert, welcher gerade eingegeben wurde und nun gespeichert werden soll.
Ich habe auch bereits versucht, statt auf „Price“ eher auf „Article“ oder „Detail“ zu subscriben, doch das Ergebnis ist immer das Selbe.
Hat jemand von euch eine Idee, wie ich hier vorgehen kann, damit ich den aktuell zu speichernden Wert aus dem Freitextfeld bekomme?
Ich danke euch!