public/themes/default/product-single.html.twig line 1

Open in your IDE?
  1. {% extends getThemeDir('base.html.twig') %}
  2. {% block seo %}
  3.     {# مهم: روت محصول پارامتر urlSlug می‌خواهد؛ مدل محصول باید getUrlSlug() یا getSlug() داشته باشد #}
  4.     {{ render_seo('product', product, app.request.attributes.get('_route'), app.request.attributes.get('_route_params')) }}
  5. {% endblock %}
  6. {% block body %}
  7.     <style>
  8.         .ui-variant--color .ui-variant--check {
  9.             padding-right: 10px !important;
  10.         }
  11.     </style>
  12.     <div class="container main-container">
  13.         {% include  getThemeDir('product/bread-crumb.html.twig') with {'product' : product} %}
  14.         {% include  getThemeDir('product/intro.html.twig') with {'product' : product} %}
  15.         <div class="dt-sn mb-5 px-0 dt-sl pt-0">
  16.             {% include  getThemeDir('product/tabs.html.twig') with {'product' : product,'comments' : comments} %}
  17.         </div>
  18.         <section class="slider-section dt-sl mb-5">
  19.             <div class="row mb-3">
  20.                 <div class="col-12">
  21.                     <div class="section-title text-sm-title title-wide no-after-title-wide">
  22.                         <h2>خریداران این محصول، محصولات زیر را هم خریده‌اند</h2>
  23.                     </div>
  24.                 </div>
  25.                 <div class="col-12">
  26.                     <div class="product-carousel carousel-lg owl-carousel owl-theme">
  27.                         {% for product in relatedProducts %}
  28.                             <div class="item">
  29.                                 {% include getThemeDir('cards/single-product.html.twig') with {'product' : product} %}
  30.                             </div>
  31.                         {% endfor %}
  32.                     </div>
  33.                 </div>
  34.             </div>
  35.         </section>
  36.     </div>
  37. {% endblock %}
  38. {% block javascripts %}
  39.     <script>
  40.         function setupDynamicCollection(containerId, addButtonId) {
  41.             const container = document.querySelector(`#${containerId} [data-prototype]`);
  42.             const addButton = document.getElementById(addButtonId);
  43.             let index = container.children.length;
  44.             addButton.addEventListener('click', () => {
  45.                 const prototype = container.dataset.prototype;
  46.                 const newForm = prototype.replace(/__name__/g, index);
  47.                 const wrapper = document.createElement('div');
  48.                 wrapper.classList.add('input-group', 'mb-2');
  49.                 wrapper.innerHTML = newForm + '<button type="button" class="btn btn-danger remove-item">–</button>';
  50.                 container.appendChild(wrapper);
  51.                 index++;
  52.             });
  53.             container.addEventListener('click', (e) => {
  54.                 if (e.target.classList.contains('remove-item')) {
  55.                     e.target.closest('.input-group').remove();
  56.                 }
  57.             });
  58.         }
  59.         document.addEventListener('DOMContentLoaded', () => {
  60.             setupDynamicCollection('pros-container', 'add-pro');
  61.             setupDynamicCollection('cons-container', 'add-con');
  62.         });
  63.     </script>
  64. {% endblock %}