Magento 2: Konfigurierbares Produkt

Erstellt man in Magento 2 ein konfigurier bares Produkt und weist diesem über ein ausgewähltes Attribut Einfache Produkte zu, so kann man eben diese Einfachen Produkte über ein Dropdown auf der Produktdetailseite auswählen. Es ändern sich Bilder und Preis, jedoch nicht die SKU, auch werden im Dropdown nur die Bezeichnungen des zugrunde liegenden Attributes angezeigt und nicht der Name des verknüpften Einfachen Produkts. Stattdessen wir die Differenz zum Preis des aktuell gewählten Einfachen Produkts angezeigt. Wir möchten nun erreichen, dass die Preisdifferenz nicht angezeigt und als Ersatz neben dem Attribut-Label der Name das jeweils verknüpften Einfache Produkts angezeigt wird: zuerst erstellen wir ein kleines Plugin und tragen hierbei in die Datei

 

 \app\code\Vendorname\Modulename\etc\di.xml

 

die folgenden Zeilen an, um das Plugin zu aktivieren:

 

<type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">

 

        <plugin disabled="false" name="Vendorname_Modulename_Plugin_Magento_ConfigurableProduct_Block_Product_View_Type_Configurable" sortOrder="10" type="Vendorname\Modulename\Plugin\Magento\ConfigurableProduct\Block\Product\View\Type\Configurable"/>

</type>

 

Die gewünschte Pluginklasse in der Datei

 

\app\code\Vendorname\Modulename\Plugin\Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.php

 

sieht dann so aus:

 

<?php

namespace Vendorname\Modulename\Plugin\Magento\ConfigurableProduct\Block\Product\View\Type;

class Configurable

{

    public function afterGetJsonConfig(

        \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable $subject,

        $result

    ) {

        $jsonResult = json_decode($result, true);

        $jsonResult['skus'] = [];

                               $jsonResult['simple_product_names'] = [];

        foreach ($subject->getAllowProducts() as $simpleProduct) {

            $jsonResult['skus'][$simpleProduct->getId()] = $simpleProduct->getSku();

                                               $jsonResult['simple_product_names'][$simpleProduct->getId()] = $simpleProduct->getName();

        }

        $result = json_encode($jsonResult);

        return $result;

    }

}

 

Heißt also, wir holen uns hier die Skus und die Namen der zugrundeliegenden Einfachen Produkte. Diese müssen wir nun einerseits in der Select-Box bereitstellen (die Namen), und tun dies in der Datei

 

\app\design\frontend\Packagename\Templatename\Magento_ConfigurableProduct\web\js\configurable.js

 

Hier fügen wir nach den Zeilen

 

if (typeof allowedProducts[0] !== 'undefined' &&

                typeof optionPrices[allowedProducts[0]] !== 'undefined') {

                allowedProductMinPrice = this._getAllowedProductWithMinPrice(allowedProducts);

                optionFinalPrice = parseFloat(optionPrices[allowedProductMinPrice].finalPrice.amount);

                optionPriceDiff = optionFinalPrice - basePrice;

 

die folgenden ein, um die Differenzpreise nicht auszugeben und diese durch die Produktnamen zu ersetzen:

 

options[i].label = options[i].label + ': ' + this.options.spConfig.simple_product_names[options[i].products[0]];options[i].label = options[i].label + ': ' + this.options.spConfig.simple_product_names[options[i].products[0]];

if (optionPriceDiff !== 0 && 1==2) {

 

Hier immer darauf achten, dass nach Änderung der Assets neu deployed werden muss, also hier die Datei 

 

\pub\static\frontend\Packagename\Templatename\de_DE\Magento_ConfigurableProduct\js\configurable.js

 

gelöscht werden muss (de_DE natürlich anpassen, falls nötig bzw. andere Sprache im Storeview). Die configurable.js vor Erweiterung aus Core komplett übernehmen / kopieren.

 

Jetzt fehlt noch die SKU-Änderung:

 

Hierzu die Datei

 

\app\code\Vendorname\Modulename\view\frontend\requirejs-config.js

 

erstellen mit folgendem Inhalt:

 

var config = {

    config: {

        mixins: {

            'Magento_ConfigurableProduct/js/configurable': {

                'Vendorname_Modulename/js/model/skuswitch': true

            }

        }

    }

};

 

und danach die bekannt gemachte Datei

 

\app\code\Vendorname\Modulename\view\frontend\web\js\model\skuswitch.js

 

erstellen mit dem Inhalt

 

/*jshint browser:true jquery:true*/

/*global alert*/

define([

    'jquery',

    'mage/utils/wrapper'

], function ($, wrapper) {

    'use strict';

    return function(targetModule){

        var reloadPrice = targetModule.prototype._reloadPrice;

        var reloadPriceWrapper = wrapper.wrap(reloadPrice, function(original){

            //do extra stuff

            //call original method

            var result = original();

            //do extra stuff

            var simpleSku = this.options.spConfig.skus[this.simpleProduct];

            if(simpleSku != '') {

                $('div.product-info-main .sku .value').html(simpleSku);

            }

            //return original value

            return result;

        });

        targetModule.prototype._reloadPrice = reloadPriceWrapper;

        return targetModule;

    };

});

 

Damit sind wir fertig. Getestet in unserer Internetagentur in einem Magento 2 Onlineshop CE 2.3.1..