var/cache/dev/twig/dd/dda7da6894eda95ed95dd2cf6958ee5d.php line 51

Open in your IDE?
  1. <?php
  2. use Twig\Environment;
  3. use Twig\Error\LoaderError;
  4. use Twig\Error\RuntimeError;
  5. use Twig\Extension\CoreExtension;
  6. use Twig\Extension\SandboxExtension;
  7. use Twig\MacroNamespace;
  8. use Twig\Markup;
  9. use Twig\Sandbox\SecurityError;
  10. use Twig\Sandbox\SecurityNotAllowedTagError;
  11. use Twig\Sandbox\SecurityNotAllowedFilterError;
  12. use Twig\Sandbox\SecurityNotAllowedFunctionError;
  13. use Twig\Sandbox\SecurityNotAllowedTestError;
  14. use Twig\Source;
  15. use Twig\Template;
  16. use Twig\TemplateWrapper;
  17. /* page/product/details.html.twig */
  18. class __TwigTemplate_b1249f25bf47e6baff97d58f15aa1487 extends Template
  19. {
  20. private Source $source;
  21. /**
  22. * @var array<string, MacroNamespace>
  23. */
  24. private array $macros = [];
  25. private \Twig\Runtime\EscaperRuntime $escaper;
  26. public function __construct(Environment $env)
  27. {
  28. parent::__construct($env);
  29. $this->source = $this->getSourceContext();
  30. $this->escaper = $env->getRuntime('Twig\Runtime\EscaperRuntime');
  31. $this->blocks = [
  32. 'page_title' => [$this, 'block_page_title'],
  33. 'head_custom_stylesheets' => [$this, 'block_head_custom_stylesheets'],
  34. 'content' => [$this, 'block_content'],
  35. 'body_javascript' => [$this, 'block_body_javascript'],
  36. ];
  37. }
  38. protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
  39. {
  40. // line 1
  41. return $this->parent ??= $this->load("base.html.twig", 1);
  42. }
  43. protected function doDisplay(array $context, array $blocks = []): iterable
  44. {
  45. $macros = $this->macros;
  46. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  47. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "page/product/details.html.twig"));
  48. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  49. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "page/product/details.html.twig"));
  50. $this->parent = $this->load("base.html.twig", 1);
  51. yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));
  52. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  53. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  54. }
  55. // line 3
  56. /**
  57. * @return iterable<null|scalar|\Stringable>
  58. */
  59. public function block_page_title(array $context, array $blocks = []): iterable
  60. {
  61. $macros = $this->macros;
  62. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  63. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "page_title"));
  64. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  65. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "page_title"));
  66. // line 4
  67. yield " ";
  68. yield (string) $this->escaper->escape(Twig\Extension\CoreExtension::striptags($this->env->getRuntime('App\Twig\TextResolverRuntime')->resolve("storefront.title")), "html", null, true);
  69. yield " | ";
  70. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 4, $this->source); })()), "name", [], "any", false, false, false, 4), "html", null, true);
  71. yield "
  72. ";
  73. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  74. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  75. return; yield;
  76. }
  77. // line 7
  78. /**
  79. * @return iterable<null|scalar|\Stringable>
  80. */
  81. public function block_head_custom_stylesheets(array $context, array $blocks = []): iterable
  82. {
  83. $macros = $this->macros;
  84. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  85. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "head_custom_stylesheets"));
  86. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  87. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "head_custom_stylesheets"));
  88. // line 8
  89. yield " ";
  90. yield (string) $this->extensions['Symfony\WebpackEncoreBundle\Twig\EntryFilesTwigExtension']->renderWebpackLinkTags("product-card");
  91. yield "
  92. ";
  93. // line 9
  94. yield (string) $this->extensions['Symfony\WebpackEncoreBundle\Twig\EntryFilesTwigExtension']->renderWebpackLinkTags("products");
  95. yield "
  96. ";
  97. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  98. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  99. return; yield;
  100. }
  101. // line 12
  102. /**
  103. * @return iterable<null|scalar|\Stringable>
  104. */
  105. public function block_content(array $context, array $blocks = []): iterable
  106. {
  107. $macros = $this->macros;
  108. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  109. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "content"));
  110. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  111. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "content"));
  112. // line 13
  113. yield " ";
  114. $context["productConfig"] = $this->extensions['App\Twig\AppExtension']->jsonDecode(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 13, $this->source); })()), "config", [], "any", false, false, false, 13));
  115. // line 14
  116. yield " <div class=\"container-3xl my-5\">
  117. <div class=\"row\">
  118. <div class=\"col-12 d-lg-none\">
  119. <h1 class=\"ornament mb-4\">";
  120. // line 17
  121. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 17, $this->source); })()), "name", [], "any", false, false, false, 17), "html", null, true);
  122. yield "</h1>
  123. </div>
  124. <div class=\"col-12 col-lg-8 col-xl-6 order-2 order-lg-1\">
  125. <h1 class=\"ornament mb-4 d-none d-lg-block\">";
  126. // line 20
  127. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 20, $this->source); })()), "name", [], "any", false, false, false, 20), "html", null, true);
  128. yield "</h1>
  129. <p>";
  130. // line 21
  131. yield (string) CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 21, $this->source); })()), "description", [], "any", false, false, false, 21);
  132. yield "</p>
  133. <ul id=\"product-config\" class=\"my-4\">
  134. ";
  135. // line 23
  136. if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 23, $this->source); })()), "kim_addresses_included", [], "any", false, false, false, 23)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  137. // line 24
  138. yield " <li>
  139. ";
  140. // line 25
  141. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 25, $this->source); })()), "kim_addresses", [], "any", false, false, false, 25), "quantity", [], "any", false, false, false, 25), "html", null, true);
  142. yield "x KIM Adressen
  143. </li>
  144. ";
  145. }
  146. // line 28
  147. yield " ";
  148. if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 28, $this->source); })()), "hardware_included", [], "any", false, false, false, 28)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  149. // line 29
  150. yield " ";
  151. $context['_parent'] = $context;
  152. $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 29, $this->source); })()), "hardware", [], "any", false, false, false, 29));
  153. foreach ($context['_seq'] as $context["_key"] => $context["hardware"]) {
  154. // line 30
  155. yield " ";
  156. if ((CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "quantity", [], "any", false, false, false, 30) > 0)) {
  157. // line 31
  158. yield " <li>
  159. ";
  160. // line 32
  161. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "quantity", [], "any", false, false, false, 32), "html", null, true);
  162. yield "x ";
  163. yield (string) $this->env->getRuntime('App\Twig\TextResolverRuntime')->resolve(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "hardware", [], "any", false, false, false, 32));
  164. yield "
  165. </li>
  166. ";
  167. }
  168. // line 35
  169. yield " ";
  170. }
  171. $_parent = $context['_parent'];
  172. unset($context['_seq'], $context['_key'], $context['hardware'], $context['_parent']);
  173. $context = array_intersect_key($context, $_parent);
  174. $context += $_parent;
  175. // line 36
  176. yield " ";
  177. }
  178. // line 37
  179. yield " </ul>
  180. <form name=\"product-form\">
  181. <div class=\"row\">
  182. ";
  183. // line 40
  184. if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 40, $this->source); })()), "kim_addresses_included", [], "any", false, false, false, 40)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  185. // line 41
  186. yield " ";
  187. $context["quantity"] = CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 41, $this->source); })()), "kim_addresses", [], "any", false, false, false, 41), "quantity", [], "any", false, false, false, 41);
  188. // line 42
  189. yield " <div class=\"col-12\">
  190. <div class=\"bg-lightgrey p-3 p-xl-5\">
  191. <h3>KIM Mail</h3>
  192. <p>Reserviere deine KIM-Adresse";
  193. // line 45
  194. yield (string) ((((isset($context["quantity"]) || array_key_exists("quantity", $context) ? $context["quantity"] : (function () { throw new RuntimeError('Variable "quantity" does not exist.', 45, $this->source); })()) > 1)) ? ("n") : (""));
  195. yield ".</p>
  196. <div id=\"kimAddresses\">
  197. ";
  198. // line 47
  199. $context['_parent'] = $context;
  200. $context['_seq'] = CoreExtension::ensureTraversable(range(1, (isset($context["quantity"]) || array_key_exists("quantity", $context) ? $context["quantity"] : (function () { throw new RuntimeError('Variable "quantity" does not exist.', 47, $this->source); })())));
  201. $context['loop'] = [
  202. 'parent' => $context['_parent'],
  203. 'index0' => 0,
  204. 'index' => 1,
  205. 'first' => true,
  206. ];
  207. if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  208. $length = count($context['_seq']);
  209. $context['loop']['revindex0'] = $length - 1;
  210. $context['loop']['revindex'] = $length;
  211. $context['loop']['length'] = $length;
  212. $context['loop']['last'] = 1 === $length;
  213. }
  214. foreach ($context['_seq'] as $context["_key"] => $context["i"]) {
  215. // line 48
  216. yield " <div id=\"kim_address_result_";
  217. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 48), "html", null, true);
  218. yield "\" class=\"d-none w-100 mb-3\"></div>
  219. <div class=\"row\">
  220. <div class=\"input-group mb-4 mb-md-3\">
  221. <input
  222. id=\"kim_address_";
  223. // line 52
  224. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 52), "html", null, true);
  225. yield "\"
  226. name=\"kim_address[";
  227. // line 53
  228. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 53), "html", null, true);
  229. yield "]\"
  230. type=\"text\"
  231. class=\"col-12 col-md-5 form-control border-0\"
  232. placeholder=\"Kim Muster\"
  233. aria-label=\"Kim Adresse\"
  234. aria-describedby=\"kim_address_";
  235. // line 58
  236. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 58), "html", null, true);
  237. yield "\"
  238. data-domain=\"";
  239. // line 59
  240. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 59, $this->source); })()), "kim_addresses", [], "any", false, false, false, 59), "domain", [], "any", false, false, false, 59), "html", null, true);
  241. yield "\"
  242. data-type=\"kim\"
  243. data-included=\"true\"
  244. data-reserved=\"false\"
  245. >
  246. <span class=\"col-12 col-md-5 input-group-text border-0 bg-accent-grey\" id=\"kim_address_";
  247. // line 64
  248. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 64), "html", null, true);
  249. yield "\">";
  250. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 64, $this->source); })()), "kim_addresses", [], "any", false, false, false, 64), "domain", [], "any", false, false, false, 64), "html", null, true);
  251. yield "</span>
  252. <button
  253. class=\"col-12 col-md-2 button accent\"
  254. type=\"button\"
  255. data-type=\"check\"
  256. data-target=\"kim_address_";
  257. // line 69
  258. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 69), "html", null, true);
  259. yield "\"
  260. data-result=\"kim_address_result_";
  261. // line 70
  262. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 70), "html", null, true);
  263. yield "\"
  264. >
  265. Prüfen
  266. </button>
  267. <button
  268. class=\"col-12 col-md-2 button accent d-none\"
  269. type=\"button\"
  270. data-type=\"reserve\"
  271. data-target=\"kim_address_";
  272. // line 79
  273. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 79), "html", null, true);
  274. yield "\"
  275. data-result=\"kim_address_result_";
  276. // line 80
  277. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["loop"], "index0", [], "any", false, false, false, 80), "html", null, true);
  278. yield "\"
  279. disabled=\"disabled\"
  280. >
  281. Reservieren
  282. </button>
  283. </div>
  284. </div>
  285. ";
  286. ++$context['loop']['index0'];
  287. ++$context['loop']['index'];
  288. $context['loop']['first'] = false;
  289. if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  290. --$context['loop']['revindex0'];
  291. --$context['loop']['revindex'];
  292. $context['loop']['last'] = 0 === $context['loop']['revindex0'];
  293. }
  294. }
  295. $_parent = $context['_parent'];
  296. unset($context['_seq'], $context['_key'], $context['i'], $context['_parent'], $context['loop']);
  297. $context = array_intersect_key($context, $_parent);
  298. $context += $_parent;
  299. // line 88
  300. yield " </div>
  301. ";
  302. // line 89
  303. if ((($tmp = $this->env->getRuntime('App\Twig\ProductRuntime')->hasKimPrices(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 89, $this->source); })()), "id", [], "any", false, false, false, 89))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  304. // line 90
  305. yield " <template id=\"kimAddressTemplate\">
  306. <div id=\"kim_address_result_\" class=\"d-none w-100 mb-3\"></div>
  307. <div class=\"row\">
  308. <div class=\"input-group mb-3 mb-md-3\">
  309. <button class=\"col-6 col-md-1 order-3 order-md-1 d-flex justify-content-center align-items-center d-md-block btn btn-outline-secondary\" type=\"button\" data-type=\"remove\">
  310. <i class=\"fas fa-trash\"></i>
  311. <span class=\"d-block ms-2 ms-md-0 d-md-none\">löschen</span>
  312. </button>
  313. <input
  314. id=\"kim_address_\"
  315. name=\"kim_address[]\"
  316. type=\"text\"
  317. class=\"col-12 col-md-5 order-1 order-md-2 form-control border-0\"
  318. placeholder=\"Kim Muster\"
  319. aria-label=\"Kim Adresse\"
  320. data-domain=\"";
  321. // line 105
  322. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 105, $this->source); })()), "kim_addresses", [], "any", false, false, false, 105), "domain", [], "any", false, false, false, 105), "html", null, true);
  323. yield "\"
  324. data-type=\"kim\"
  325. data-included=\"false\"
  326. data-price=\"";
  327. // line 108
  328. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 108, $this->source); })()), "kim_addresses", [], "any", false, false, false, 108), "price", [], "any", false, false, false, 108), "html", null, true);
  329. yield "\"
  330. data-reserved=\"false\"
  331. >
  332. <span class=\"col-12 col-md-5 order-2 order-md-3 input-group-text bg-accent-grey\" id=\"kim_address_\">";
  333. // line 111
  334. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 111, $this->source); })()), "kim_addresses", [], "any", false, false, false, 111), "domain", [], "any", false, false, false, 111), "html", null, true);
  335. yield "</span>
  336. <button
  337. class=\"col-6 col-md-2 order-4 button accent button-border-right d-block\"
  338. type=\"button\"
  339. data-type=\"check\"
  340. >
  341. Prüfen
  342. </button>
  343. <button
  344. class=\"col-12 col-md-2 order-4 button accent d-none\"
  345. type=\"button\"
  346. data-type=\"reserve\"
  347. disabled=\"disabled\"
  348. >
  349. Reservieren
  350. </button>
  351. </div>
  352. </div>
  353. </template>
  354. <button id=\"addAdditionalKimAddress\" class=\"button outlined darkblue w-100\" type=\"button\"><i class=\"fas fa-plus me-2\"></i> weitere hinzufügen</button>
  355. ";
  356. }
  357. // line 133
  358. yield " </div>
  359. </div>
  360. ";
  361. }
  362. // line 136
  363. yield " </div>
  364. ";
  365. // line 138
  366. if ((($tmp = $this->env->getRuntime('App\Twig\ProductRuntime')->hasHardwarePrices(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 138, $this->source); })()), "id", [], "any", false, false, false, 138))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  367. // line 139
  368. yield " <div class=\"product-addons mt-5\">
  369. <div class=\"row\">
  370. <div class=\"col-12\">
  371. <h1 class=\"ornament-with-child\">";
  372. // line 142
  373. yield (string) $this->env->getRuntime('App\Twig\TextResolverRuntime')->resolve("product.details.addon.headline");
  374. yield "</h1>
  375. <p>";
  376. // line 143
  377. yield (string) $this->env->getRuntime('App\Twig\TextResolverRuntime')->resolve("product.details.addon.subline");
  378. yield "</p>
  379. </div>
  380. </div>
  381. <div data-match-height-group=\"product-addons-group\" class=\"row g-3 match-height-product-addon\">
  382. ";
  383. // line 147
  384. if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 147, $this->source); })()), "hardware_included", [], "any", false, false, false, 147)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  385. // line 148
  386. yield " ";
  387. $context['_parent'] = $context;
  388. $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, (isset($context["productConfig"]) || array_key_exists("productConfig", $context) ? $context["productConfig"] : (function () { throw new RuntimeError('Variable "productConfig" does not exist.', 148, $this->source); })()), "hardware", [], "any", false, false, false, 148));
  389. foreach ($context['_seq'] as $context["_key"] => $context["hardware"]) {
  390. // line 149
  391. yield " ";
  392. if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "has_own_price", [], "any", false, false, false, 149)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  393. // line 150
  394. yield " <div class=\"col-12 col-sm-6 col-xl-4\">
  395. <div
  396. class=\"addon d-flex flex-column justify-content-between bg-accent p-4\"
  397. ";
  398. // line 153
  399. yield (string) $this->extensions['Symfony\UX\StimulusBundle\Twig\StimulusTwigExtension']->renderStimulusController("product");
  400. yield "
  401. data-product-max-value=\"99\"
  402. data-product-min-value=\"0\"
  403. >
  404. <div class=\"card-body p-0\">
  405. <h5 class=\"card-title\">";
  406. // line 158
  407. yield (string) $this->env->getRuntime('App\Twig\TextResolverRuntime')->resolve(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "hardware", [], "any", false, false, false, 158));
  408. yield "</h5>
  409. ";
  410. // line 159
  411. if ((CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "price", [], "any", false, false, false, 159) > 0)) {
  412. // line 160
  413. yield " <p>";
  414. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "price", [], "any", false, false, false, 160), "html", null, true);
  415. yield " €</p>
  416. ";
  417. }
  418. // line 162
  419. yield " <img class=\"d-block mx-auto pb-5\" width=\"100\" src=\"";
  420. yield (string) $this->escaper->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("build/images/icons/icon_tiproduct.svg"), "html", null, true);
  421. yield "\" alt=\"\">
  422. </div>
  423. <div class=\"card-footer p-0\">
  424. <div class=\"input-group\">
  425. <button
  426. type=\"button\"
  427. class=\"btn btn-dark btn-number\"
  428. ";
  429. // line 169
  430. yield (string) $this->extensions['Symfony\UX\StimulusBundle\Twig\StimulusTwigExtension']->renderStimulusAction("product", "decreaseValue");
  431. yield "
  432. >
  433. <i class=\"fas fa-minus\"></i>
  434. </button>
  435. <input
  436. type=\"number\"
  437. name=\"hardware[";
  438. // line 176
  439. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "hardware", [], "any", false, false, false, 176), "html", null, true);
  440. yield "]\"
  441. class=\"form-control fw-bold\"
  442. data-type=\"addon\"
  443. data-item-number=\"";
  444. // line 179
  445. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "hardware", [], "any", false, false, false, 179), "html", null, true);
  446. yield "\"
  447. data-price=\"";
  448. // line 180
  449. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "price", [], "any", false, false, false, 180), "html", null, true);
  450. yield "\"
  451. placeholder=\"Anzahl\"
  452. aria-label=\"Anzahl\"
  453. aria-describedby=\"hardware_";
  454. // line 183
  455. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["hardware"], "hardware", [], "any", false, false, false, 183), "html", null, true);
  456. yield "\"
  457. value=\"0\"
  458. min=\"0\"
  459. ";
  460. // line 186
  461. yield (string) $this->extensions['Symfony\UX\StimulusBundle\Twig\StimulusTwigExtension']->renderStimulusTarget("product", "quantity");
  462. yield "
  463. >
  464. <button
  465. type=\"button\"
  466. class=\"btn btn-dark btn-number\"
  467. ";
  468. // line 192
  469. yield (string) $this->extensions['Symfony\UX\StimulusBundle\Twig\StimulusTwigExtension']->renderStimulusAction("product", "increaseValue");
  470. yield "
  471. >
  472. <i class=\"fas fa-plus\"></i>
  473. </button>
  474. </div>
  475. </div>
  476. </div>
  477. </div>
  478. ";
  479. }
  480. // line 201
  481. yield " ";
  482. }
  483. $_parent = $context['_parent'];
  484. unset($context['_seq'], $context['_key'], $context['hardware'], $context['_parent']);
  485. $context = array_intersect_key($context, $_parent);
  486. $context += $_parent;
  487. // line 202
  488. yield " ";
  489. }
  490. // line 203
  491. yield " </div>
  492. </div>
  493. ";
  494. }
  495. // line 206
  496. yield "
  497. <div class=\"row mb-5 mt-2\">
  498. <div class=\"col-12 text-center\">
  499. <hr>
  500. <h1>";
  501. // line 210
  502. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 210, $this->source); })()), "name", [], "any", false, false, false, 210), "html", null, true);
  503. yield "</h1>
  504. ";
  505. // line 211
  506. if ((CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 211, $this->source); })()), "price", [], "any", false, false, false, 211) > 0)) {
  507. // line 212
  508. yield " <h1>";
  509. yield (string) $this->escaper->escape($this->extensions['Twig\Extra\Intl\IntlExtension']->formatCurrency(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 212, $this->source); })()), "price", [], "any", false, false, false, 212), "EUR", [], "de"), "html", null, true);
  510. yield " *</h1>
  511. ";
  512. }
  513. // line 214
  514. yield " ";
  515. if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 214, $this->source); })()), "recurringPrice", [], "any", false, false, false, 214)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  516. // line 215
  517. yield " <h2>";
  518. yield (string) $this->escaper->escape($this->extensions['Twig\Extra\Intl\IntlExtension']->formatCurrency(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 215, $this->source); })()), "recurringPrice", [], "any", false, false, false, 215), "EUR", [], "de"), "html", null, true);
  519. yield " / mtl.</h2>
  520. ";
  521. }
  522. // line 217
  523. yield " <p>";
  524. yield (string) $this->env->getRuntime('App\Twig\TextResolverRuntime')->resolve("product.details.page.button.star");
  525. yield "</p>
  526. </div>
  527. <div class=\"col-12\">
  528. <div class=\"mx-5\">
  529. <button
  530. ";
  531. // line 222
  532. yield (string) $this->extensions['Symfony\UX\StimulusBundle\Twig\StimulusTwigExtension']->renderStimulusController("shopping-cart");
  533. yield "
  534. ";
  535. // line 223
  536. yield (string) $this->extensions['Symfony\UX\StimulusBundle\Twig\StimulusTwigExtension']->renderStimulusAction("shopping-cart", "addProductToCart");
  537. yield "
  538. data-shopping-cart-product-id-value=\"";
  539. // line 224
  540. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 224, $this->source); })()), "id", [], "any", false, false, false, 224), "html", null, true);
  541. yield "\"
  542. class=\"button accent w-100\">
  543. ";
  544. // line 226
  545. yield (string) $this->env->getRuntime('App\Twig\TextResolverRuntime')->resolve("product.details.page.button.buy");
  546. yield "
  547. </button>
  548. </div>
  549. <hr>
  550. </div>
  551. </div>
  552. </form>
  553. </div>
  554. <div class=\"col-12 col-md-6 col-lg-4 col-xl-6 order-1 order-lg-1 mb-5 mb-lg-0\">
  555. <div class=\"product-slider\">
  556. <div style=\"--swiper-navigation-color: var(--ti-accent); --swiper-pagination-color: var(--ti-accent)\" class=\"swiper product-slider-main-view\">
  557. <div class=\"swiper-wrapper\">
  558. ";
  559. // line 238
  560. $context['_parent'] = $context;
  561. $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 238, $this->source); })()), "images", [], "any", false, false, false, 238));
  562. foreach ($context['_seq'] as $context["_key"] => $context["image"]) {
  563. // line 239
  564. yield " <div class=\"swiper-slide\">
  565. <img src=\"/images/";
  566. // line 240
  567. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["image"], "image", [], "any", false, false, false, 240), "html", null, true);
  568. yield "\">
  569. </div>
  570. ";
  571. }
  572. $_parent = $context['_parent'];
  573. unset($context['_seq'], $context['_key'], $context['image'], $context['_parent']);
  574. $context = array_intersect_key($context, $_parent);
  575. $context += $_parent;
  576. // line 243
  577. yield " </div>
  578. ";
  579. // line 245
  580. if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 245, $this->source); })()), "images", [], "any", false, false, false, 245)) > 1)) {
  581. // line 246
  582. yield " <div class=\"swiper-button-next\"></div>
  583. <div class=\"swiper-button-prev\"></div>
  584. ";
  585. }
  586. // line 249
  587. yield " </div>
  588. ";
  589. // line 250
  590. if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 250, $this->source); })()), "images", [], "any", false, false, false, 250)) > 1)) {
  591. // line 251
  592. yield " <div thumbsSlider=\"\" class=\"swiper product-slider-thumbnails-view\">
  593. <div class=\"swiper-wrapper\">
  594. ";
  595. // line 253
  596. $context['_parent'] = $context;
  597. $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, (isset($context["product"]) || array_key_exists("product", $context) ? $context["product"] : (function () { throw new RuntimeError('Variable "product" does not exist.', 253, $this->source); })()), "images", [], "any", false, false, false, 253));
  598. foreach ($context['_seq'] as $context["_key"] => $context["image"]) {
  599. // line 254
  600. yield " <div class=\"swiper-slide\">
  601. <img src=\"/images/";
  602. // line 255
  603. yield (string) $this->escaper->escape(CoreExtension::getAttribute($this->env, $this->source, $context["image"], "image", [], "any", false, false, false, 255), "html", null, true);
  604. yield "\">
  605. </div>
  606. ";
  607. }
  608. $_parent = $context['_parent'];
  609. unset($context['_seq'], $context['_key'], $context['image'], $context['_parent']);
  610. $context = array_intersect_key($context, $_parent);
  611. $context += $_parent;
  612. // line 258
  613. yield " </div>
  614. </div>
  615. ";
  616. }
  617. // line 261
  618. yield " </div>
  619. </div>
  620. </div>
  621. </div>
  622. ";
  623. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  624. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  625. return; yield;
  626. }
  627. // line 267
  628. /**
  629. * @return iterable<null|scalar|\Stringable>
  630. */
  631. public function block_body_javascript(array $context, array $blocks = []): iterable
  632. {
  633. $macros = $this->macros;
  634. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  635. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body_javascript"));
  636. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  637. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body_javascript"));
  638. // line 268
  639. yield " ";
  640. yield (string) $this->extensions['Symfony\WebpackEncoreBundle\Twig\EntryFilesTwigExtension']->renderWebpackScriptTags("product");
  641. yield "
  642. ";
  643. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  644. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  645. return; yield;
  646. }
  647. /**
  648. * @codeCoverageIgnore
  649. */
  650. public function getTemplateName(): string
  651. {
  652. return "page/product/details.html.twig";
  653. }
  654. /**
  655. * @codeCoverageIgnore
  656. */
  657. public function isTraitable(): bool
  658. {
  659. return false;
  660. }
  661. /**
  662. * @codeCoverageIgnore
  663. */
  664. public function getDefaultEscapeStrategy(): string|false
  665. {
  666. return "html";
  667. }
  668. /**
  669. * @codeCoverageIgnore
  670. */
  671. public function getDebugInfo(): array
  672. {
  673. return array ( 683 => 268, 670 => 267, 655 => 261, 650 => 258, 640 => 255, 637 => 254, 633 => 253, 629 => 251, 627 => 250, 624 => 249, 619 => 246, 617 => 245, 613 => 243, 603 => 240, 600 => 239, 596 => 238, 581 => 226, 576 => 224, 572 => 223, 568 => 222, 559 => 217, 553 => 215, 550 => 214, 544 => 212, 542 => 211, 538 => 210, 532 => 206, 527 => 203, 524 => 202, 517 => 201, 505 => 192, 496 => 186, 490 => 183, 484 => 180, 480 => 179, 474 => 176, 464 => 169, 453 => 162, 447 => 160, 445 => 159, 441 => 158, 433 => 153, 428 => 150, 425 => 149, 420 => 148, 418 => 147, 411 => 143, 407 => 142, 402 => 139, 400 => 138, 396 => 136, 391 => 133, 366 => 111, 360 => 108, 354 => 105, 337 => 90, 335 => 89, 332 => 88, 309 => 80, 305 => 79, 293 => 70, 289 => 69, 279 => 64, 271 => 59, 267 => 58, 259 => 53, 255 => 52, 247 => 48, 230 => 47, 225 => 45, 220 => 42, 217 => 41, 215 => 40, 210 => 37, 207 => 36, 200 => 35, 192 => 32, 189 => 31, 186 => 30, 181 => 29, 178 => 28, 172 => 25, 169 => 24, 167 => 23, 162 => 21, 158 => 20, 152 => 17, 147 => 14, 144 => 13, 131 => 12, 118 => 9, 113 => 8, 100 => 7, 84 => 4, 71 => 3, 48 => 1,);
  674. }
  675. public function getSourceContext(): Source
  676. {
  677. return new Source("{% extends \x27base.html.twig\x27 %}
  678. {% block page_title %}
  679. {{ \x27storefront.title\x27|resolve|striptags }} | {{ product.name }}
  680. {% endblock %}
  681. {% block head_custom_stylesheets %}
  682. {{ encore_entry_link_tags(\x27product-card\x27) }}
  683. {{ encore_entry_link_tags(\x27products\x27) }}
  684. {% endblock head_custom_stylesheets %}
  685. {% block content %}
  686. {% set productConfig = product.config|json_decode %}
  687. <div class=\"container-3xl my-5\">
  688. <div class=\"row\">
  689. <div class=\"col-12 d-lg-none\">
  690. <h1 class=\"ornament mb-4\">{{ product.name }}</h1>
  691. </div>
  692. <div class=\"col-12 col-lg-8 col-xl-6 order-2 order-lg-1\">
  693. <h1 class=\"ornament mb-4 d-none d-lg-block\">{{ product.name }}</h1>
  694. <p>{{ product.description|raw }}</p>
  695. <ul id=\"product-config\" class=\"my-4\">
  696. {% if productConfig.kim_addresses_included %}
  697. <li>
  698. {{ productConfig.kim_addresses.quantity }}x KIM Adressen
  699. </li>
  700. {% endif %}
  701. {% if productConfig.hardware_included %}
  702. {% for hardware in productConfig.hardware %}
  703. {% if hardware.quantity > 0 %}
  704. <li>
  705. {{ hardware.quantity }}x {{ hardware.hardware|resolve }}
  706. </li>
  707. {% endif %}
  708. {% endfor %}
  709. {% endif %}
  710. </ul>
  711. <form name=\"product-form\">
  712. <div class=\"row\">
  713. {% if productConfig.kim_addresses_included %}
  714. {% set quantity = productConfig.kim_addresses.quantity %}
  715. <div class=\"col-12\">
  716. <div class=\"bg-lightgrey p-3 p-xl-5\">
  717. <h3>KIM Mail</h3>
  718. <p>Reserviere deine KIM-Adresse{{ (quantity > 1) ? \x27n\x27 : \x27\x27 }}.</p>
  719. <div id=\"kimAddresses\">
  720. {% for i in range(1, quantity) %}
  721. <div id=\"kim_address_result_{{ loop.index0 }}\" class=\"d-none w-100 mb-3\"></div>
  722. <div class=\"row\">
  723. <div class=\"input-group mb-4 mb-md-3\">
  724. <input
  725. id=\"kim_address_{{ loop.index0 }}\"
  726. name=\"kim_address[{{ loop.index0 }}]\"
  727. type=\"text\"
  728. class=\"col-12 col-md-5 form-control border-0\"
  729. placeholder=\"Kim Muster\"
  730. aria-label=\"Kim Adresse\"
  731. aria-describedby=\"kim_address_{{ loop.index0 }}\"
  732. data-domain=\"{{ productConfig.kim_addresses.domain }}\"
  733. data-type=\"kim\"
  734. data-included=\"true\"
  735. data-reserved=\"false\"
  736. >
  737. <span class=\"col-12 col-md-5 input-group-text border-0 bg-accent-grey\" id=\"kim_address_{{ loop.index0 }}\">{{ productConfig.kim_addresses.domain }}</span>
  738. <button
  739. class=\"col-12 col-md-2 button accent\"
  740. type=\"button\"
  741. data-type=\"check\"
  742. data-target=\"kim_address_{{ loop.index0 }}\"
  743. data-result=\"kim_address_result_{{ loop.index0 }}\"
  744. >
  745. Prüfen
  746. </button>
  747. <button
  748. class=\"col-12 col-md-2 button accent d-none\"
  749. type=\"button\"
  750. data-type=\"reserve\"
  751. data-target=\"kim_address_{{ loop.index0 }}\"
  752. data-result=\"kim_address_result_{{ loop.index0 }}\"
  753. disabled=\"disabled\"
  754. >
  755. Reservieren
  756. </button>
  757. </div>
  758. </div>
  759. {% endfor %}
  760. </div>
  761. {% if has_kim_prices(product.id) %}
  762. <template id=\"kimAddressTemplate\">
  763. <div id=\"kim_address_result_\" class=\"d-none w-100 mb-3\"></div>
  764. <div class=\"row\">
  765. <div class=\"input-group mb-3 mb-md-3\">
  766. <button class=\"col-6 col-md-1 order-3 order-md-1 d-flex justify-content-center align-items-center d-md-block btn btn-outline-secondary\" type=\"button\" data-type=\"remove\">
  767. <i class=\"fas fa-trash\"></i>
  768. <span class=\"d-block ms-2 ms-md-0 d-md-none\">löschen</span>
  769. </button>
  770. <input
  771. id=\"kim_address_\"
  772. name=\"kim_address[]\"
  773. type=\"text\"
  774. class=\"col-12 col-md-5 order-1 order-md-2 form-control border-0\"
  775. placeholder=\"Kim Muster\"
  776. aria-label=\"Kim Adresse\"
  777. data-domain=\"{{ productConfig.kim_addresses.domain }}\"
  778. data-type=\"kim\"
  779. data-included=\"false\"
  780. data-price=\"{{ productConfig.kim_addresses.price }}\"
  781. data-reserved=\"false\"
  782. >
  783. <span class=\"col-12 col-md-5 order-2 order-md-3 input-group-text bg-accent-grey\" id=\"kim_address_\">{{ productConfig.kim_addresses.domain }}</span>
  784. <button
  785. class=\"col-6 col-md-2 order-4 button accent button-border-right d-block\"
  786. type=\"button\"
  787. data-type=\"check\"
  788. >
  789. Prüfen
  790. </button>
  791. <button
  792. class=\"col-12 col-md-2 order-4 button accent d-none\"
  793. type=\"button\"
  794. data-type=\"reserve\"
  795. disabled=\"disabled\"
  796. >
  797. Reservieren
  798. </button>
  799. </div>
  800. </div>
  801. </template>
  802. <button id=\"addAdditionalKimAddress\" class=\"button outlined darkblue w-100\" type=\"button\"><i class=\"fas fa-plus me-2\"></i> weitere hinzufügen</button>
  803. {% endif %}
  804. </div>
  805. </div>
  806. {% endif %}
  807. </div>
  808. {% if has_hardware_prices(product.id) %}
  809. <div class=\"product-addons mt-5\">
  810. <div class=\"row\">
  811. <div class=\"col-12\">
  812. <h1 class=\"ornament-with-child\">{{ \x27product.details.addon.headline\x27|resolve }}</h1>
  813. <p>{{ \x27product.details.addon.subline\x27|resolve }}</p>
  814. </div>
  815. </div>
  816. <div data-match-height-group=\"product-addons-group\" class=\"row g-3 match-height-product-addon\">
  817. {% if productConfig.hardware_included %}
  818. {% for hardware in productConfig.hardware %}
  819. {% if hardware.has_own_price %}
  820. <div class=\"col-12 col-sm-6 col-xl-4\">
  821. <div
  822. class=\"addon d-flex flex-column justify-content-between bg-accent p-4\"
  823. {{ stimulus_controller(\x27product\x27) }}
  824. data-product-max-value=\"99\"
  825. data-product-min-value=\"0\"
  826. >
  827. <div class=\"card-body p-0\">
  828. <h5 class=\"card-title\">{{ hardware.hardware|resolve }}</h5>
  829. {% if hardware.price > 0 %}
  830. <p>{{ hardware.price }} €</p>
  831. {% endif %}
  832. <img class=\"d-block mx-auto pb-5\" width=\"100\" src=\"{{ asset(\x27build/images/icons/icon_tiproduct.svg\x27) }}\" alt=\"\">
  833. </div>
  834. <div class=\"card-footer p-0\">
  835. <div class=\"input-group\">
  836. <button
  837. type=\"button\"
  838. class=\"btn btn-dark btn-number\"
  839. {{ stimulus_action(\x27product\x27, \x27decreaseValue\x27) }}
  840. >
  841. <i class=\"fas fa-minus\"></i>
  842. </button>
  843. <input
  844. type=\"number\"
  845. name=\"hardware[{{ hardware.hardware }}]\"
  846. class=\"form-control fw-bold\"
  847. data-type=\"addon\"
  848. data-item-number=\"{{ hardware.hardware }}\"
  849. data-price=\"{{ hardware.price }}\"
  850. placeholder=\"Anzahl\"
  851. aria-label=\"Anzahl\"
  852. aria-describedby=\"hardware_{{ hardware.hardware }}\"
  853. value=\"0\"
  854. min=\"0\"
  855. {{ stimulus_target(\x27product\x27, \x27quantity\x27) }}
  856. >
  857. <button
  858. type=\"button\"
  859. class=\"btn btn-dark btn-number\"
  860. {{ stimulus_action(\x27product\x27, \x27increaseValue\x27) }}
  861. >
  862. <i class=\"fas fa-plus\"></i>
  863. </button>
  864. </div>
  865. </div>
  866. </div>
  867. </div>
  868. {% endif %}
  869. {% endfor %}
  870. {% endif %}
  871. </div>
  872. </div>
  873. {% endif %}
  874. <div class=\"row mb-5 mt-2\">
  875. <div class=\"col-12 text-center\">
  876. <hr>
  877. <h1>{{ product.name }}</h1>
  878. {% if (product.price > 0) %}
  879. <h1>{{ product.price|format_currency(\x27EUR\x27, locale=\x27de\x27) }} *</h1>
  880. {% endif %}
  881. {% if (product.recurringPrice) %}
  882. <h2>{{ product.recurringPrice|format_currency(\x27EUR\x27, locale=\x27de\x27) }} / mtl.</h2>
  883. {% endif %}
  884. <p>{{ \x27product.details.page.button.star\x27|resolve }}</p>
  885. </div>
  886. <div class=\"col-12\">
  887. <div class=\"mx-5\">
  888. <button
  889. {{ stimulus_controller(\x27shopping-cart\x27) }}
  890. {{ stimulus_action(\x27shopping-cart\x27, \x27addProductToCart\x27) }}
  891. data-shopping-cart-product-id-value=\"{{ product.id }}\"
  892. class=\"button accent w-100\">
  893. {{ \x27product.details.page.button.buy\x27|resolve }}
  894. </button>
  895. </div>
  896. <hr>
  897. </div>
  898. </div>
  899. </form>
  900. </div>
  901. <div class=\"col-12 col-md-6 col-lg-4 col-xl-6 order-1 order-lg-1 mb-5 mb-lg-0\">
  902. <div class=\"product-slider\">
  903. <div style=\"--swiper-navigation-color: var(--ti-accent); --swiper-pagination-color: var(--ti-accent)\" class=\"swiper product-slider-main-view\">
  904. <div class=\"swiper-wrapper\">
  905. {% for image in product.images %}
  906. <div class=\"swiper-slide\">
  907. <img src=\"/images/{{ image.image }}\">
  908. </div>
  909. {% endfor %}
  910. </div>
  911. {% if (product.images|length > 1) %}
  912. <div class=\"swiper-button-next\"></div>
  913. <div class=\"swiper-button-prev\"></div>
  914. {% endif %}
  915. </div>
  916. {% if (product.images|length > 1) %}
  917. <div thumbsSlider=\"\" class=\"swiper product-slider-thumbnails-view\">
  918. <div class=\"swiper-wrapper\">
  919. {% for image in product.images %}
  920. <div class=\"swiper-slide\">
  921. <img src=\"/images/{{ image.image }}\">
  922. </div>
  923. {% endfor %}
  924. </div>
  925. </div>
  926. {% endif %}
  927. </div>
  928. </div>
  929. </div>
  930. </div>
  931. {% endblock %}
  932. {% block body_javascript %}
  933. {{ encore_entry_script_tags(\x27product\x27) }}
  934. {% endblock body_javascript %}
  935. ", "page/product/details.html.twig", "/srv/storefront/templates/page/product/details.html.twig");
  936. }
  937. }