templates/_snippets/last_offers.html.twig line 1

Open in your IDE?
  1. {# ------------------------------------------------------------------------ #}
  2. {# ----------------------------- PARAMÉTRAGES ----------------------------- #}
  3. {# ------------------------------------------------------------------------ #}
  4. {% set effectiveSectionSettings = showSectionSettings|default(true) ? sectionSettings|default({}) : {} %}
  5. {% set content = effectiveSectionSettings|merge(lastOffers) %}
  6. {% set lastOffersId = 'last_offers-' ~ random() %}
  7. {% set specialOffers = getLastOffers(content.howManyOffers|default(1)) %}
  8. {% include '_snippets/sections/tags_section_settings.html.twig' with {
  9. 'content': content,
  10. 'id': lastOffersId,
  11. } %}
  12. {% include '_snippets/sections/cards_section_settings.html.twig' with {
  13. 'content': content,
  14. 'id': lastOffersId,
  15. } %}
  16. {# Paramètres spécifiques à ce fragment #}
  17. {% set buttonSettings = {
  18. 'padding': content.paddingButtonTopBottomContent|default(0) ~ content.paddingButtonUnitContent|default('px') ~ ' ' ~ content.paddingButtonRightLeftContent|default(0) ~ content.paddingButtonUnitContent|default('px'),
  19. 'color': content.colorButtonContent|default('#000'),
  20. 'background-color': content.backgroundColorButtonContent|default('#000'),
  21. 'border-radius': content.borderRadiusButtonContent|default(0) ~ content.borderRadiusButtonContentUnit|default('px'),
  22. 'font-size': content.fontSizeButtonContent|default(16) ~ content.fontSizeButtonContentUnit|default('px'),
  23. 'font-weight': content.fontWeightButtonContent|default(500),
  24. 'border': content.borderSizeButtonContent|default(0) ~ content.borderSizeButtonContentUnit|default('px') ~ ' solid ' ~ content.borderColorButtonContent|default('#000'),
  25. } %}
  26. {% set conditionSettings = {
  27. 'color': content.conditionColorCards|default('#000'),
  28. 'font-weight': content.conditionWeightCards|default(500),
  29. 'font-size': content.conditionSizeCards|default(16) ~ content.conditionSizeUnitCards|default('px'),
  30. } %}
  31. {% if true %}
  32. <section
  33. id="{{ lastOffersId }}" class="last-offers"> {# En-tête avec titre et navigation #}
  34. <div class="last-offers-head">
  35. <h2>
  36. <div class="icon">
  37. {{ getLucidIcon(attribute(content, 'pictogramTitleSection')|default('')) }}
  38. </div>
  39. {{ attribute(content, 'titleTextSection')|default('')|raw }}
  40. </h2>
  41. <div class="chevrons"></div>
  42. </div>
  43. {# ##################### HUB Promos requis ##################### #}
  44. {# <div class="button-container">
  45. <a href="/promotions" class="button">{{ content.textButtonContent|default('snippets.offers.see_all'|trans) }}</a>
  46. </div> #}
  47. {# Carousel #}
  48. <div class="slider">
  49. <div class="cards">
  50. {% for offer in specialOffers %}
  51. {% set mediaOffer = crea_media_get_media(['banner'], offer) %}
  52. {% set companyLogoUrl = offer.companies is iterable and offer.companies is not empty and offer.companies[0] is not null ? (crea_media_get_media(['logo'], offer.companies[0]).cdnUrl|default('/img/placeholder-company.svg')) : null %}
  53. {% set isPriority = loop.index <= 2 %}
  54. {% set imageUrl = mediaOffer.cdnUrl|default('/img/photos-temporaires/placeholder-image-offer.jpg') %}
  55. {% set tag = offer.tag|default(null) %}
  56. {% set company = offer.company|default(null) %}
  57. <div
  58. class="card animation1 offer-card-opener {{ isPriority ? 'priority-load' : 'lazy-load' }}"
  59. data-offer-id="{{ offer.id }}"
  60. role="button"
  61. tabindex="0"
  62. aria-haspopup="dialog"
  63. aria-controls="modal-offer-{{ offer.id }}"
  64. data-lazy="{{ isPriority ? 'false' : 'true' }}"
  65. >
  66. <div class="image {{ isPriority ? '' : 'lazy-background' }}" {% if isPriority %} style="background-image: url('{{ imageUrl }}');" {% else %} data-bg="{{ imageUrl }}" {% endif %}>
  67. <div class="tags">
  68. <div class="tag" style="background-color:{{offer.offerCategory.iconColorFill|default('#000000')}}">
  69. {{ getLucidIcon(offer.offerCategory.icon|default('star')) }}
  70. </div>
  71. </div>
  72. </div>
  73. <div class="card-inner">
  74. <div>
  75. <div class="more-info-div">
  76. <img src="{{ companyLogoUrl}}" alt="">
  77. <span class="info-icon" aria-hidden="true">
  78. {{ getLucidIcon('info') }}
  79. </span>
  80. </div>
  81. <div class="title">
  82. <div class="title-text">
  83. {{ offer.displayed_name|default(offer.name|default('snippets.offers.special_offer'|trans)) }}
  84. </div>
  85. </div>
  86. <div class="description content">
  87. <div class="description-text">
  88. {{ offer.shortDescription|default('')|slice(0, 250)|raw }}
  89. {% if offer.shortDescription|default('')|length > 250 %}
  90. <span class="read-more">...</span>
  91. {% endif %}
  92. </div>
  93. <div class="condition">
  94. {{ offer.conditions|default('')|slice(0, 250)|raw }}
  95. {% if offer.conditions|default('')|length > 250 %}
  96. <span class="read-more">...</span>
  97. {% endif %}
  98. </div>
  99. </div>
  100. </div>
  101. <div class="price-container">
  102. <div class="price">
  103. {{ 'common.from'|trans }}
  104. <span class="price-value">{{ getBestPriceByOffer(offer).baseCostDouble|default(0)|number_format(0, ',', ' ') }}€ {{ 'common.per_person_short'|trans }}</span>
  105. {# <span class="price-value">{{ 'XXX'|default(0)|number_format(0, ',', ' ') }}€ {{ 'common.per_person_short'|trans }}</span> #}
  106. </div>
  107. <div class="see-more">
  108. <a
  109. href="{{ getCruiseSearchUrl([getOfferById(offer.id)]) }}"
  110. class="btn style3 bg-w offer-card-action"
  111. >{{ 'common.see'|trans }}
  112. {{ getLucidIcon('arrow-right') }}</a>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. {% endfor %}
  118. </div>
  119. </div>
  120. <div class="last-offers-modals" hidden>
  121. {% for offer in specialOffers %}
  122. {% include '_snippets/_last_offer_modal.html.twig' with {
  123. offer: offer,
  124. imageUrl: crea_media_get_media(['banner'], offer).cdnUrl|default('/img/photos-temporaires/placeholder-image-offer.jpg'),
  125. companyLogoUrl: offer.companies is iterable and offer.companies is not empty and offer.companies[0] is not null ? (crea_media_get_media(['logo'], offer.companies[0]).cdnUrl|default('/img/placeholder-company.svg')) : null,
  126. } only %}
  127. {% endfor %}
  128. </div>
  129. </section>
  130. {% endif %}
  131. {# Le JavaScript des offres est maintenant géré par assets/website/js/snippets/last-offers.js #}
  132. <!-- Styles dynamiques -->
  133. <!-- prettier-ignore -->
  134. <style>
  135. #{{ lastOffersId }} {
  136. --padding-left-slider: {{ content.sectionPaddingLeft|default(0) ~ content.sectionPaddingUnit|default('px') }};
  137. --height-card-image: {{ content.imageHeightCards|default(200) ~ content.imageHeightCardsUnit|default('px') }};
  138. --condition-color: {{ content.conditionColorCards|default('#000') }};
  139. --condition-font-weight: {{ content.conditionWeightCards|default(500) }};
  140. --condition-font-size: {{ content.conditionSizeCards|default(16) ~ content.conditionSizeUnitCards|default('px') }};
  141. --button-padding: {{ content.paddingButtonTopBottomContent|default(0) ~ content.paddingButtonUnitContent|default('px') }} {{ content.paddingButtonRightLeftContent|default(0) ~ content.paddingButtonUnitContent|default('px') }};
  142. --button-color: {{ content.colorButtonContent|default('#000') }};
  143. --button-background-color: {{ content.backgroundColorButtonContent|default('#000') }};
  144. --button-border-radius: {{ content.borderRadiusButtonContent|default(0) ~ content.borderRadiusButtonContentUnit|default('px') }};
  145. --button-font-size: {{ content.fontSizeButtonContent|default(16) ~ content.fontSizeButtonContentUnit|default('px') }};
  146. --button-font-weight: {{ content.fontWeightButtonContent|default(500) }};
  147. --button-border: {{ content.borderSizeButtonContent|default(0) ~ content.borderSizeButtonContentUnit|default('px') }} solid {{ content.borderColorButtonContent|default('#000') }};
  148. }
  149. </style>