Garantielabel (GARAN) - Support Thread

Hallo zusammen :waving_hand:

Wie angekuendigt kommt hier unser kostenloses Plugin fuer das Garantie-Label fuer Shopware 5:

WICHTIG: Das braucht ihr nur, wenn ihr Artikel verkauft, bei denen der Hersteller eine zusaetzliche Garantie von mehr als 2 Jahren anbietet. Fuer die Gewaehrleistung findet ihr hier das richtige Plugin:

Es ist kompatibel mit Shopware-Versionen ab 5.4.0 und ab PHP 5.6

Bei Fragen, Hinweisen oder Problemen wie immer gerne melden!

Falls ihr Danke sagen moechtet: Wir sammeln gerade fuer einen guten Zweck mit dem Ziel bis zum Jahresende 2k EUR zusammenzubekommen. Ich freue mich ueber jeden und jede, der oder die sich daran beteiligen moechte :smiling_face_with_three_hearts:

Viele liebe Gruesse
Marcus

@dEx @sacrofano @quebag @speth24 Ich verlinke euch hier nur kurz zur Info, weil ihr in dem anderen Thread Interesse an einem Garantie-Plugin bekundet habt :slight_smile:

@quebag
Du meintest, dass du das Label gern auch noch an anderer Stelle haettest


Wo genau braeuchtest du es noch?

Viele liebe Gruesse
Marcus

Hallo Marcus,

erstmal vielen Dank für eure Mühen.

Wir übergeben Artikeldaten aus unserer Warenwirtschaft unterem anderem auch per Sachmerkmale an Shopware.

Sprich in unserem Fall ist die Garantiezeit beim Artikel unter Eigenschaften in Shopware gepflegt.

Habt ihr die Möglichkeit statt einem „Freitextfeld“ das Mapping auch auf ein Feld in den Artikeleigenschaften aufzuschlüsseln ?

Ich habe einen Screenshot beigefügt.

Vielen Dank für deine Rückmeldung.

Hallo Marcus,
bei mir öffnet das Garantielabel nach dem ersten Klick vertikal mittig und ist dann nach unten abgeschnitten. Erst beim zweiten Klick wird das Modalfenster richtig platziert. Das hat wahrscheinlich etwas damit zu tun, dass das SVG noch nicht im Cache des Browsers beim Klick liegt und die Position der Modalbox schon vorher final berechnet wird.
Meine onco-commercial-garan.js Datei sieht jetzt dank KI wie folgt aus:

(function () {
    // Dieser Block injiziert dynamisches CSS. 
    // Er überschreibt die starre Shopware-Berechnung und zwingt den Browser, 
    // das Modal in Echtzeit perfekt mittig zu halten, egal wie groß das SVG wird.
    if (!document.getElementById('onco-modal-css-fix')) {
        var style = document.createElement('style');
        style.id = 'onco-modal-css-fix';
        style.innerHTML = '.onco-commercial-garan--modal { top: 50% !important; left: 50% !important; margin-top: 0 !important; margin-left: 0 !important; transform: translate(-50%, -50%) !important; height: auto !important; }';
        document.head.appendChild(style);
    }

    function findNestedLabel(node) {
        while (node && node !== document) {
            if (node.getAttribute && node.getAttribute('data-onco-commercial-garan') === 'true') {
                return node;
            }
            node = node.parentNode;
        }
        return null;
    }

    function buildModalContent(link) {
        var content = document.createElement('div');
        content.className = 'onco-commercial-garan--modal-content';

        var image = document.createElement('img');
        image.className = 'onco-commercial-garan--label-image';
        image.src = link.getAttribute('data-label-src');
        image.alt = link.getAttribute('data-modal-title') || '';
        content.appendChild(image);

        var paragraph = document.createElement('p');
        paragraph.className = 'onco-commercial-garan--portal-link';
        paragraph.appendChild(
            document.createTextNode((link.getAttribute('data-portal-intro') || '') + ' ')
        );

        var portal = document.createElement('a');
        portal.href = link.href;
        portal.target = '_blank';
        portal.rel = 'noopener';
        portal.appendChild(
            document.createTextNode(link.getAttribute('data-portal-label') || link.href)
        );
        paragraph.appendChild(portal);
        content.appendChild(paragraph);

        return content;
    }

    document.addEventListener('click', function (event) {
        var link = findNestedLabel(event.target);
        if (!link || !link.getAttribute('data-label-src')) {
            return;
        }

        if (!window.jQuery || !window.jQuery.modal) {
            return;
        }

        event.preventDefault();

        window.jQuery.modal.open(window.jQuery(buildModalContent(link)), {
            title: link.getAttribute('data-modal-title') || '',
            sizing: 'content',
            additionalClass: 'onco-commercial-garan--modal'
        });
    });
})();

Hallo Marcus,

beim Einsatz des Plugins in Shopware 5 sind uns zwei Fehler aufgefallen, die unter anderem das „In den Warenkorb“-AJAX-Fenster lahmlegen (Endlosschleife). Wir konnten die Probleme bereits analysieren und beheben. Hier sind die Details für ein künftiges Update:

1. Absturz beim „In den Warenkorb“ (Infinite Spinner / 500er Fehler)

Problem: Beim Klick auf „In den Warenkorb“ dreht sich der Ladekreis endlos. Der Artikel landet zwar im Korb, aber das Cross-Selling-Modalfenster öffnet sich nicht. Ursache: In der OncoCommercialGaran.php wird in der Methode onCheckoutPostDispatch per return vorzeitig abgebrochen, wenn die Action nicht confirm ist. Dadurch wird beim AJAX-Call (ajaxAddArticleCart) der Template-Ordner nicht registriert. Smarty stürzt beim Versuch ab, die nested_label.tpl innerhalb der Cross-Selling-Produktbox (box-basic.tpl) per {include} zu laden. Lösung: Die Template-Registrierung muss in der Funktion ganz nach oben, vor das return:

/** @return void */
    public function onCheckoutPostDispatch(Enlight_Controller_ActionEventArgs $args)
    {
        $controller = $args->getSubject();
        $view = $controller->View();

        // FIX: Wir melden den Template-Ordner IMMER an, egal in welchem Schritt
        // des Checkouts wir uns befinden. Das verhindert den Absturz im AJAX-Fenster.
        $view->addTemplateDir($this->getPath() . '/Resources/views');

        // Danach geht die normale Logik weiter:
        if ($controller->Request()->getActionName() !== 'confirm') {
            return;
        }

        $basket = $view->getAssign('sBasket');
        $items = is_array($basket) && isset($basket['content']) ? $basket['content'] : null;

        $view->assign('oncoCommercialGaran', [
            'map' => $this->buildLabelMap($this->collectOrderNumbers($items)),
            'portalUrl' => self::PORTAL_URL,
        ]);
    } 

2. Smarty Security Error im Listing (box-basic.tpl)

Problem: Der Shop wirft einen 503-Fehler oder eine „directory not allowed by security setting“-Meldung im Listing.

directory /custom/plugins/OncoCommercialGaran/Resources/views/frontend/listing/product-box/box-basic.tpl' not allowed by security setting

Ursache: In der box-basic.tpl wird eine illegale Smarty-Verschachtelung verwendet ({if {config name="displayListingBuyButton"} ...}). Der Compiler stürzt hier ab. Zudem fehlten isset()-Prüfungen, falls die Variable im Cross-Selling nicht übergeben wird. Lösung: Die native Shopware-Variable $theme nutzen und Variablen vorab prüfen:

{block name="onco_commercial_garan_listing_label"}
    {if $theme.displayListingBuyButton && isset($oncoCommercialGaran) && isset($oncoCommercialGaran.map[$sArticle.ordernumber])}
        {* ... *}
    {/if}
{/block}

Danke fuer dein Feedback, @sacrofano!
Das waren sehr wertvolle Infos :+1:

Ich habe das in Version 1.0.2 geaendert. Die Loesung sah dann bei mir etwas anders aus als bei dir, damit es universeller ueber Themes, Drittanbieter-Plugins und Shopware-Versionen funktioniert, aber ich denke, dass die Probleme damit behoben sein sollten.

Falls es dich interessiert, sind das hier die Aenderungen:

Magst du mal schauen, ob das bei dir klappt?

Viele liebe Gruesse
Marcus

Hi Marcus,
vielen Dank für das Update. Die Probleme mit der Darstellung beim ersten Klick und das endlose Laden des Warenkorbs sind behoben. Top! :slightly_smiling_face:

Danke fuer dein Feedback, @sacrofano!
Ich freue mich, dass das geklappt hat :+1:

Einfach mal DANKE DANKE DANKE :+1:
Das nenne ich mal User helfen Usern. Wir sind ja in aller Regel Shopbetreiber / Händler … keine Coder.

Respekt an alle, die sich mit Hinweisen, Kritiken und Lösungsvorschlägen beteiligen.

Fazit: Der 5er ist nicht tot zu kriegen :wink: und das kostenlose :clap: Plugin hat uns viel Zeit und Manpower erspart.

Guten Morgen, bei unser werden leider nicht alles Labels angezeigt - im Listing der Kategorieübersicht und ich habe keine Erklärung dafür. Die Daten sind hinterlegt.

Fehlende Anzeige in der Kategorie

Das haette ich nicht besser sagen koennen, @spuelemax!
Ich finde es auch immer wieder grossartig zu sehen, wie viel Know How sich hier versammelt :star_struck:
So etwas sollten wir viel oefter machen.

Hast du da mal kurz ein Beispiel? Und haengt es vielleicht mit den Varianten zusammen?

Hallo zusammen :waving_hand:

ein kurzes Update: Ich habe gerade mit dem Hinweis von @quebag und dem Feedback eines anderen Haendlers eine neue Version 1.1.0 veroeffentlicht, die zwei Dinge verbessert:

  • Bisher wurden die Labels im Listing (falls Warenkorb-Buttons vorhanden sind) nicht angezeigt, sobald die Artikel beim Infinite Scrolling nachgeladen werden mussten - es kann gut sein, dass auch andere Funktionen wie der Filter davon betroffen waren
  • Man kann jetzt in einer Plugin-Einstellung angeben, dass bei Varianten-Artikeln die Angabe in der Hauptvariante auf alle Varianten vererbt werden soll

Viele liebe Gruesse
Marcus