templates/default/pages/base.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html {% if 'html_lang_param' != 'html_lang_param'|trans %}lang="{{ 'html_lang_param'|trans }}" {% endif %}>
  3. {% set isIE = 'Trident' in app.request.headers.get('User-Agent') or 'MSIE' in app.request.headers.get('User-Agent') %}
  4. {% set isPunchout = (app.request.cookies.get("isPunchout") == "oci" or app.request.cookies.get("isPunchout") == "cxml") %}
  5. {% set categoryTree = getCategoryTree() %}
  6. <head>
  7. {% block gtmDataLayer %}
  8. {% include('components/atoms/gtm-data-layer/gtm-data-layer.html.twig') %}
  9. {% endblock %}
  10. {% block globalJavaScript %}
  11. {% if not app.getRequest().attributes.get('storyblok_preview') and not isPunchout %}
  12. {% if ("C0002:1" in app.request.cookies.get("OptanonConsent")|default) %}
  13. <script type="text/javascript">
  14. {# Start VWO Async SmartCode #}
  15. window._vwo_code = window._vwo_code || (function(){
  16. var account_id=609860,
  17. settings_tolerance=1500,
  18. library_tolerance=2000,
  19. use_existing_jquery=false,
  20. is_spa=1,
  21. hide_element='body',
  22. /* DO NOT EDIT BELOW THIS LINE */
  23. f=false,d=document,code={use_existing_jquery:function(){return use_existing_jquery;},library_tolerance:function(){return library_tolerance;},finish:function(){if(!f){f=true;var a=d.getElementById('_vis_opt_path_hides');if(a)a.parentNode.removeChild(a);}},finished:function(){return f;},load:function(a){var b=d.createElement('script');b.src=a;b.type='text/javascript';b.innerText;b.onerror=function(){_vwo_code.finish();};d.getElementsByTagName('head')[0].appendChild(b);},init:function(){
  24. window.settings_timer=setTimeout(function () {_vwo_code.finish() },settings_tolerance);var a=d.createElement('style'),b=hide_element?hide_element+'{opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important;}':'',h=d.getElementsByTagName('head')[0];a.setAttribute('id','_vis_opt_path_hides');a.setAttribute('type','text/css');if(a.styleSheet)a.styleSheet.cssText=b;else a.appendChild(d.createTextNode(b));h.appendChild(a);this.load('https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&f='+(+is_spa)+'&r='+Math.random());return settings_timer; }};window._vwo_settings_timer = code.init(); return code; }());
  25. {# End VWO Async SmartCode #}
  26. </script>
  27. {% endif %}
  28. <!-- OneTrust Cookies Consent Notice -->
  29. <script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js"
  30. data-document-language="true"
  31. type="text/javascript"
  32. charset="UTF-8"
  33. data-domain-script="{{ 'cookie_consent_domain_id'|trans }}{% if app.environment != 'prod' %}-test{% endif %}" >
  34. </script>
  35. <script type="text/javascript">
  36. function OptanonWrapper() {
  37. if (OnetrustActiveGroups.indexOf('C0002') != -1) {
  38. gtag('consent', 'update', {'analytics_storage': 'granted'})
  39. };
  40. if (OnetrustActiveGroups.indexOf('C0003') != -1) {
  41. window.emos3.send({'privacy_mode': 3});
  42. }else {
  43. window.emos3.send({'privacy_mode': 'reset'});
  44. }
  45. if (OnetrustActiveGroups.indexOf('C0004') != -1) {
  46. gtag('consent', 'update', {'ad_storage': 'granted'})
  47. gtag('consent', 'update', {'ad_user_data': 'granted'});
  48. gtag('consent', 'update', {'ad_personalization': 'granted'});
  49. };
  50. window.emos3InitialSend();
  51. }
  52. </script>
  53. {% endif %}
  54. {% include('components/atoms/global-java-script/global-java-script.html.twig') %}
  55. <script src="https://integrations.etrusted.com/applications/widget.js/v2" defer async></script>
  56. {% endblock %}
  57. {% block gtm %}
  58. <!-- Google Tag Manager -->
  59. <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  60. new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  61. j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  62. 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  63. })(window,document,'script','dataLayer','{% if isPunchout %}{{ 'gtm_id_oci'|trans }}{% else %}{{ 'gtm_id'|trans }}{% endif %}');</script>
  64. <!-- End Google Tag Manager -->
  65. {% endblock %}
  66. {% block meta %}
  67. {% include 'components/organisms/meta/meta.html.twig' %}
  68. {% endblock %}
  69. {% block openGraph %}
  70. {% include 'components/organisms/open-graph/open-graph.html.twig' %}
  71. {% endblock %}
  72. {% block favicon %}
  73. {% include 'components/organisms/favicon/favicon.html.twig' %}
  74. {% endblock %}
  75. <title>{% block title %}{{ metaInformation.title|default('meta_title_default'|trans) }}{% endblock %}</title>
  76. {% block stylesheets %}
  77. {{ encore_entry_link_tags('vendor') }}
  78. {{ encore_entry_link_tags('app') }}
  79. {% endblock %}
  80. <link rel="preconnect" href="//widgets.crosssell.info">
  81. <link rel="preconnect" href="//cdn.cookielaw.org">
  82. <link rel="preconnect" href="//in.hotjar.com">
  83. </head>
  84. <body>
  85. {% block gtmNoScript %}
  86. <!-- Google Tag Manager (noscript) -->
  87. <noscript><iframe src="https://www.googletagmanager.com/ns.html?id={{ 'gtm_id'|trans }}" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  88. <!-- End Google Tag Manager (noscript) -->
  89. {% endblock %}
  90. {% block econdaTracing %}
  91. {% include('components/atoms/econda-tracking/econda-tracking.html.twig')%}
  92. {% endblock %}
  93. {% include 'components/atoms/page-loader/page-loader.html.twig' %}
  94. {% set hotlineType = 'is--company' %}
  95. {% if breadcrumbs is defined and breadcrumbs is iterable%}
  96. {% if breadcrumbs|last['branch']|default == 'cp' %}
  97. {% set hotlineType = 'is--cp' %}
  98. {% elseif breadcrumbs|last['branch']|default == 'company' %}
  99. {% set hotlineType = 'is--company' %}
  100. {% elseif breadcrumbs|last['branch']|default == 'engineered-solutions' %}
  101. {% set hotlineType = 'is--es' %}
  102. {% endif %}
  103. {% endif %}
  104. <div id="app" class="{{ hotlineType }}">
  105. <div class="app__inner">
  106. {% block body %}
  107. <to-the-top></to-the-top>
  108. {% block flash_messages %}
  109. {% include 'components/atoms/toast/toast.html.twig' %}
  110. {% endblock %}
  111. {% block header %}
  112. {{ include('components/organisms/header/header.html.twig') }}
  113. {% endblock %}
  114. {% block breadcrumb %}
  115. {% include('components/molecules/breadcrumb/breadcrumb.html.twig') %}
  116. {% endblock %}
  117. <main>
  118. {% block content %}{% endblock %}
  119. </main>
  120. {% block footer %}
  121. {% include 'components/organisms/footer/footer.html.twig' %}
  122. {% endblock %}
  123. {% block offcanvas %}
  124. {% block offcanvasMobileMenu %}
  125. {% include 'components/organisms/vertical-menu/vertical-menu.html.twig' %}
  126. {% endblock %}
  127. {% block offcanvasAccountMenu %}
  128. {% embed 'components/organisms/offside/offside.html.twig' with {
  129. 'id': 'accountMenu',
  130. 'header': 'offcanvas_account_menu_headline'|trans,
  131. 'aria-labeldby': 'offcanvas_account_menu_headline'|trans,
  132. } %}
  133. {% block offcanvasContent %}
  134. {% include 'components/organisms/offcanvas-account/offcanvas-account.html.twig' %}
  135. {% endblock %}
  136. {% endembed %}
  137. {% endblock %}
  138. {% block offcanvasCart %}
  139. {% endblock %}
  140. {% endblock %}
  141. {% endblock %}
  142. {% block modal %}
  143. {% endblock %}
  144. {% if cms_globals.slot_sticky_banner is defined %}
  145. {% set stickyBanner %}
  146. {% include 'components/organisms/storyblok/storyblok.html.twig' with {
  147. 'componentData': cms_globals.slot_sticky_banner
  148. } %}
  149. {% endset %}
  150. {{ setPageEndHtml('sticky-banner', stickyBanner) }}
  151. {% endif %}
  152. </div>
  153. {{ getPageEndHtml() }}
  154. </div>
  155. {% block javascripts %}
  156. {% include('components/molecules/breadcrumb/breadcrumb-schema.html.twig') %}
  157. {% if app.getRequest().attributes.get('storyblok_preview') %}
  158. <script src="//app.storyblok.com/f/storyblok-v2-latest.js" defer></script>
  159. <script>
  160. window.addEventListener('load', function() {
  161. const storyblokInstance = new window.StoryblokBridge()
  162. storyblokInstance.on(['change', 'published'], function() {
  163. window.location.reload();
  164. });
  165. });
  166. </script>
  167. {% endif %}
  168. <script type="text/javascript" defer="defer" src="https://l.ecn-ldr.de/loader/loader.js" client-key="00002954-63be81d4-fc18-3e36-996c-72cbbe3e697d" container-id="5937"></script>
  169. <script>
  170. {% set jsTranslations = {
  171. 'form_transmission_error': 'form_transmission_error'|trans,
  172. 'line_item_subtotal': 'line_item_subtotal'|trans,
  173. 'line_item_voucher': 'line_item_voucher'|trans,
  174. 'line_item_shipping': 'line_item_shipping'|trans,
  175. 'line_item_shipping_free': 'line_item_shipping_free'|trans,
  176. 'line_item_tax': 'line_item_tax'|trans,
  177. 'line_item_tax_info': 'line_item_tax_info'|transFallbackEmptyText,
  178. 'line_item_sum': 'line_item_sum'|trans,
  179. 'direct_order_search_placeholder': 'direct_order_search_placeholder'|trans,
  180. 'add': 'add'|trans,
  181. 'service_url_denios_assets':'image_service_url_denios_assets'|trans,
  182. 'service_url_storyblok':'image_service_url_storyblok'|trans,
  183. 'image_url_denios_assets':'image_url_denios_assets'|trans,
  184. 'image_url_storyblok':'image_url_storyblok'|trans,
  185. 'back': 'back'|trans,
  186. 'header_vat_excluding': 'header_vat_excluding'|trans,
  187. 'header_vat_including': 'header_vat_including'|trans,
  188. 'header_direct_order': 'header_direct_order'|trans,
  189. 'account_new_password_requirement': 'account_new_password_requirement'|trans,
  190. 'password_requirement_min_length': 'password_min_length'|trans,
  191. 'password_requirement_min_uppercase': 'password_min_uppercase'|trans,
  192. 'password_requirement_min_lowercase': 'password_min_lowercase'|trans,
  193. 'password_requirement_min_numbers': 'password_min_numbers'|trans,
  194. 'header_account_label': 'header_account_label'|trans,
  195. 'loading': 'loading'|trans,
  196. 'voucher_apply': 'voucher_apply'|trans,
  197. 'voucher_hint': 'voucher_hint'|trans,
  198. 'voucher_input_placeholder': 'voucher_input_placeholder'|trans,
  199. 'to_the_top': 'button_to_the_top'|trans,
  200. 'language_switcher_json': 'header_language_switcher'|trans([],'json'),
  201. 'messages.formservice_required_validation_message': 'formservice_required_validation_message'|trans,
  202. 'messages.formservice_email_validation_message': 'formservice_email_validation_message'|trans,
  203. 'messages.formservice_date_validation_message': 'formservice_date_validation_message'|trans,
  204. 'messages.formservice_date_after_validation_message': 'formservice_date_after_validation_message'|trans,
  205. 'messages.formservice_date_before_validation_message': 'formservice_date_before_validation_message'|trans,
  206. 'messages.formservice_date_days_of_week_validation_message': 'formservice_date_days_of_week_validation_message'|trans,
  207. 'messages.formservice_frc_validation_message': 'formservice_frc_validation_message'|trans,
  208. 'form_reference_button': 'form_reference_button'|trans,
  209. 'form_reference_technical_error': 'form_reference_technical_error'|trans,
  210. 'form_time_format': 'form_time_format'|trans,
  211. 'download': 'form_reference_download_button'|trans,
  212. 'dvs_type_translation': 'dvs_type_translation'|trans([],'json'),
  213. 'line_item_extra_info': 'line_item_extra_info'|transFallbackEmptyText,
  214. 'book_appointment': 'book_appointment'|transFallbackEmptyText,
  215. 'load_more':'pagination_more_text'|trans,
  216. 'listing_filter_button':'listing_filter_button'|trans,
  217. 'filter_show_more': 'filter_show_more'|trans,
  218. 'filter_show_less': 'filter_show_less'|trans,
  219. 'listing_sorting': 'listing_sorting'|trans,
  220. 'listing_filter_active_filter_reset' : 'listing_filter_active_filter_reset'|trans,
  221. 'reset': 'reset' | trans,
  222. 'product_sku': 'product_sku'|trans,
  223. 'category_label': 'category_label'|trans,
  224. 'header_search_products': 'header_search_products'|trans,
  225. 'header_search_suggest_terms': 'header_search_suggest_terms'|trans,
  226. 'header_search_categories': 'header_search_categories'|trans,
  227. 'header_search_placeholder': 'header_search_placeholder'|trans,
  228. 'show_more_options': 'show_more_options'|trans,
  229. 'show_less_options': 'show_less_options'|trans,
  230. 'product_this': 'product_this'|trans,
  231. 'product_similar': 'product_similar'|trans,
  232. 'product_show': 'product_show'|trans,
  233. 'compare_products': 'compare_products'|trans,
  234. 'show_more': 'show_more'|trans,
  235. 'show_less': 'show_less'|trans,
  236. 'pagination_product_counter': 'pagination_product_counter'|trans,
  237. 'successful': 'successful'|trans,
  238. 'quantity': 'offcanvas_cart_line_item_quantity'|trans,
  239. 'add_to_basket_successfully': 'add_to_basket_successfully'|trans,
  240. 'add_to_basket': 'add_to_basket'|trans,
  241. 'menu': 'mobile_menu_title'|trans,
  242. 'next': 'next'|trans,
  243. 'search': 'search'|trans,
  244. 'close': 'close'|trans
  245. } %}
  246. {# ️️️⚠️ ↑↑↑: When adding a new snippet, update the TypeScript declaration as well! ↑↑↑ ⚠️️ #}
  247. {% block javascriptTranslations %}
  248. {# This block and the above variable jsTranslations is now extendable, like this:
  249. {% block javascriptTranslations %}
  250. {% set jsTranslations = jsTranslations|merge({
  251. 'NEW_ENTRY': 'NEW_ENTRY'|trans,
  252. }) %}
  253. {{ parent() }}
  254. {% endblock %}
  255. #}
  256. window.translations = {{ jsTranslations|json_encode|raw }};
  257. window.currentLocaleWithHyphen = '{{ storeContext.localeInfo.getCurrentLocaleWithHyphen }}'
  258. window.currencyCode = '{{ 0|currencyCode }}'
  259. window.storeKey = '{{ storeKey() }}'
  260. window.storeAlias = '{{ storeContext.getAlias }}'
  261. {# window.environmentShortString = '{{ environmentShortString() }}' #}
  262. {% endblock %}
  263. window.controllerUrls = {
  264. 'urlAddToShoppingList': '{{ path('app_shopping_list_add') }}',
  265. 'urlRemoveFromShoppingList': '{{ path('app_shopping_list_remove') }}',
  266. 'current': '{{ app.request.uri }}',
  267. 'cart': '{{ path('checkout_cart_index') }}',
  268. 'cartCount': '{{ path('checkout_cart_get_items_count') }}',
  269. 'directOrder': '{{ path('checkout_cart_index') }}?directOrder=true',
  270. 'categoryTree': '{{ path('app_get_category_tree') }}',
  271. 'urlService': '{{ app.request.server.get('URLSERVICE') }}',
  272. 'imageService': '{{ app.request.server.get('IMAGESERVICE') }}',
  273. 'currentLanguage': '{{ storeContext.localeInfo.currentLocale|default }}',
  274. 'defaultLanguage': '{{ storeContext.localeInfo.defaultLocale|default }}',
  275. 'academyApiUrl': '{{ app.request.server.get('ACADEMYSERVICE')|default }}',
  276. 'productAttributeLabel': '{{ path('app_get_product_attribute_label_by_key') }}',
  277. 'productSkusByPriceChannel': '{{ path('app_get_product_skus_by_channel') }}',
  278. 'loadMenuSlot': '{{ path('app_get_menu_slot') }}',
  279. 'loggingUrl': '{{ path('checkout_order_logging') }}'
  280. }
  281. {# ️️️⚠️ ↑↑↑: When adding a new URL, update the TypeScript declaration as well! ↑↑↑ ⚠️️ #}
  282. window.useUsSkuPattern = Boolean({{ storeContext.isAmericaSkuFormat|default(0) }});
  283. /** @type {boolean} */
  284. window.isPreview = {% if app.getRequest().attributes.get('storyblok_preview') %}true{% else %}false{% endif %};
  285. {% if app.request.cookies.get("isPunchout") == "oci" or app.request.cookies.get("isPunchout") == "cxml" %}
  286. window.isPunchout = true;
  287. window.priceChannel = '{{ storeContext.getPriceChannelId }}';
  288. {% endif %}
  289. </script>
  290. {{ encore_entry_script_tags('app') }}
  291. {{ encore_entry_script_tags('friendly-captcha-v2', null, '_default', {
  292. type: 'module',
  293. async: true,
  294. defer: true
  295. }) }}
  296. {% endblock %}
  297. {% block structuredData %}
  298. {% include('components/atoms/structured-data/structured-data.html.twig') with {
  299. 'structuredData': 'structured_data_default'|trans
  300. } %}
  301. {% endblock %}
  302. </body>
  303. </html>