Seite 2 von 2

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 20 Jan 2026, 15:36
von Michaela
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.

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. :-) Über Korrektur oder Verbesserungen freue ich mich natürlich.

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 21 Jan 2026, 12:04
von Manja
Michaela hat geschrieben: 20 Jan 2026, 14:58 Mega. Das bekomm ich einfach nicht hin. Er rechnet bei mir dann immer 2 Tage anstatt 2 Wochen.
Die Änderung hätte ich bitte gerne.
Klar, mache ich gerne. Es funktioniert bei mir, aber bitte schau auch nochmal drüber - KI hat mir geholfen. 🙈
Ich habe zusätzlich noch hinzugefügt, dass er ab 10 Uhr die Berechnung auf den nächsten Werktag verschieben soll.

Ich kopiere dir meinen kompletten Code (CSS ist etwas anders als vorher bei dir, aber du wirst die wichtigen Stellen vermutlich eh direkt sehen 😉).

Code: Alles auswählen

<div class="delivery-info" id="deliveryInfo"></div>
<style>
.delivery-info {
    margin-top: 8px;
}
.fa-arrow-right{
    color: #3dce37;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {

    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(',', '');
    }

    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
    updateDeliveryInfo();

    // NUR die Lieferzeit beobachten
    var shippingNode = document.querySelector('.products-shipping-time-value');
    if (!shippingNode) return;

    var observer = new MutationObserver(function () {
        updateDeliveryInfo();
    });

    observer.observe(shippingNode, {
        characterData: true,
        childList: true,
        subtree: true
    });
});
</script>

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 21 Jan 2026, 12:21
von Manja
Michaela hat geschrieben: 20 Jan 2026, 15:36 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.
Okay. Leider übersteigt das mein Wissen - nicht, dass ich was kaputt mache.
Ich werde Dominik S. um Hilfe bitten....

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 21 Jan 2026, 17:10
von Michaela
Danke dir Manja. Deine Wochenberücksichtigung und Berechnung bis 10Uhr habe ich nun im Javascript oben eingefügt und getestet.

Vielleicht findet sich ja hier jemand der uns das erklärt. Für die Zukunft werde ich das wohl auch irgendwann mal brauchen :-) :

Wo kommt ein Overload der product_info_template_standard.html hin?
Wo kommt ein neues eigenes Javascript hin, das sich auf diese Datei bezieht
und wie wird es korrekt eingebunden?

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 22 Jan 2026, 15:34
von Michaela
Blöderweise kann ich hier keine .js oder .html als Dateianhang hochladen?



Was sagt ihr hierzu? Ist das für self-hosted so richtig? :

Die Javascript-Datei lieferdatum.js kommt hier hin:

GXModules/Manja/Lieferdatum/Shop/Themes/All/javascript/ProductInfo/

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(); 
    } 
})();
Die Ordner "Manja" und "Lieferdatum" kannst du auch anders nennen.

Die product_info_template_standard.html muss hier hin:

GXModules/Manja/Lieferdatum/Shop/Themes/All/

Bei self-hosted hat das Javascript durch den verwendeten Pfad die Zuordnung zur Datei. Somit benötigt man innerhalb der standard.html keinen Pfad. Ist das richtig?

Die product_info_template_standard.html hat folgenden Inhalt:

Code: Alles auswählen

{block name="product_info_template_standard_sticky_box_shipping_time_include" append}
<div class="delivery-info" id="deliveryInfo"></div>
{/block}

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 23 Jan 2026, 14:29
von Michaela
Auch mit Hilfe des Entwickler-Tutorial und dem Forum weiß ich nicht warum es mit getrenntem Ablegen von JS und HTML nicht klappt. Dafür reicht mein Latein einfach nicht aus... :(

Aber es klappt wenn das JavaScript innerhalb der HTML-Datei steht:

Eine Datei erstellen namens product_info_template_standard.html mit diesem Inhalt und hier ablegen:
GXModules/Manja/Lieferzeit/Shop/Themes/All

Code: Alles auswählen

{block name="product_info_template_standard_sticky_box_shipping_time_include" append}
<div class="delivery-info" id="deliveryInfo"></div>
{literal}
<script>
(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(); 
    } 
})();
</script>
{/literal}
{/block}

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 28 Jan 2026, 21:28
von Michaela
Mit perfektem Team-Work haben wir (Christian & ich) es geschafft. :D


Anbei das Modul.
Entpacken und den Ordner "Meins" in deinen vorhandenen Ordner GXModules speichern und danach den Modul- und Seitencache leeren.

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 29 Jan 2026, 12:37
von Manja
Hui, dankeschön, Michaela und Christian. 🙏
Ich werde es installieren, testen und melde mich dann.....

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 30 Jan 2026, 14:56
von Manja
Ich bin ziemlich begeistert, Michaela und Christian. 😄
Die Installation hat prima geklappt – das Modul läuft einwandfrei.

Tausend Dank für eure Zeit und die tolle Lösung. Das ist nicht selbstverständlich und hat mir sehr geholfen! 👍

Re: Wunschthema: Lieferzeitanzeige mit Datumsbereich

Verfasst: 30 Jan 2026, 17:10
von Michaela
Immer gerne :-)
Es freut mich, dass es geklappt hat.