Problem Offcanvas-Warenkorb mit php8 und Grundpreisangabe

Hallo zusammen,

nach langem experimentieren ist es mir nun endlich gelungen, Shopware 5 Updates wieder einzuspielen. Und somit habe ich Schrittweise von 5.6.6 zu 5.7.15 die Updates eingespielt. 5.7.16 nicht, da das neue Fehler bringt, zu denen ich aber erst demnächst komme – immer ein Problem nach dem anderen.

Mit dem Update auf die zweit-neueste Version wollte ich auch endlich von php 7.4 auf php 8.0 umstellen. Doch das bringt mich nun zu einem aktuellen Problem:

Stelle ich auf php 8 um (Production-Ordner natürlich erneuert) so kann man als Kunde keine Artikel mehr in den Warenkorb legen. Der Off-Canvas Warenkorb zeigt nur das Ladesymbol, es geht nichts weiter.

Ich habe dann Schritt für Schritt alle Plugins gelöscht (richtig gelöscht, nicht nur deaktiviert) bis nichts mehr da war – Problem besteht weiter. Dann habe ich mal Testweise das Standard-Responsive-Theme eingeschalten – und siehe da, es funktioniert wieder.

Ok, das Problem liegt also in meinem Theme – ich hatte da auch eine Idee und konnte es durch löschen der Datei “ajax_cart_item.tpl” im Ordner “/themes/Frontend/THEMENAME/frontend/checkout” auch beheben. Ist die Datei weg, kann ich auch mit meinem Theme problemlos wieder Artikel in den Warenkorb legen.

Das eigentliche Problem ist aber, das ich diese angepasste Datei unbedingt brauche. Sie sorgt nämlich dafür, das der Grundpreis auch im Offcanvas-Warenkorb angezeigt wird, was ja rechtlich notwendig ist, im Standard aber nicht enthalten ist.

Die Datei hat folgenden Inhalt:


{extends file="parent:frontend/checkout/ajax_cart_item.tpl"}
 
{block name="frontend_checkout_ajax_cart_articlename_price"}
    {$smarty.block.parent}
    {if count($basketItem.additional_details.prices) > 0 && $basketItem.additional_details.prices[0].referenceprice}{assign var="price" value=$basketItem.additional_details.prices[0]}
<span class="item--name" style="font-size:0.75em"><b>Inhalt:</b> {$sBasketItem.purchaseunit|string_format:"%.2f"} {$sBasketItem.itemUnit}</span></style><br>    
<span class="item--name" style="font-size:0.75em">(Grundpreis: {$price.referenceprice|currency}* / {$price.referenceunit} {$price.sUnit.unit})</span></style>
    {/if}
{/block}

Da alles Problemlos funktioniert, sobald ich wieder auf php 7.4 zurückstelle, liegt es eindeutig an php 8. Aber da bin ich absolut am Ende mit meinem Latein – was genau macht php 8 anders, damit o.g. Anpassung nicht mehr funktioniert?

Wer hat eine Idee, was ich ändern muss, damit php 8 funktioniert und ich trotzdem den Grundpreis im Offcanvas-Warenkorb angezeigt bekomme?

Hallo @Andreas_147

im Shopware Fehler Log ist dazu nichts? Ansonsten mit diesem Artikel nach einer Fehlermeldung suchen. Shopware 5 - Tutorials & FAQs - Fehlermeldungen in Shopware debuggen
Sonst kann man nur wild raten.

Viele Grüße aus Schöppingen
Michael Telgmann

Könnte es sein, dass count unter PHP auf ein Null-Object rummeckert, also wenn $basketItem.additional_details.prices leer also kein array ist? Ist in smarty is_array erlaubt?

Das ganze evtl. so

{if is_array($basketItem.additional_details.prices) && count($basketItem.additional_details.prices) > 0 && $basketItem.additional_details.prices[0].referenceprice}{assign var="price" value=$basketItem.additional_details.prices[0]}

Und wenn is_array nicht geht, zumindest im if testen, ob die Var nicht leer ist.

1 „Gefällt mir“

Danke zusammen! Ich werde mich mal durchprobieren und die anpassung von @sonic probieren. Eine idee kam mir noch in den Sinn. Es gibt ja inzwischen die Option, die wesentlichen Merkmale im gesamten Checkout anzeigen zu lassen - damit müsste der Grundpreis ja auch im Offcanvas-Warenkorb angezeigt werden, oder? Ich habe das bei mir zwar auf „Nein“ stehen, aber kann es sein, das sich diese Anpassung mit meiner Änderung trotzdem beißt?

Also, es gibt zwei Möglichkeiten die zum Ziel führen. Einmal die Anpassung von @sonic an der Datei ajax_cart_item.tpl:

{extends file="parent:frontend/checkout/ajax_cart_item.tpl"}

{block name="frontend_checkout_ajax_cart_articlename_price"}
    {$smarty.block.parent}
   {if is_array($basketItem.additional_details.prices) && count($basketItem.additional_details.prices) > 0 && $basketItem.additional_details.prices[0].referenceprice}{assign var="price" value=$basketItem.additional_details.prices[0]}
<span class="item--name" style="font-size:0.75em"><b>Inhalt:</b> {$sBasketItem.purchaseunit|string_format:"%.2f"} {$sBasketItem.itemUnit}</span></style><br>    
<span class="item--name" style="font-size:0.75em">(Grundpreis: {$price.referenceprice|currency}* / {$price.referenceunit} {$price.sUnit.unit})</span></style>
    {/if}
{/block}

hier wird der Grundpreis dann wieder korrekt angezeigt - im Offcanvas-Warenkorb. Ebenfalls möglich ist es, die Datei ajax_cart_item.tpl nicht zu verwenden - und unter den Einstellungen > Bestellabschluss den Punkt „Wesentliche Merkmale im gesamten Checkout Prozess anzeigen“ anwählen. In der Spalte darüber gibt man den Text ein:

{if $sBasketItem.purchaseunit && $sBasketItem.purchaseunit != 0}
   <span class="price--label label--purchase-unit is--bold is--nowrap">
      Inhalt:
   </span>
   <span class="is--nowrap">
      {$sBasketItem.purchaseunit|floatval} {$sBasketItem.additional_details.sUnit.description}
   </span>
{/if}

{if $sBasketItem.purchaseunit && $sBasketItem.additional_details.referenceunit && $sBasketItem.purchaseunit != $sBasketItem.additional_details.referenceunit}
   <span class="is--nowrap">
      ({$sBasketItem.additional_details.referenceprice|currency} * / {$sBasketItem.additional_details.referenceunit} {$sBasketItem.additional_details.sUnit.description})
   </span>
{/if}

Dann habe ich noch ein Problem, das sich durch die o.g. vorgehensweise, die wesentlichen Merkmale im gesamten Checkout anzuzeigen, zwar beheben lässt - trotzdem die Frage für die Theorie: Hat jemand eine Idee wie ich die Datei product.tpl unter „/themes/Frontend/THEMENAME/frontend/checkout/items/“ anpassen könnte?

Wenn ich diese mit folgendem Code verwende, dann verschwindet im Punkt „Warenkorb bearbeiten“ (vom Offcanvas-Warenkorb aus angeklickt) die komplette Bestellmöglichkeit. Es wird nur noch der Artikel angezeigt. Alle Buttons sind weg.

Inhalt der Datei:

{extends file="parent:frontend/checkout/items/product.tpl"}

{block name='frontend_checkout_cart_item_details_inline'}
	{if is_array($basketItem.additional_details.prices) && count($basketItem.additional_details.prices) > 0 && $basketItem.additional_details.prices[0].referenceprice}{assign var="price" value=$basketItem.additional_details.prices[0]}
		{assign var="price" value=$sBasketItem.additional_details.prices[0]}
		<div style="float:left;width:100%">Inhalt: {$sBasketItem.purchaseunit|string_format:"%.2f"} {$sBasketItem.itemUnit} | Grundpreis: {$sBasketItem.additional_details.referenceunit} {$sBasketItem.additional_details.sUnit.unit} = {$sBasketItem.additional_details.referenceprice|currency}*</div>
	{/if}
{/block}

Wie gesagt, kann man darauf verzichten, aber ich würde gerne wissen, was ich hier verändern müsste, damit sich das mit php8 verträgt.

So wird der Original-Block einfach überschrieben.
Ich denke, der soll ja erweitert werden, also fehlt noch der Inhalt vom „original“
Und den bekommt man mit:

{$smarty.block.parent}

Wie oben bei der ajax

Danke @sonic - mit {$smarty.block.parent} und {if is_array… statt {if count… funktioniert die Bestellmöglichkeit ab checkout/cart unter php8 wieder. Leider wird mir aber mit meiner Anpassung der product.tpl kein Grundpreis unter checkout/cart angezeigt.

Ich habe mich daher dazu entschieden, die in die aktuelle Shopware-Version integrierte Lösung zu verwenden, daher nochmal als kurze Beschreibung für alle, welche das o.g. Problem auch haben:

  1. Entfernen der Anpassungen für den Grundpreis aus den Dateien „ajax_cart_item.tpl“ und „product.tpl“ in eurem eigenen Theme.
  2. Grundeinstellungen > Storefront > Bestellabschluss
  3. Wesentliche Merkmale im gesamten Checkout-Prozess anzeigen auf „Ja“
  4. Folgenden Inhalt unter „Template für wesentliche Merkmale einfügen“:
{if $sBasketItem.purchaseunit && $sBasketItem.purchaseunit != 0}
   <span class="price--label label--purchase-unit is--bold is--nowrap">
      Inhalt:
   </span>
   <span class="is--nowrap">
      {$sBasketItem.purchaseunit|floatval} {$sBasketItem.additional_details.sUnit.description}
   </span>
   <span class="is--nowrap">
   ({$sBasketItem.additional_details.referenceprice|currency} * / {$sBasketItem.additional_details.referenceunit} {$sBasketItem.additional_details.sUnit.description})
   </span>
{/if}

Ich habe den Code aus der Shopware-Dokumentation etwas angepasst, damit der Grundpreis immer angezeigt wird - auch wenn Inhalt = Grundeinheit, da ich das schöner finde. Ihr könnt auch den weiter oben genannten Code aus der Shopware-Dokumentation verwenden.