diff options
| -rw-r--r-- | views/css/wpsg-theme.css | 4 | ||||
| -rw-r--r-- | views/js/frontend.js | 41 | ||||
| -rw-r--r-- | views/produktseite/produkt.phtml | 10 |
3 files changed, 54 insertions, 1 deletions
diff --git a/views/css/wpsg-theme.css b/views/css/wpsg-theme.css index 23f6942..2d9ac93 100644 --- a/views/css/wpsg-theme.css +++ b/views/css/wpsg-theme.css @@ -317,6 +317,10 @@ .wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_produkt_preishinweis) { font-size:0.75em; } .wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productview_oldprice), .product_wrap :where(.productdetails .oldprice) { text-decoration:line-through; } .wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productview_price) { font-weight:bold; } +.wpsg-product :where(.wpsg-product__breadcrumbs) { margin:0 0 var(--wpsg-gap); font-size:var(--wpsg-font-size-small); } +.wpsg-product :where(.wpsg-product__breadcrumbs ol) { display:flex; flex-wrap:wrap; gap:0.25em 0.5em; margin:0; padding:0; list-style:none; } +.wpsg-product :where(.wpsg-product__breadcrumbs li + li)::before { content:"/" / ""; margin-right:0.5em; opacity:var(--wpsg-muted-opacity); } +.wpsg-product :where(.wpsg-product__breadcrumbs a, .wpsg-product__breadcrumbs [aria-current]) { color:inherit; opacity:var(--wpsg-muted-opacity); } .wpsg-product :where(.wpsg-product__main) { display:flex; flex-wrap:wrap; align-items:flex-start; gap:calc(var(--wpsg-gap) * 2.5); } .wpsg-product :where(.wpsg-product__media) { flex:1 1 22rem; min-width:0; float:none; margin:0; } .wpsg-product :where(.wpsg-product__media .wpsg_produkt_produktbilder) { max-width:none; } diff --git a/views/js/frontend.js b/views/js/frontend.js index bfae2ea..fb3bdac 100644 --- a/views/js/frontend.js +++ b/views/js/frontend.js @@ -241,3 +241,44 @@ media.querySelectorAll('.wpsg-product__thumb').forEach(function(button) { button.setAttribute('aria-pressed', ((button === thumb)?'true':'false')); });
} );
+
+ /**
+ * Brotkrumen der Produktseite im Modus „neu“: die Kategorie, von der der Besucher kam (Punkt 8.4)
+ *
+ * Der Server gibt die erste Kategorie aus, damit die Seite für Seiten-Caches gleich bleibt.
+ */
+ function wpsg_productBreadcrumbs() {
+
+ if (!document.referrer) return;
+
+ var referrer = document.referrer.split(/[?#]/)[0].replace(/\/page\/\d+\/?$/, '/').replace(/\/?$/, '/');
+
+ document.querySelectorAll('.wpsg-product__breadcrumbs[data-wpsg-trails]').forEach(function(nav) {
+
+ var trails = JSON.parse(nav.getAttribute('data-wpsg-trails'));
+ var trail = trails.find(function(t) { return (t[t.length - 1].url.replace(/\/?$/, '/') === referrer); });
+ if (!trail) return;
+
+ var list = nav.querySelector('ol');
+ list.querySelectorAll('.wpsg-product__crumb-category').forEach(function(li) { li.remove(); });
+
+ trail.forEach(function(crumb) {
+
+ var li = document.createElement('li');
+ var a = document.createElement('a');
+ li.className = 'wpsg-product__crumb-category';
+ a.href = crumb.url;
+ a.textContent = crumb.name;
+ li.appendChild(a);
+ list.insertBefore(li, list.lastElementChild);
+
+ } );
+
+ } );
+
+ } // function wpsg_productBreadcrumbs()
+
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', wpsg_productBreadcrumbs); else wpsg_productBreadcrumbs();
+
+ // Der Variantenwechsel ersetzt das Produkt per Ajax
+ jQuery(document).ajaxComplete(wpsg_productBreadcrumbs);
diff --git a/views/produktseite/produkt.phtml b/views/produktseite/produkt.phtml index e8c83ae..24534ff 100644 --- a/views/produktseite/produkt.phtml +++ b/views/produktseite/produkt.phtml @@ -19,6 +19,9 @@ $oProduct = $this->view['oProduct']; if (($this->view['data']['product_key']??'') !== '') $oProduct->setProductKey($this->view['data']['product_key']); + // Ähnliche Produkte usw. stehen im Hauptprodukt; nur das Hauptprodukt bekommt die Brotkrumen + $bMainProduct = \wpsg\ProductPage::isMain(\wpsg\ProductPage::enter(), (bool)$this->noReleatedProducts); + ?> <div class="wpsg_produkt_wrapper wpsg-product"> @@ -26,6 +29,10 @@ <input type="hidden" name="wpsg_post_id" value="<?php echo get_the_ID(); ?>" /> <input type="hidden" name="titleDisplayed" value="<?php echo $this->titleDisplayed; ?>" /> + <?php if (!$bMainProduct) { ?><input type="hidden" name="wpsg_sub_product" value="1" /><?php } ?> + + <?php if ($bMainProduct) echo \wpsg\ProductPage::breadcrumbs($oProduct); ?> + <div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>"> <meta itemprop="name" content="<?php echo wpsg_hspc($oProduct->getProductName()); ?>" /> @@ -393,4 +400,5 @@ <?php $this->callMods('product_bottom_end', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?> -</div>
\ No newline at end of file +</div> +<?php \wpsg\ProductPage::leave(); ?> |
