Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich
Verfasst: 20 Jan 2026, 15:36
Im Cloudshop ist die Ordnerstruktur (glaube ich) anders.
Ich schreib jetzt mal wo was im Theme hin muss, vielleicht kann uns dann jemand Richtung self-hosted helfen, wo es bei dir dann abgespeichert werden muss.
Der Code berücksichtigt bei der Lieferzeitangabe Werktage und Wochen.
meintheme/hmtl/custom/
product_info_template_standard.html
mit folgendem Inhalt:
Die Zeile <script src="/themes/meintheme/javascripts/system/lieferzeitdatum.js"></script> wird nur in der Cloud gebraucht.
Javascript:
meintheme/javascripts/sytem/
lieferzeitdatum.js
mit folgendem Inhalt :
CSS ins eigene CSS:
Das Javascript berechnet das Lieferdatum bei Bestellungen nach 10 Uhr erst ab dem nächsten Werktag. Wer das nicht braucht entfernt diese 6 Zeilen:
// --- Cut-off: nach 10:00 Uhr startet die Berechnung ab dem nächsten Werktag ---
var startDate = new Date();
var cutoffHour = 10;
if (startDate.getHours() >= cutoffHour) {
startDate = addWorkingDays(startDate, 1);
}
Ich möchte noch dazu sagen, dass das mit Hilfe von Chatty entstanden ist. Javascripte kann ich selbst nicht schreiben.
Über Korrektur oder Verbesserungen freue ich mich natürlich.
Ich schreib jetzt mal wo was im Theme hin muss, vielleicht kann uns dann jemand Richtung self-hosted helfen, wo es bei dir dann abgespeichert werden muss.
Der Code berücksichtigt bei der Lieferzeitangabe Werktage und Wochen.
meintheme/hmtl/custom/
product_info_template_standard.html
mit folgendem Inhalt:
Die Zeile <script src="/themes/meintheme/javascripts/system/lieferzeitdatum.js"></script> wird nur in der Cloud gebraucht.
Code: Alles auswählen
{block name="product_info_template_standard_sticky_box_shipping_time_include" append}
<div class="delivery-info" id="deliveryInfo"></div>
<script src="/themes/meintheme/javascripts/system/lieferzeitdatum.js"></script>
{/block}Javascript:
meintheme/javascripts/sytem/
lieferzeitdatum.js
mit folgendem Inhalt :
Code: Alles auswählen
(function(){
window.addEventListener ? window.addEventListener("load", initDeliveryInfo, false) : window.attachEvent && window.attachEvent("onload", initDeliveryInfo);
function initDeliveryInfo() {
// --- Feiertagsberechnung ---
function getEasterSunday(year) {
var f = Math.floor,
G = year % 19,
C = f(year / 100),
H = (C - f(C / 4) - f((8 * C + 13) / 25) + 19 * G + 15) % 30,
I = H - f(H / 28) * (1 - f(29 / (H + 1)) * f((21 - G) / 11)),
J = (year + f(year / 4) + I + 2 - C + f(C / 4)) % 7,
L = I - J,
month = 3 + f((L + 40) / 44),
day = L + 28 - 31 * f(month / 4);
return new Date(year, month - 1, day);
}
function getHolidays(year) {
var easter = getEasterSunday(year);
return [
new Date(year, 0, 1),
new Date(easter.getFullYear(), easter.getMonth(), easter.getDate() - 2),
new Date(easter.getFullYear(), easter.getMonth(), easter.getDate() + 1),
new Date(year, 4, 1),
new Date(easter.getFullYear(), easter.getMonth(), easter.getDate() + 39),
new Date(easter.getFullYear(), easter.getMonth(), easter.getDate() + 50),
new Date(year, 9, 3),
new Date(year, 11, 25),
new Date(year, 11, 26)
];
}
function isHoliday(date) {
return getHolidays(date.getFullYear()).some(function (h) {
return h.toDateString() === date.toDateString();
});
}
function addWorkingDays(date, days) {
var result = new Date(date);
while (days > 0) {
result.setDate(result.getDate() + 1);
if (result.getDay() !== 0 && result.getDay() !== 6 && !isHoliday(result)) {
days--;
}
}
return result;
}
function formatDate(date) {
return date.toLocaleDateString('de-DE', {
weekday: 'short',
day: '2-digit',
month: '2-digit'
}).replace(',', '');
}
// --- Lieferzeit-Element ---
var infoEl = document.getElementById('deliveryInfo');
if (!infoEl) return;
var lastShippingText = '';
function updateDeliveryInfo() {
var shippingTextEl = document.querySelector('.products-shipping-time-value');
if (!shippingTextEl) return;
var text = shippingTextEl.textContent.trim();
if (text === lastShippingText) return;
lastShippingText = text;
var rangeWeeks = text.match(/(\d+)\s*-\s*(\d+)\s*Wochen?/i);
var singleWeeks = text.match(/(\d+)\s*Wochen?/i);
var rangeDays = text.match(/(\d+)\s*-\s*(\d+)\s*Werktage?/i);
var singleDays = text.match(/(\d+)\s*Werktage?/i);
var minDays, maxDays;
// Fall 1: Wochen
if (rangeWeeks || singleWeeks) {
var minW, maxW;
if (rangeWeeks) {
minW = parseInt(rangeWeeks[1], 10);
maxW = parseInt(rangeWeeks[2], 10);
} else {
minW = maxW = parseInt(singleWeeks[1], 10);
}
// Umrechnung: 1 Woche = 5 Werktage (Mo–Fr)
minDays = minW * 5;
maxDays = maxW * 5;
// Fall 2: Werktage
} else if (rangeDays || singleDays) {
if (rangeDays) {
minDays = parseInt(rangeDays[1], 10);
maxDays = parseInt(rangeDays[2], 10);
} else {
minDays = maxDays = parseInt(singleDays[1], 10);
}
// Fall 3: nichts Erkennbares
} else {
infoEl.innerHTML = '';
return;
}
// --- Cut-off: nach 10:00 Uhr startet die Berechnung ab dem nächsten Werktag ---
var startDate = new Date();
var cutoffHour = 10;
if (startDate.getHours() >= cutoffHour) {
startDate = addWorkingDays(startDate, 1);
}
// --- Zustellzeitraum berechnen ---
var fromDate = addWorkingDays(startDate, minDays);
var toDate = addWorkingDays(startDate, maxDays);
var dateText = (minDays === maxDays)
? formatDate(fromDate)
: formatDate(fromDate) + ' – ' + formatDate(toDate);
infoEl.innerHTML =
'<strong>Heute bestellt & bezahlt:</strong><br>' +
'<i class="fa fa-arrow-right"></i> Lieferung: <strong>' +
dateText + '</strong>';
}
// Initial
var checkInterval = setInterval(function() {
var shippingNode = document.querySelector('.products-shipping-time-value');
if (shippingNode) {
updateDeliveryInfo();
var observer = new MutationObserver(updateDeliveryInfo);
observer.observe(shippingNode, { characterData: true, childList: true, subtree: true });
clearInterval(checkInterval);
}
}, 200);
// Initial Update, falls Element schon da
updateDeliveryInfo();
}
})();
CSS ins eigene CSS:
Code: Alles auswählen
.delivery-info {
margin-top: 8px;
}
.fa-arrow-right{
color: #3dce37;
}Das Javascript berechnet das Lieferdatum bei Bestellungen nach 10 Uhr erst ab dem nächsten Werktag. Wer das nicht braucht entfernt diese 6 Zeilen:
// --- Cut-off: nach 10:00 Uhr startet die Berechnung ab dem nächsten Werktag ---
var startDate = new Date();
var cutoffHour = 10;
if (startDate.getHours() >= cutoffHour) {
startDate = addWorkingDays(startDate, 1);
}
Ich möchte noch dazu sagen, dass das mit Hilfe von Chatty entstanden ist. Javascripte kann ich selbst nicht schreiben.