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.