Magento 2 - Почему артикул не изменяется динамически на странице настраиваемого просмотра продукта


При изменении атрибута в настраиваемом продукте изображение продукта динамически меняется, но артикул не меняется.

Кроме того, если вы добавляете настроенный продукт в свою корзину, это дает вам изображение настраиваемого продукта (а не простого продукта), что может привести к большой путанице для клиентов.

Есть ли какое-либо решение этой проблемы(проблем)?

Author: QuestionsQuestions, 2016-08-05

7 answers

Я сделал это однажды для Magento 2.0, у меня нет доступного кода, но я могу показать вам, где вам нужно внести изменения:

  • Напишите плагин для Magento\ConfigurableProduct\Block\Product\View\Type\Configurable::getJsonConfig() и добавьте артикулы в результат:

    $config['skus'] = [];
    foreach ($subject->getAllowProducts() as $simpleProduct) {
        $config['skus'][$simpleProduct->getId()] = $simpleProduct->getSku();
    }
    
  • Расширить Product.Config из app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/configurable.js с помощью RequireJS. Хорошим местом для добавления кода для изменения отображаемого артикула является reloadPrice(). У вас будет доступ к артикулам через this.config.skus
 15
Author: Fabian Schmengler, 2016-08-05 11:45:21

Я написал модуль, основанный на решении Фабиана Шменглера. Это работает для меня на Magento 2.1.3.

/app/code/YourVendor/YourModule/view/frontend/requirejs-config.js

var config = {
    config: {
        mixins: {
            'Magento_ConfigurableProduct/js/configurable': {
                'YourVendor_YourModule/js/model/skuswitch': true
            }
        }
    }
};

/app/code/YourVendor/YourModule/view/frontend/web/js/model/skuswitch.js

/*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;
    };
});

/app/code/YourVendor/YourModule/Plugin/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php

namespace YourVendor\YourModule\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'] = [];
        foreach ($subject->getAllowProducts() as $simpleProduct) {
            $jsonResult['skus'][$simpleProduct->getId()] = $simpleProduct->getSku();
        }


        $result = json_encode($jsonResult);

        return $result;
    }
}

/app/code/YourVendor/YourModule/etc/di.xml

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">
        <plugin disabled="false" name="YourVendor_YourModule_Plugin_Magento_ConfigurableProduct_Block_Product_View_Type_Configurable" sortOrder="10" type="YourVendor\YourModule\Plugin\Magento\ConfigurableProduct\Block\Product\View\Type\Configurable"/>
    </type>
</config>

Обратная связь приветствуется! Я получил это методом проб и ошибок на основе http://alanstorm.com/the-curious-case-of-magento-2-mixins/

 32
Author: nbjohan, 2018-12-20 05:29:36

Отлично работает на Magento 2.2.1. Для тех, кто новичок в разработке модулей Magento, вам нужно создать еще несколько файлов, прежде чем следовать руководству @nbjohan.

Создать приложение/код/[имя поставщика]/[имя модуля]/etc/module.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="[Vendor]_[Module]" setup_version="1.0.0">
</module>

Приложение/код/[название поставщика]/[название модуля]/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'[Vendor]_[Module]',
__DIR__
);

Обновление на сервере с помощью: настройка php bin/magento: обновление

 1
Author: Long Le, 2017-11-28 00:12:58

Это работает для меня в Magento 2.2.2 с несколькими изменениями,

Https://github.com/andreecz/magento2-configurable-dynamic

Я работаю над этим плагином в течение нескольких часов, если использовать оригинальный, magento 2.2.2, похоже, не работает с ним нормально. Затем я нашел несколько интересных пунктов ниже.

  1. при нажатии кнопки переключения модуль RequireJS не реализовал метод _UpdatePrice. Я использую консоль.войдите в систему с помощью какого-нибудь простого сигнала, чтобы проверить эту реализацию, это ничего не меняет.

Затем я нашел другой крючок: _OnClick;

  1. Структура JsonConf может отличаться в зависимости от предоставленного исходного модуля. Вы также можете использовать консоль.войдите в систему для проверки.

  2. Вышеизложенное отлично работает только с 1 опцией переключения (например, размер). Если параметры вашего настраиваемого продукта превышают 1, может быть какая-то дополнительная логика, чтобы сделать его хорошим. Вам также может потребоваться выбрать другой активный крючок.

Я новичок Продавец Magento, а не профессиональный программист, и я очень стесняюсь загружать свой код здесь, что крайне некрасиво.

Наконец, спасибо @nbjohan, это действительно очень помогает мне и экономит мое время.

 1
Author: Hdong, 2018-08-09 19:15:35

Похоже, это не работает для меня в версии 2.2.2. Кто-нибудь может мне помочь? Пытался для дни.

App/code/D4tools/AttributeSkuChanger/etc/di.xml

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">
        <plugin disabled="false" name="D4tools_AttributeSkuChanger_Plugin_Magento_ConfigurableProduct_Block_Product_View_Type_Configurable" sortOrder="10" type="D4tools\AttributeSkuChanger\Plugin\Magento\ConfigurableProduct\Block\Product\View\Type\Configurable"/>
    </type>
</config>

App/code/D4tools/AttributeSkuChanger/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="D4tools_AttributeSkuChanger" setup_version="1.0.0"></module>.
</config>

App/code/D4tools/AttributeSkuChanger/Plugin/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php

<?php
namespace D4tools\AttributeSkuChanger\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'] = [];
        foreach ($subject->getAllowProducts() as $simpleProduct) {
            $jsonResult['skus'][$simpleProduct->getId()] = $simpleProduct->getSku();
        }


        $result = json_encode($jsonResult);

        return $result;
    }
}

App/code/D4tools/AttributeSkuChanger/view/frontend/web/js/model/skuswitch.js

/*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;
    };
});

App/code/D4tools/AttributeSkuChanger/view/frontend/requirejs-config.js

    var config = {
    config: {
        mixins: {
            'Magento_ConfigurableProduct/js/configurable': {
                'D4tools_AttributeSkuChanger/js/model/skuswitch': true
            }
        }
    }
};
 0
Author: Jerrod, 2018-07-20 05:46:12

Это работает для меня на Magento 2.2.5,

Https://github.com/andreecz/magento2-configurable-dynamic

В приведенном выше репо есть несколько ошибок,

  1. В swatch-skuswitch.js вам нужно указать jsonConfig, а не spconfig.
  2. В require-config.js название - swatch-визуализатор, так что исправьте это.
  3. Не забудьте создать layout/catalog_product_view.xml
 0
Author: archana bahadur, 2018-07-31 07:02:44

Как заставить это работать в Magento 2.2.6 имена папок и размещение.

Я скачал этот: Это работает для меня на Magento 2.2.5, https://github.com/andreecz/magento2-configurable-dynamic

И разместил его так, как это приложение/код/И/Конфигурируемая динамика

И добавил

    <referenceBlock name="product.info.sku">
        <arguments>
            <argument name="add_attribute" xsi:type="string">itemprop="sku" data-dynamic="sku"</argument>
        </arguments>
    </referenceBlock>

К моей теме в catalog_product_view.phtml

 -2
Author: Henrik Schytte, 2018-11-02 04:21:53