src/UI/WebBundle/Resources/views/Product/public_product_show.html.twig line 1

Open in your IDE?
  1. {% extends 'Common/base.html.twig' %}
  2. {% import 'Common/parts/functions.html.twig' as function %}
  3. {% block title %}{{ product.productLabel }} | {{ parent() }}{% endblock %}
  4. {% block classBody %}product_show {{ parent() }}{% endblock %}
  5. {% block stylesheets %}
  6. <link href="/build/theme/phoenix/assets/vendors/swiper/swiper-bundle.min.css" rel="stylesheet">
  7. {{ parent() }}
  8. {{ encore_entry_link_tags('datatables_styles') }}
  9. {% endblock stylesheets %}
  10. {% block javascripts %}
  11. {{ parent() }}
  12. <script type="text/javascript" src="/build/theme/phoenix/assets/vendors/swiper/swiper-bundle.min.js"></script>
  13. {{ encore_entry_script_tags('public_product_show') }}
  14. {% endblock javascripts %}
  15. {% block contents %}
  16. <div id="whater_public_product_show_page"
  17. class="container pt-5 pb-9"
  18. data-product-id="{{ product.id }}"
  19. data-minimun-price="{{ product.productPrice }}"
  20. ng-controller="publicProductShowCtrl">
  21. <section class="py-0">
  22. <div class="container-small">
  23. <nav class="mb-3" aria-label="breadcrumb">
  24. <ol class="breadcrumb mb-0">
  25. <li class="breadcrumb-item"><a href="{{path('web_homepage')}}">Inicio</a></li>
  26. <li class="breadcrumb-item"><a href="{{path('web_public_product_list')}}">Productos</a></li>
  27. <li class="breadcrumb-item active" aria-current="page">{{ product.productLabel }}</li>
  28. </ol>
  29. </nav>
  30. <div class="row g-5 mb-5 mb-lg-8" >
  31. <div class="col-12 col-lg-6">
  32. <div class="row g-3 mb-3">
  33. <div class="col-12 col-md-2 col-lg-12 col-xl-2" ng-init="swiperInit()">
  34. <div class="swiper-products-thumb swiper swiper-container theme-slider" id="swiper-products-thumb" >
  35. <div class="swiper-wrapper" >
  36. {% set hasImage = false %}
  37. {% for productImage in product.images %}
  38. {% set hasImage = true %}
  39. <div class="swiper-slide">
  40. <div class="product-thumb-container p-2 p-sm-3 p-xl-2">
  41. <img src="{{ vich_uploader_asset( productImage, 'fileProductImage') | imagine_filter('product_image_thumbnail_65_65') }}" alt="">
  42. </div>
  43. </div>
  44. {% endfor %}
  45. {% if not hasImage %}
  46. <div class="swiper-slide">
  47. <div class="product-thumb-container p-2 p-sm-3 p-xl-2">
  48. <img src="{{ asset('/assets/images/logo_v3.png') | imagine_filter('product_image_thumbnail_65_65') }}" alt="">
  49. </div>
  50. </div>
  51. {% endif %}
  52. </div>
  53. <!-- Agregar el contenedor del scrollbar -->
  54. <div class="swiper-scrollbar"></div>
  55. </div>
  56. </div>
  57. <div class="col-12 col-md-10 col-lg-12 col-xl-10">
  58. <div class="d-flex align-items-center border rounded-3 text-center p-5 h-100">
  59. <div class="swiper swiper-container theme-slider" id="swiper-images">
  60. <div class='swiper-wrapper' >
  61. {% for productImage in product.images %}
  62. <div class='swiper-slide '>
  63. <img class='w-100' src="{{ vich_uploader_asset( productImage, 'fileProductImage') | imagine_filter('product_image_thumbnail_480_480') }}" alt="">
  64. </div>
  65. {% endfor %}
  66. {% if not hasImage %}
  67. <div class='swiper-slide '>
  68. <img class='w-100' src="{{ asset('/assets/images/logo_v3.png') | imagine_filter('product_image_thumbnail_480_480') }}" alt="">
  69. </div>
  70. {% endif %}
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <div class="col-12 col-lg-6">
  78. <div class="d-flex flex-column justify-content-between h-100">
  79. <div>
  80. {{ function.showFlashes() }}
  81. {% if product.averageValorations is not none %}
  82. <div ng-init="initProductsRaters()" class="d-flex">
  83. <div data-valoration="{{product.averageValorations}}" class="wp-star product-rater me-2 mt-1" ></div>
  84. <div class="text-primary fw-semi-bold mb-2">{{product.valorations | length }} usuarios valoraron este producto</div>
  85. </div>
  86. {% endif %}
  87. <h3 class="mb-2 lh-sm">{{ product.productLabel}}</h3>
  88. <div class="d-flex flex-wrap align-items-start mb-3">
  89. {%for tag in product.tags%}
  90. <div class="badge bg-primary rounded-pill mx-1">{{ tag }}</div>
  91. {% endfor %}
  92. </div>
  93. <div class="d-flex flex-wrap align-items-start mb-3">
  94. {% if product.productCategory is not none %}
  95. <div class="mx-1">{{ product.productCategory.categoryPath }}</div>
  96. {%endif %}
  97. </div>
  98. <div class="d-flex flex-wrap align-items-start mb-3">
  99. <span class="me-2 fw-semi-bold">{{ product.whaterOrganization.country.name }}</span>
  100. </div>
  101. <div class="d-flex flex-wrap align-items-center">
  102. <h1 class="me-3" id="price" data-product-price="{{ product.productPrice }}">{{ product.productPrice | number_format(2, ',', '.')}} €</h1>
  103. <p class="text-body-quaternary text-decoration-line-through fs-3 mb-0 me-3 d-none" id="price-strike">{{ product.productPrice | number_format(2, ',', '.')}} €</p>
  104. <p class="text-warning fw-bolder fs-3 mb-0 d-none" id="price-discount"></p>
  105. </div>
  106. <p class="text-success fw-semi-bold fs-1 mb-2">Disponible</p>
  107. {% if product.maxDiscountPercentageAllowed > 0 and product.acceptWhatercoins %}
  108. <div class="mb-2" ng-init="initProductSelectDiscount()" >
  109. <div class="text-warning fw-bolder fs-0 mb-0">¡¡Obten un descuento usando whatercoins!!</div>
  110. <select class="form-select w-100" id="product-discount-select">
  111. <option value="">-</option>
  112. {% for discount, whc in whatercoins_discounts %}
  113. {% if discount <= product.maxDiscountPercentageAllowed %}
  114. <option value="{{discount}}" id="option-discount-{{discount}}" data-product-discount-in-whatercoins="{{ whc }}"> Por {{ whc | number_format(2, ',', '.')}} wc tendrás un descuento del {{ discount | number_format(2, ',', '.') }}%</option>
  115. {% endif %}
  116. {% endfor %}
  117. </select>
  118. </div>
  119. {% endif %}
  120. <p class="mb-2 text-800" id="short-description">
  121. {{ product.productShortDescription | raw }}
  122. </p>
  123. </div>
  124. {% if product.productVariations | length > 0 %}
  125. {% set productVariationsAttributesString = '' %}
  126. {% for variation in product.productVariations %}
  127. {% set variationAttributes = variation.productVariationAttributes %}
  128. {% set productVariationsAttributesString = productVariationsAttributesString ~ variationAttributes|json_encode %}
  129. {% endfor %}
  130. {% set productVariationsAttributesStringWellWritten = productVariationsAttributesString|replace({'\\u00f1': 'ñ', '\\u00f3': 'ó', '\\u00e1': 'á', '\\u00e9': 'é', '\\u00ed': 'í', '\\u00fa': 'ú', '\\u00c1': 'Á', '\\u00c9': 'É', '\\u00cd': 'Í', '\\u00d3': 'Ó', '\\u00da': 'Ú', '\\u00dc': 'Ü', '\\u00fc': 'ü', '\\u00f1': 'ñ'}) %}
  131. <div class="row mb-4" ng-init="initProductVariations({{productVariationsSerialized}})">
  132. {% for attribute in attributes %}
  133. {% if attribute in product.productAttributes and attribute.productAttributeTerms | length > 0 %}
  134. <div class="col-12 text-start attribute_{{attribute.productAttributeSlug}}" >
  135. <label class="form-label" for="product_variation_attribute_select_{{attribute.productAttributeSlug}}" >{{attribute.productAttributeName}}</label>
  136. <select id="product_variation_attribute_select_{{attribute.productAttributeSlug}}" class="form-select attribute-select">
  137. <option value="" data-attribute-slug="{{attribute.productAttributeSlug}}"></option>
  138. {% for term in attribute.productAttributeTerms%}
  139. {% if term in productVariationsAttributesStringWellWritten %}
  140. <option value="{{term}}" data-attribute-slug="{{attribute.productAttributeSlug}}">{{term}}</option>
  141. {% endif %}
  142. {% endfor %}
  143. </select>
  144. </div>
  145. {% endif %}
  146. {% endfor %}
  147. <div id="attributes-message" class="mt-3 text-danger fs--1"></div>
  148. </div>
  149. {% endif %}
  150. <button type="button" ng-click="buyProduct('{{ product.id }}')"
  151. class="btn btn-lg btn-primary rounded-pill w-100 fs--1 fs-sm-0" id="buy-product-button">
  152. Compra desde {{ product.productPrice | number_format(2, ',', '.') }} euros!
  153. </button>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. </section>
  159. <section class="py-0">
  160. <div class="container-small">
  161. <ul class="nav nav-underline mb-4" id="productTab" role="tablist">
  162. <li class="nav-item active">
  163. <a class="nav-link active" id="description-tab" data-bs-toggle="tab"
  164. href="#tab-description" role="tab" aria-controls="tab-description" aria-selected="true">
  165. Descripción
  166. </a>
  167. </li>
  168. </ul>
  169. <div class="row gx-3 gy-7">
  170. <div class="col-12">
  171. <div class="tab-content" id="productTabContent">
  172. <div class="tab-pane pe-lg-6 pe-xl-12 fade text-1100 active show" id="tab-description"
  173. role="tabpanel" aria-labelledby="description-tab">
  174. {{ product.productDescription | raw | nl2br }}
  175. </div>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. <!-- end of .container-->
  181. </section>
  182. </div>
  183. {% endblock contents %}