Hi.everyone!
I think that this kind of issue had been already opened but I can't find the exact answer.
I've made a configurable product and several simple products combined with that configurable product. In magento, regarding the configurable product, when I change the size and color or etc in product detail page, I can see the changes of only product name and price. It's magento's default function, I think.
But I'd like to change every attribute including SKU, product detail tab, more information tab even the page url(Now there is only 1 url about several products). According to the selection of child products, I should change these all attributes and url, because they are completely different product for me, although I made it with configurable product.
So far, I've searched and searched every place and I found only the method to change the SKU and I've implemented it.
I followed this one (https://magecomp.com/blog/switch-product-sku-according-selection-child-products-magento-2/) and succeed. In order to implement the rest of them which I mentioned above, what should I do? Many developers recommended to use Magento Extension for it.
Is there any methods to do it without using the Extension?
I am looking forward to your reply.
Regards.
Hi, have you found a solution? I have the same problem,
Thanks,
Chris.
Hi, Chris. Yes. I have solved it by creating one module and customizing Magento_Swatches.
Just create a simple module having only this block.
<?php namespace Magetique\ProductDesc\Block\ConfigurableProduct\Product\View\Type; use Magento\Framework\Json\EncoderInterface; use Magento\Framework\Json\DecoderInterface; use Magento\CatalogInventory\Api\StockRegistryInterface; class Configurable { protected $jsonEncoder; protected $jsonDecoder; protected $stockRegistry; protected $productloader; protected $_reviewCollection; protected $appEmulation; protected $imageHelperFactory; protected $productRepositoryFactory; public function __construct( EncoderInterface $jsonEncoder, DecoderInterface $jsonDecoder, \Magento\Catalog\Model\ProductFactory $_productloader, StockRegistryInterface $stockRegistry, \Magento\Review\Model\ResourceModel\Review\CollectionFactory $reviewCollection, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Catalog\Api\ProductRepositoryInterfaceFactory $productRepositoryFactory, \Magento\Catalog\Helper\Image $imageHelperFactory ) { $this->jsonDecoder = $jsonDecoder; $this->jsonEncoder = $jsonEncoder; $this->stockRegistry = $stockRegistry; $this->productloader = $_productloader; $this->_reviewCollection = $reviewCollection; $this->appEmulation = $appEmulation; $this->productRepositoryFactory = $productRepositoryFactory; $this->imageHelperFactory = $imageHelperFactory; } // Adding Quantitites (product=>qty) public function aroundGetJsonConfig( \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable $subject, \Closure $proceed ) { $descriptions = []; $shortdescriptions = []; $barcodes = []; $designers = []; $p_colors = []; $materials = []; $washing_instructions = []; $washing_tips = []; $p_reviews = []; $product_storys = []; $environment_licences = []; $config = $proceed(); $config = $this->jsonDecoder->decode($config); foreach ($subject->getAllowProducts() as $product) { $stockitem = $this->stockRegistry->getStockItem( $product->getId(), $product->getStore()->getWebsiteId() ); $products = $this->productloader->create()->load($product->getId()); $collection = $this->_reviewCollection->create() ->addStatusFilter( \Magento\Review\Model\Review::STATUS_APPROVED )->addEntityFilter( 'product', $product->getId() )->setDateOrder(); $barcodes[$product->getId()] = $products->getBarcode(); $designers[$product->getId()] = $products->getAttributeText('designer'); $materials[$product->getId()] = $products->getAttributeText('material'); $p_colors[$product->getId()] = $products->getAttributeText('color_ek'); $washing_instructions[$product->getId()] = $products->getWashing_instruction_ek(); $washing_tips[$product->getId()] = $products->getWashing_tip_ek(); $environment_licences[$product->getId()] = $products->getEnvironmental_licenced(); $productImageAttr = null; $productImage = null; if($products->hasData('product_story_ek')) { $productImageAttr = $products->getCustomAttribute( 'product_story_ek' ); $productImage = $this->imageHelperFactory->init($products, 'product_story_ek') ->setImageFile($productImageAttr->getValue()); $product_storys[$product->getId()] = $productImage->getUrl(); }else { $product_storys[$product->getId()] = null; } $shortdescriptions[$product->getId()] = $products->getShortDescription(); $descriptions[$product->getId()] = $products->getDescription(); } $config['barcodes'] = $barcodes; $config['designers'] = $designers; $config['materials'] = $materials; $config['p_colors'] = $p_colors; $config['washing_instructions'] = $washing_instructions; $config['washing_tips'] = $washing_tips; $config['product_storys'] = $product_storys; $config['shortdescriptions'] = $shortdescriptions; $config['descriptions'] = $descriptions; $config['environment_licences'] = $environment_licences; return $this->jsonEncoder->encode($config); } } ?>
You can see various Product attributes there.
And create this file here by Just copying/pasting the core swatch-renderer.js file in theme level.
\app\design\frontend\vendor\customTheme\Magento_Swatches\web\js\swatch-renderer.js
And please add some some extra codes like the below. In my case, its around line 768.
You can see console.log($widget.options.jsonConfig); in the below code. From that line, you can see extra codes.
// Foreach every attribute and check. If only one undefined (not selected) - nothing won't work $('.swatch-attribute').each(function () { var $element = $(this), attrId = $element.attr('attribute-id'), optionSelected = $element.attr('option-selected'); if(typeof optionSelected == "undefined"){ errorFlag = true; return false; } else { selectedSwatch[attrId] = optionSelected; errorFlag = false; } }); // Show descrption notification to user if(errorFlag == false){ var allTheProducts = $widget.options.jsonConfig.index; $.each(allTheProducts, function(index, value) { if(isEquivalent(selectedSwatch, value)){ // Quantity of selected simple product by ID //console.log($widget.options.jsonConfig); var shortdescriptions = $widget.options.jsonConfig.shortdescriptions[index]; var descriptions = $widget.options.jsonConfig.descriptions[index]; var barcodes = $widget.options.jsonConfig.barcodes[index]; var designers = $widget.options.jsonConfig.designers[index]; var materials = $widget.options.jsonConfig.materials[index]; var p_colors = $widget.options.jsonConfig.p_colors[index]; var product_story_url = $widget.options.jsonConfig.product_storys[index]; var washing_instructions = $widget.options.jsonConfig.washing_instructions[index]; var washing_tips = $widget.options.jsonConfig.washing_tips[index]; var environment_licences = $widget.options.jsonConfig.environment_licences[index]; console.log('Simple product ID: '+index+', descriptions: '+shortdescriptions); console.log('Simple product ID: '+index+', descriptions: '+descriptions); console.log('Simple product ID: '+index+', barcodes: '+barcodes); console.log('Simple product ID: '+index+', designers: '+designers); console.log('Simple product ID: '+index+', materials: '+materials); console.log('Simple product ID: '+index+', p_colors: '+p_colors); console.log('Simple product ID: '+index+', product_story: '+product_story_url); console.log('Simple product ID: '+index+', washing_instructions: '+washing_instructions); console.log('Simple product ID: '+index+', washing_tips: '+washing_tips); console.log('Simple product ID: '+index+', environment_licences: '+environment_licences); $('#product-attribute-specs-table').empty(); $('#washing-tab').empty(); $('#product-gallery').empty(); $('#product-attribute-specs-table').first().prepend("<caption class='table-caption'>More Information</caption>"); $('#product-attribute-specs-table').append("<tr><th class='col label' scope='row'>Barcode</th>" + "<td class='col data' data-th='Barcode'>" + barcodes + "</td></tr>" + "<tr><th class='col label' scope='row'>Material</th>" + "<td class='col data' data-th='Material'>" + materials + "</td></tr>" + "<tr><th class='col label' scope='row'>Designer</th>" + "<td class='col data' data-th='Designer'>" + designers + "</td></tr>" + "<tr><th class='col label' scope='row'>Color</th>" + "<td class='col data' data-th='Color'>" + p_colors + "</td></tr>"); $('#washing-tab').append($('<p>').text(washing_instructions)); $('#washing-tab').append($('<p>').text(washing_tips)); $('#product-gallery').append("<div class='loader'><img id='tab_product_story_img' src=" + product_story_url+ " /></div>"); if(environment_licences == 1){ $('.gots-brand-container').css("visibility","visible") }else $('.gots-brand-container').css("visibility","hidden"); $('#product_description').html(shortdescriptions); $('#description').html(descriptions); } }); } else { $('#product-attribute-specs-table').html(""); $('#product_description').html(""); $('#description').html(""); } $widget._Rebuild(); if ($widget.element.parents($widget.options.selectorProduct) .find(this.options.selectorProductPrice).is(':data(mage-priceBox)') ) { $widget._UpdatePrice(); }
After that, please remove cache and deploy static files again.
If you solve your problem, please click Kudos.
All the best.
John.