app/Plugin/VariationSwatches42/Resource/template/assets.twig line 1

Open in your IDE?
  1. {# Load variation swatches CSS #}
  2. <link rel="stylesheet" href="{{ asset('VariationSwatches42/assets/variation-swatches.css', 'plugin') }}">
  3. {# Load React and variation swatches bundle #}
  4. <script src="{{ asset('VariationSwatches42/assets/variation-swatches-bundle.js', 'plugin') }}"></script>
  5. {# Initialize variation swatches #}
  6. {% if configScript is defined and configScript is not empty %}
  7.     {{ configScript|raw }}
  8. {% endif %}
  9. {% if productsScript is defined and productsScript is not empty %}
  10.     {{ productsScript|raw }}
  11. {% endif %}
  12. {# Custom Event Handler for Variation Swatches Selection Complete #}
  13. <script>
  14.     document.addEventListener('DOMContentLoaded', function () {
  15.         const isProductDetail = document.body && document.body.id === 'page_product_detail';
  16.         // Listen for the custom event from ReactJS variation swatches - both options selected
  17.         document.addEventListener('variationSwatchesSelectionComplete', function (event) {
  18.             const {productId, SwatchesMediaIndexConfig} = event.detail;
  19.             if (isProductDetail) {
  20.                 // Product detail page - handle slider navigation
  21.                 handleProductDetailSlider(SwatchesMediaIndexConfig, event.detail);
  22.             } else {
  23.                 // Product list page - handle image URL switching
  24.                 handleProductListImageSwitch(productId, SwatchesMediaIndexConfig);
  25.             }
  26.         });
  27.         // Listen for deselection event - when one or both options are deselected
  28.         document.addEventListener('variationSwatchesDeselection', function (event) {
  29.             const {productId} = event.detail;
  30.             if (isProductDetail) {
  31.                 const slickSlider = document.querySelector('.item_visual');
  32.                 if (slickSlider && typeof $ !== 'undefined' && $(slickSlider).hasClass('slick-initialized')) {
  33.                     $(slickSlider).slick('slickGoTo', 0, false);
  34.                 }
  35.             } else {
  36.                 // Product list page - revert to original image
  37.                 handleProductListImageRevert(productId);
  38.             }
  39.         });
  40.         // Handle product detail slider navigation
  41.         function handleProductDetailSlider(SwatchesMediaIndexConfig, eventDetail) {
  42.             const mediaIndex = SwatchesMediaIndexConfig.media_index;
  43.             // Only proceed if media index is not null
  44.             if (mediaIndex !== null && mediaIndex !== undefined) {
  45.                 const slickSlider = document.querySelector('.item_visual');
  46.                 if (slickSlider && typeof $ !== 'undefined' && $(slickSlider).hasClass('slick-initialized')) {
  47.                     $(slickSlider).slick('slickGoTo', mediaIndex, false);
  48.                     // Dispatch a custom event to notify other components
  49.                     const sliderChangedEvent = new CustomEvent('variationSwatchesSliderChanged', {
  50.                         detail: {
  51.                             productId: eventDetail.productId,
  52.                             mediaIndex: mediaIndex,
  53.                             SwatchesConfig: eventDetail.SwatchesConfig,
  54.                             SwatchesMediaIndexConfig: SwatchesMediaIndexConfig
  55.                         },
  56.                         bubbles: true
  57.                     });
  58.                     document.dispatchEvent(sliderChangedEvent);
  59.                 }
  60.             }
  61.         }
  62.         // Handle product list image URL switching
  63.         function handleProductListImageSwitch(productId, SwatchesMediaIndexConfig) {
  64.             const imageUrl = getImageUrlFromConfig(SwatchesMediaIndexConfig);
  65.             if (imageUrl) {
  66.                 const productInput = document.querySelector(`input[name="product_id"][value="${productId}"]`);
  67.                 if (productInput) {
  68.                     const productElement = productInput.closest('.ec-shelfGrid__item');
  69.                     if (productElement) {
  70.                         const imageElement = productElement.querySelector('.ec-shelfGrid__item-image img');
  71.                         if (imageElement) {
  72.                             if (!imageElement.dataset.originalSrc) {
  73.                                 imageElement.dataset.originalSrc = imageElement.src;
  74.                             }
  75.                             // Switch to new image
  76.                             imageElement.src = imageUrl;
  77.                         }
  78.                     }
  79.                 }
  80.             }
  81.         }
  82.         // Handle product list image revert
  83.         function handleProductListImageRevert(productId) {
  84.             const productInput = document.querySelector(`input[name="product_id"][value="${productId}"]`);
  85.             if (productInput) {
  86.                 const productElement = productInput.closest('.ec-shelfGrid__item');
  87.                 if (productElement) {
  88.                     const imageElement = productElement.querySelector('.ec-shelfGrid__item-image img');
  89.                     if (imageElement && imageElement.dataset.originalSrc) {
  90.                         imageElement.src = imageElement.dataset.originalSrc;
  91.                     }
  92.                 }
  93.             }
  94.         }
  95.         // Get image URL from SwatchesMediaIndexConfig
  96.         function getImageUrlFromConfig(SwatchesMediaIndexConfig) {
  97.             if (SwatchesMediaIndexConfig && SwatchesMediaIndexConfig.image_url) {
  98.                 return SwatchesMediaIndexConfig.image_url;
  99.             }
  100.             return null;
  101.         }
  102.     });
  103. </script>