Magento 2 - Почему артикул не изменяется динамически на странице настраиваемого просмотра продукта
При изменении атрибута в настраиваемом продукте изображение продукта динамически меняется, но артикул не меняется.
Кроме того, если вы добавляете настроенный продукт в свою корзину, это дает вам изображение настраиваемого продукта (а не простого продукта), что может привести к большой путанице для клиентов.
Есть ли какое-либо решение этой проблемы(проблем)?
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
Я написал модуль, основанный на решении Фабиана Шменглера. Это работает для меня на 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/
Отлично работает на 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: обновление
Это работает для меня в Magento 2.2.2 с несколькими изменениями,
Https://github.com/andreecz/magento2-configurable-dynamic
Я работаю над этим плагином в течение нескольких часов, если использовать оригинальный, magento 2.2.2, похоже, не работает с ним нормально. Затем я нашел несколько интересных пунктов ниже.
- при нажатии кнопки переключения модуль RequireJS не реализовал метод _UpdatePrice. Я использую консоль.войдите в систему с помощью какого-нибудь простого сигнала, чтобы проверить эту реализацию, это ничего не меняет.
Затем я нашел другой крючок: _OnClick;
Структура JsonConf может отличаться в зависимости от предоставленного исходного модуля. Вы также можете использовать консоль.войдите в систему для проверки.
Вышеизложенное отлично работает только с 1 опцией переключения (например, размер). Если параметры вашего настраиваемого продукта превышают 1, может быть какая-то дополнительная логика, чтобы сделать его хорошим. Вам также может потребоваться выбрать другой активный крючок.
Я новичок Продавец Magento, а не профессиональный программист, и я очень стесняюсь загружать свой код здесь, что крайне некрасиво.
Наконец, спасибо @nbjohan, это действительно очень помогает мне и экономит мое время.
Похоже, это не работает для меня в версии 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
}
}
}
};
Это работает для меня на Magento 2.2.5,
Https://github.com/andreecz/magento2-configurable-dynamic
В приведенном выше репо есть несколько ошибок,
- В swatch-skuswitch.js вам нужно указать jsonConfig, а не spconfig.
- В require-config.js название - swatch-визуализатор, так что исправьте это.
- Не забудьте создать layout/catalog_product_view.xml
Как заставить это работать в 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