summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--views/css/wpsg-theme.css4
-rw-r--r--views/js/frontend.js41
-rw-r--r--views/produktseite/produkt.phtml10
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(); ?>