Magento 2 How to get child item id of configurable product by super attribute details?

Let’s assume you know configurable product id and used child product super attribute details.
Example from Magento Sample data configurable product name Chaz Kangeroo Hoodie,  Configurable product id is 67.
Super attribute Array details,

[super_attribute] => Array
(
    [93] => 49
    [254] => 167
)

Using the bove details how we can get details of child item.

Refer below code snippet for Get child item id of a Configurable product by child’s Attribute details.

<?php
public function __construct(
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
    \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurable
) {
    $this->productRepository = $productRepository;
    $this->configurable = $configurable;
}
/* Pass Configurable product id as $configId 
 * Pass array of super attribute of child item
 */
public function getChildFromProductAttribute($configId,$superAttribute) {
	$_configProduct = $this->productRepository->getById($configId);
	$usedChild = $this->configurable->getProductByAttributes($superAttribute ,$_configProduct);
	$childProductId = $usedChild->getId();
	return $childProductId;
}

Call function,

$configId = 67; //Configurable Product id
$superAttribute = Array(93 => 49,254 => 167); //childs super attribute details
$childId = $this->getChildFromProductAttribute($configId,$superAttribute);

Result is 52(Product name Chaz Kangeroo Hoodie-XS-Black). Using above way we got the child item data.

How to resolve Uncaught ReferenceError: jQuery is not defined(anonymous function) error magento 2?

Many time during custom development in Magento 2 using require js we have faced error like,

Uncaught ReferenceError: jQuery is not defined(anonymous function).
Uncaught TypeError: $(…).customjs is not a function.

Above issue can be resolved using require js paths and shim attribute of requirejs.
Most of the time issue occurs because of jQuery is not loaded before our custom js file due to AMD(asynchronously module dependencies) nature of require js.

Many of the custom js or Third party js library depends on Jquery to load first.
In Magento 2, Magento team used require js concept for improvement of site speed.

So you need to add dependencies in requirejs-config.js file as below. let’s assume you are using slider js names myslider.min.js and they depend on jquery. Your requirejs-config.js file will be as below,

var config = {
    paths: {
            'myslider': 'Vendor_Module/js/myslider.min'
    },
    shim: {
            'myslider': {
                deps: ['jquery'] //gives your parent dependencies name here
            }
    }
};

Gives pathname under the paths object, Your myslider.min.js stay at app/code/<Vendor>/<Module>/view/frontend/web/js/myslider.min.js

Gives dependencies using shim attribute. Our slider depends on jquery.

How to override template (.phtml) files in magento 2?

Override template files in Magento 2 is common and just a simple. You can override template file by below ways.
1. Using Theme level in the theme directory
2. Using Module level in the custom module

1. Using Theme level,
We will discuss first theme level override templates. I hope you have created theme for your site. If you don’t know how to create theme refer to link for creating the custom theme,
For theme level override you must have a custom theme in your project.
Let’s assume We need to override list.phtml file from Catalog core module.
Path for core module is vendor/magento/module-catalog/view/frontend/templates/product/list.phtml

We need to create Magento_Catalog folder in our theme root directory.
Let’s assume your theme name is Vendorname/themename. Your actual path for a theme is,
app/design/frontendVendorname/themename. You need to create Folder Magento_Catalog for override catalog module template file. Our core module template resides in module-catalog folder so you need to create Core module folder like,
Magento_Catalog (Where Magento is Vendorname and Modulename will be in UpperCamelCase letter with suffix “prefix”)

Now you can override your list.phtml at below location,,
app/design/frontendVendorname/themename/Magento_Catalog/templates/product/list.phtml
Create list.phtml file and get content from core Magento Catalog template list.phtml file.

For some core module name in Magento 2 has multiple words separated with the hyphen(-).
Like, module-configurable-product, In this case, our Module name in the theme will be, Magento_ConfigurableProduct
if you want to override templates from module-checkout-agreements your theme level folder will be Magento_CheckoutAgreements

2. Using Module Level,
You can override template file using the Module level.
You need to create layout XML file from your controller action,
app/code/<Vendor>_<Module>/view/frontend/layout/catalog_category_view.xml

(Using New method)

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="category.products.list">
            <arguments>
                <argument name="template" xsi:type="string">Vendor_Module::product/list.phtml</argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

(Using old deprecated method, action method=”setTemplate”)

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="category.products.list">
            <action method="setTemplate">
                <argument name="template" xsi:type="string">Vendor_Module::product/list.phtml</argument>
            </action>
        </referenceBlock>
    </body>
</page>

Using New method some of the templates is still not overridden check link, Github Issue.

Do not use <action> tag, if the method implementation allows calling it using <argument> for block or referenceBlock.

For example, in your module, you would put a list template in  module for path, app/code/<Vendor>_<Module>/view/frontend/templates/product/list.phtml

Conclusion:

Which method should we use from the above solutions?
There is no one specific method that should be used in all scenarios.
If you are creating a theme, use the template path method(Method 1 is more suitable for frontend developer).
If you are creating a module, use the layout at the module level and define your template.