Preise brutto & nett anzeigen, Änderungen in .twig werden nicht angewendet

Ich versuche seit Tagen zu erreichen dass auf der Artikelseite die brutto- und netto-Preise gleichzeitig angezeigt werden. Hier im Forum findet man diese Frage ja öfter und ich habe wirklich alle Lösungsansätze probiert. Da der Shop ein individuell angefertigtes Theme hat, dachte ich vielleicht es läge daran und habe zum Test eine komplett neue, leere Shopware-Instanz aufgesetzt. Aber auch da zeigen die Änderungen die ich versuche, keinerlei Auswirkung auf die Darstellung der Artikelseite.

Was ich versuche:

In /src/Resources/views/storefront/page/product-detail/buy-widget.html.twig
diesen Code:

{% block page_product_detail_buy %}
    <div class="product-detail-buy">
        {# Brutto-Preis #}
        <div>
            Brutto: {{ product.calculatedPrice.unitPrice|currency }}
        </div>
        
        {# Netto-Preis #}
        <div>
            Netto: {{ product.calculatedPrice.netPrice|currency }}
        </div>
        
        {# Kauf-Button #}
        <div>
            <button type="button" class="btn btn-primary">
                Kaufen
            </button>
        </div>
    </div>
{% endblock %}

Oder in /src/Resources/views/storefront/page/product-detail/index.html.twig
diesen Code:

{% block page_product_detail %}
    {# Brutto-Preis #}
    <div>
        Brutto: {{ product.calculatedPrice.unitPrice|currency }}
    </div>
    
    {# Netto-Preis #}
    <div>
        Netto: {{ product.calculatedPrice.netPrice|currency }}
    </div>
{% endblock %}

Danach jedes Mal

bin/console theme:compile
bin/console cache:clear

Und im Browser neu geladen.

Damit es diese Pfade überhaupt gibt, habe ich mir aus dem Shopware-Store das erst Beste Theme in die Testinstanz installiert.

Irgendwas mache ich also offensichtlich grundsätzlich falsch. Kann mir da vielleicht jemand den richtigen Hinweis geben?

Die Frage wäre erstmal: ist es in den Shopware eigenen Themes möglich und umgesetzt? Wenn nein: Vorschlag auf https://feedback.shopware.com/forums/942607-shopware-6-product-feedback-ideas aufmachen.

Welche Shopware Version setzt du denn ein?


So sieht das ganze bei einem Dump aus - du kannst also natürlich nichts erhalten.

Hier mal die Ansicht in Sw 6.6.9.0


Eventuell muss man aber die Daten anreichern, gerade wenn es dann um Varianten und Staffeln gehen würde. Prinzipiell ist es aber in jedem Theme möglich.

Grüße

Version ist auch 6.6.9.0

Deinen Code hab ich auch ausprobiert, interessiert ihn auch nicht

Moin @viktorseitz,

hast du auch den Dateipfad kontrolliert? Wie @MrAle im Screenshot zeigt überschreibt er eine component file.
Das ist in beiden Screenshots von dir nicht ersichtlich. Deine beiden überschriebenen Dateien werden vermutlich einfach nur verwendet und du bist in der falschen.

Grüße
Matthias

Das ist ein guter Punkt, die Verzeichnisstruktur erschließt sich mir tatsächlich nicht so richtig. Also ich deute es so, dass in den Verzeichnissen des Themes Dateien liegen, die den Inhalt der Originaldateien von Shopware ergänzen. Dann würde ich es jetzt so interpretieren, dass in der von mir angepassten .twig-Datei der Verweis auf die entsprechende Originaldatei stehen muss, die um meinen Inhalt ergänzt werden soll. Richtig soweit?

Ich fang nochmal frisch von vorne an, hier mit dem Beispiel von MrAle:

{% sw_extends '@Storefront/storefront/page/product-detail/buy-widget.html.twig' %}

{% block page_product_detail_wishlist %}{% endblock %}

{% block buy_widget_price_content %}
	{{parent()}}
	Netto: {{page.product.price.elements|first.net|currency}}<br>
	Brutto: {{page.product.price.elements|first.gross|currency}}
{% endblock %}

Das root-Verzeichnis des Test-Webservers ist „testshopware“:

Wie muss dann der Pfad in der .twig Datei lauten?

Moin,

ich denke du bist in zwei Punkten an der Stelle falsch.

  1. um die Dateien zu überschreiben musst du ein eigenes Plugin schreiben welches in dem Verzeichnis root/custom/plugins|static-plugins/DEINPLUGIN liegt
  2. Nutzt du in deinem Beispiel wahrscheinlich wieder die falsche Datei zum erweiterten

Grüße
Matthias

Ich will ja ein bestehendes custom-Theme anpassen. Insofern nutze ich dessen Verzeichnis um meine Datei mit den Änderungen zu platzieren:

Dieses Theme ist auch aktuell aktiviert.

Wenn du Blöcke erweiterst, dann solltest du dir auch ansehen, was du erweiterst:

{# @deprecated tag:v6.7.0 - File will be removed as it is no longer loaded by default. #}

{# Extend `src/Storefront/Resources/views/storefront/component/buy-widget/buy-widget.html.twig` instead #}

Falls die gewünschte Variable nicht zur Verfügung stehen sollte (habe mir die Daten nicht angesehen), dann kannst/musst du diese per Subscriber der Storefront zur Verfügung stellen.

1 „Gefällt mir“

Danke für deine Antwort. Ich habe versucht mich durch zu googeln um das zu verstehen. Aber statt einer Lösung näher zu kommen wird es immer noch komplizierter und unverständlicher.

Ist das wirklich so ein riesen Hexenwerk bei Artikeln brutto- und netto-Preise gleichzeitig anzuzeigen? Das ist doch im DACH-Raum gar nicht so unüblich.

Ich habe mich mit dem Thema noch nie beschäftigt, daher kann ich keine Aussage dazu treffen.

Generell gibt es aber auch die einfache Möglichkeit, dass du den Brutto-Wert nimmst, den Steuersatz oder Wert und dann den Wert im Frontend ausrechnen lässt. Dann benötigst du keine weiteren Daten.

In der Darstellung selbst zu rechnen ist keine gute Idee. Beim ersten Artikel mit reduziertem MwSt.-Satz fliegt einem das um die Ohren.

Was ich nicht ganz verstehe ist dass beide Preise in den Artikelstammdaten vorhanden sind. Da sollte es doch keine zusätzlichen Daten brauchen, die es nicht schon gibt?

Wieso? Ich habe nicht gesagt, dass du statisch 0,19 nutzen sollst.

In der Variable calculatedTaxes bzw. taxRules sind die Werte, spezifisch zum Produkt. Wenn dies einen reduzierten Steuersatz hat, ist der auch in diesen Variablen so vermerkt.

ja stimmt, das wäre ein gangbarer Weg. Hat in einem anderen Thema hier schon jemand so gelöst: Brutto / Netto Preise gleichzeitig anzeigen lassen ? Plugin? - #7 von TomT Womit ich aber wieder beim Ursprungsproblem wäre, dass egal was ich mache keine Auswirkung hat

Dann überschreibst du entweder eine Datei, die nicht mehr genutzt wird – siehe mein Deprecated Hinweis – oder du überschreibst ein Block, der durch einen anderen Block ebenfalls überschrieben wird.

Plugins/Themes so weit deaktivieren wie möglich und dann schauen, ab wann es nicht mehr funktioniert. Alternativ kannst du von Frosh das Development Helper Plugin herunterladen. Dort wird dir angezeigt, welche Template-Dateien in welcher Reihenfolge einbezogen werden.

Ich habe ja meine Testumgebung die ich auch nochmal komplett platt machen kann um mit einem Shopware ohne jegliche Plugins zu testen. Auch da ist mir nicht klar wo ich das hin packen soll.

Moin @viktorseitz,

als erstes wäre dann mein Blick einmal in das entsprechende Produkt bei dem du die Ausgabe anpassen willst. Schau mal bei Layout, ob dort etwas hinterlegt ist wie eine Erlebniswelt. Das gibt dann den Hinweis, um welche Twig Dateien es sich überhaupt im Hintergrund handelt.

Weiterhin kann ich dir auch dieses Plugin empfehlen, welches die konkreten Blöcke ausgibt was die Suche nach diesen vereinfacht:

Grüße
Matthias

Beim Artikel ist nichts aktiviert. Es ist eine frische Shopware-Instanz ohne jegliche Zusatz-Plugins.

Ich habe die Artikelseite mit dem Tool angeschaut, da werden 4 .twig-Dateien genannt (2 davon hier am Screenshot zu sehen) genannt, alle habe ich durchsucht, nirgends wird da drin irgendwo der Preis genannt (die originale Preisanzeige muss ja auch irgendwo herkommen)

Moin @viktorseitz ,

auch in einer Installation ohne Plugins gibt es die Möglichkeit Artikel mit Erlebniswelt oder ohne darzustellen. Entsprechend was davon genutzt wird kommen auch unterschiedliche Twig Dateien zum Einsatz.

Aus dem Screenshot den du dort gezeigt hast kann man entnehmen, dass du dir dort auch das falsche Element anschaust. Du musst dir dort auch genau das Element anschauen, bei dem der Preis auch ausgegeben wird.

Grüße
Matthias

Mein Fehler, hier die richtige Stelle:

Deren Inhalt macht jetzt auch schon mehr Sinn:

{% block buy_widget_price_inner %}
    {% if product.calculatedPrices|length > 1 %}
        {% block buy_widget_price_block %}
            <div class="product-block-prices">
                {% block buy_widget_price_block_table %}
                    <table class="table product-block-prices-grid">
                        {% block buy_widget_price_block_table_head %}
                            <thead class="product-block-prices-head">
                            {% block buy_widget_price_block_table_head_inner %}
                                <tr class="product-block-prices-row">
                                    <th scope="col" class="product-block-prices-cell">
                                        {{ 'detail.dataColumnQuantity'|trans|sw_sanitize }}
                                    </th>
                                    <th scope="col" class="product-block-prices-cell">
                                        {{ 'detail.dataColumnPrice'|trans|sw_sanitize }}
                                    </th>
                                    {% if product.calculatedPrice.referencePrice %}
                                        <th scope="col" class="product-block-prices-cell">
                                            {{ 'detail.dataColumnReferencePrice'|trans|sw_sanitize }}
                                        </th>
                                    {% endif %}
                                </tr>
                            {% endblock %}
                            </thead>
                        {% endblock %}

                        {% block buy_widget_price_block_table_body %}
                            <tbody class="product-block-prices-body">
                            {% block buy_widget_price_block_table_body_inner %}
                                {% for price in product.calculatedPrices %}
                                    {% block buy_widget_price_block_table_body_row %}
                                        <tr class="product-block-prices-row"
                                            itemprop="offers" itemscope
                                            itemtype="https://schema.org/Offer">
                                            {% block buy_widget_price_block_table_body_cell_quantity %}
                                                <th scope="row" class="product-block-prices-cell product-block-prices-cell-thin">
                                                    <meta itemprop="priceCurrency" content="{{ page.header.activeCurrency.translated.shortName }}">
                                                    <meta itemprop="price" content="{{ price.unitPrice }}">

                                                    {% if loop.last %}
                                                        {{ 'detail.priceDataInfoFrom'|trans|sw_sanitize }}
                                                        <span class="product-block-prices-quantity">{{ price.quantity }}</span>

                                                    {% else %}
                                                        {{ 'detail.priceDataInfoUntil'|trans|sw_sanitize }}
                                                        <span class="product-block-prices-quantity">{{ price.quantity }}</span>
                                                    {% endif %}
                                                </th>
                                            {% endblock %}

                                            {% block buy_widget_price_block_table_body_cell_price %}
                                                <td class="product-block-prices-cell">
                                                    {% sw_include '@Storefront/storefront/component/product/block-price.html.twig' with {
                                                        price: price
                                                    } only %}
                                                </td>
                                            {% endblock %}

                                            {% block buy_widget_price_block_table_body_cell_reference_price %}
                                                {% if price.referencePrice is not null %}
                                                    <td class="product-block-prices-cell product-block-prices-cell-thin">
                                                        {{ price.referencePrice.price|currency }}{{ 'general.star'|trans|sw_sanitize }} / {{ price.referencePrice.referenceUnit }} {{ price.referencePrice.unitName }}
                                                    </td>
                                                {% endif %}
                                            {% endblock %}
                                        </tr>
                                    {% endblock %}
                                {% endfor %}
                            {% endblock %}
                            </tbody>
                        {% endblock %}
                    </table>
                {% endblock %}
            </div>
        {% endblock %}
    {% else %}
        {% set price = product.calculatedPrice %}

        {% if product.calculatedPrices|length == 1 %}
            {% set price = product.calculatedPrices.first %}
        {% endif %}

        <meta itemprop="price"
              content="{{ price.unitPrice }}">

        {% block buy_widget_price_content %}
            {% set listPrice = price.listPrice %}
            {% set isListPrice = price.listPrice.percentage > 0 %}
            {% set isRegulationPrice = price.regulationPrice != null %}

            <p class="product-detail-price{% if isListPrice %} with-list-price{% endif %}{% if isRegulationPrice %} with-regulation-price{% endif %}">
                {{ price.unitPrice|currency }}{{ 'general.star'|trans|sw_sanitize }}
            </p>

            {% if isListPrice %}
                {% block buy_widget_was_price %}
                    {% block buy_widget_was_price_badge %}
                        <span class="list-price-badge">&#37;</span>
                    {% endblock %}

                    {% set afterListPriceSnippetExists = 'listing.afterListPrice'|trans|length > 0 %}
                    {% set beforeListPriceSnippetExists = 'listing.beforeListPrice'|trans|length > 0 %}

                    {% block buy_widget_was_price_wrapper %}
                        <span class="product-detail-list-price-wrapper">
                            {% if beforeListPriceSnippetExists %}{{'listing.beforeListPrice'|trans|trim}}{% endif %}

                            <span{% if not (afterListPriceSnippetExists or beforeListPriceSnippetExists) %} class="list-price-price"{% endif %}>{{ listPrice.price|currency }}{{ 'general.star'|trans|sw_sanitize }}</span>

                            {% if afterListPriceSnippetExists %}
                                {{'listing.afterListPrice'|trans|trim}}
                            {% endif %}

                            <span class="list-price-percentage">{{ 'detail.listPricePercentage'|trans({'%price%': listPrice.percentage })|sw_sanitize }}</span>
                        </span>
                    {% endblock %}
                {% endblock %}
            {% endif %}
            {% if isRegulationPrice %}
                <span class="product-detail-list-price-wrapper">
                    <span class="regulation-price">{{ 'general.listPricePreviously'|trans({'%price%': price.regulationPrice.price|currency }) }}{{ 'general.star'|trans|sw_sanitize }}</span>
                </span>
            {% endif %}
        {% endblock %}

        {% if product.purchaseUnit %}
            {% block buy_widget_price_unit %}
                <div class="product-detail-price-unit">
                    {% block buy_widget_price_unit_label %}
                        <span class="price-unit-label">
                            {{ 'detail.priceUnitName'|trans|sw_sanitize }}
                        </span>
                    {% endblock %}

                    {% block buy_widget_price_unit_content %}
                        <span class="price-unit-content">
                            {{ product.purchaseUnit }} {{ product.unit.translated.name }}
                        </span>
                    {% endblock %}

                    {% if price.referencePrice is not null %}
                        {% block buy_widget_price_unit_reference_content %}
                            <span class="price-unit-reference-content">
                                ({{ price.referencePrice.price|currency }}{{ 'general.star'|trans|sw_sanitize }} / {{ price.referencePrice.referenceUnit }} {{ price.referencePrice.unitName }})
                            </span>
                        {% endblock %}
                    {% endif %}
                </div>
            {% endblock %}
        {% endif %}
    {% endif %}
{% endblock %}

Aber wie passt jetzt da mein Änderungswunsch rein? kann ich die komplette Datei in mein eigenes Plugin kopieren und dort anpassen?