Neu Template Dateien Rendern im Plugin

karabey

Sehr aktives Mitglied
28. November 2012
907
74
Hallo,

Ich versuche einen Plugin für mich aufzubauen und bekomme es nicht zum laufen. Finde auch keine Informationen genau, vielleicht übersehe ich es. https://jtl-devguide.readthedocs.io/projects/jtl-shop/de/latest/index.html

Ich bekomme den Inhalt vom template file oder der php file nicht gerendert. Wo mache ich falsch? Settingslink, Setting wird und dessen Inhalte werden ohne Probleme gerendert. Würde mich über ein Feedback freuen.

info.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<jtlshopplugin>
    <Name>MeinBot</Name>
    <Description>Plugin MeinBot</Description>
    <Author>Dein Name</Author>
    <URL>https://example.com</URL>
    <XMLVersion>301</XMLVersion>
    <MinShopVersion>5.2.0</MinShopVersion>
    <PluginID>MeinBot</PluginID>
    <Version>1.0.0</Version>
    <CreateDate>2024-10-17</CreateDate>

    <Install>
        <Adminmenu>
            <!-- Plugin-Einstellungen -->
            <Settingslink sort="1">
                <Name>MeinBot-Einstellungen</Name>
                <Setting type="checkbox" initialValue="1" sort="0" conf="Y">
                    <Name>Neue Produkte senden</Name>
                    <Description>Sendet Benachrichtigungen für neue Produkte</Description>
                    <ValueName>send_new_products</ValueName>
                </Setting>
            </Settingslink>
            <Settingslink sort="2">
                <Name>MeinBot API</Name>
                <Setting type="text" initialValue="" sort="0" conf="Y">
                    <Name>MeinBot Bot API Token</Name>
                    <Description>API Token für den MeinBot-Bot</Description>
                    <ValueName>MeinBot_api_token</ValueName>
                </Setting>
                <Customlink sort="2">
                    <Name>Verbindung zu MeinBot testen</Name>
                    <Description>Klicke hier, um die Verbindung zum MeinBot-Bot zu testen</Description>
                    <File>testMeinBotConnection.php</File>
                </Customlink>
            </Settingslink>
            <!-- Hinzufügen eines neuen Admin-Links für das Template -->
            <Customlink sort="3">
                <Name>MeinBot Test Verbindung</Name>
                <Description>Hier kannst du die Verbindung zu MeinBot testen.</Description>
                <File>meinbottemplate.tpl</File>
            </Customlink>

        </Adminmenu>
        <!-- SQL Migration -->
        <SQL>
            <Migration version="20241024120000" filename="Migration20241024120000.php" />
        </SQL>

        <!-- Cronjob -->
        <Cronjobs>
            <Cronjob>
                <Name>MeinBot_product_notifier</Name>
                <File>cron/MeinBot_product_notifier.php</File>
                <Interval type="custom">
                    <Minutes>30</Minutes>
                </Interval>
                <Description>Sendet neue Produkte oder Sonderangebote an MeinBot alle 30 Minuten.</Description>
            </Cronjob>
        </Cronjobs>
    </Install>


</jtlshopplugin>

Bootstrap.php
Code:
<?php
// filename: Bootstrap.php
namespace Plugin\MeinBot;

use JTL\Plugin\Bootstrapper;
use JTL\Events\Dispatcher;
use JTL\Smarty\JTLSmarty;
use JTL\Plugin\Helper as PluginHelper;
use Plugin\MeinBot\classes\MeinBotNotifier; 
use Plugin\MeinBot\classes\Logger; 
use Plugin\MeinBot\classes\ProductNotifierCron; 
use Plugin\MeinBot\classes\MeinBotTest; 
use Plugin\MeinBot\classes\SentProductManager;

class Bootstrap extends Bootstrapper
{
    public function boot(Dispatcher $dispatcher)
    {
        Logger::log("Bootstrap boot() Methode wurde aufgerufen");
    
        // Plugin-Einstellungen laden
        try {
            $plugin = PluginHelper::getPluginById('MeinBot');
            if ($plugin === null) {
                throw new \Exception("Fehler: Plugin konnte nicht geladen werden.");
            }
            $settings = $plugin->getConfig();
        } catch (\Exception $e) {
            Logger::log($e->getMessage());
            return;
        }
    
        // Prüfen, ob das Logging aktiviert ist und eine Information ausgeben
        $enableLogging = $settings->getValue('enable_logging') ?? false;
        if ($enableLogging) {
            Logger::log("Logging ist aktiviert.");
        }
    
        // Event registrieren: `product_saved`
        $dispatcher->listen('product_saved', [$this, 'onProductSaved']);
    }
    

    public function onProductSaved($args)
    {
        Logger::log("onProductSaved() wurde aufgerufen mit Produkt-ID: " . $args['productID']);
        
        try {
            $plugin = PluginHelper::getPluginById('MeinBot');
            if ($plugin === null) {
                throw new \Exception("Fehler: Plugin konnte nicht geladen werden.");
            }
            $settings = $plugin->getConfig();
        } catch (\Exception $e) {
            Logger::log($e->getMessage());
            return;
        }
        
        $sendNewProducts = (int)$settings->getValue('send_new_products');
        $sendSpecialOffers = (int)$settings->getValue('send_special_offers');

        // Lade das Produkt
        $productId = $args['productID'];
        $product = Shop::Container()->getDB()->select('tartikel', 'kArtikel', $productId);

        if ($product) {
            // Prüfen, ob es sich um ein Sonderangebot handelt
            $isSpecialOffer = $this->isSpecialOffer($product);

            // Abhängig von den Einstellungen die Benachrichtigung senden
            if ($sendNewProducts && !$isSpecialOffer) {
                $this->sendToMeinBot($product);
            } elseif ($sendSpecialOffers && $isSpecialOffer) {
                $this->sendToMeinBot($product);
            }
        } else {
            Logger::log("Produkt konnte nicht geladen werden mit der ID: {$productId}");
        }
    }

    public function renderAdminMenuTab(string $tabName, int $menuID, JTLSmarty $smarty): string
    {
        $smarty->assign('kPluginAdminMenu', $menuID)
            ->assign('pluginID', 'MeinBot'); // Plugin-spezifische Variablen zuweisen

        if ($tabName === 'MeinBot API') {
            // Template-Datei im Adminbereich rendern
            return $smarty->fetch($this->getPlugin()->getPaths()->getAdminPath() . 'adminmenu/templates/MeinBotapi.tpl');
        }

        return parent::renderAdminMenuTab($tabName, $menuID, $smarty);
    }

    private function isSpecialOffer($product)
    {
        // Sonderangebotslogik (Preisvergleich, z.B. mit dem regulären Preis)
        return $product->fPreis < $product->fUVP; // Beispiel: aktueller Preis niedriger als UVP
    }

    private function sendToMeinBot($product)
    {
        try {
            $plugin = PluginHelper::getPluginById('MeinBot');
            if ($plugin === null) {
                throw new \Exception("Fehler: Plugin konnte nicht geladen werden.");
            }
            $settings = $plugin->getConfig();
        } catch (\Exception $e) {
            Logger::log($e->getMessage());
            return;
        }

        // Plugin-Einstellungen für MeinBot
        $apiToken = $settings->getValue('MeinBot_api_token');
        $interval = $settings->getValue('message_interval');
        $duration = $settings->getValue('interval_duration');

        if (empty($apiToken) || empty($chatIds)) {
            Logger::log("Fehler: API-Token oder Chat-IDs sind nicht gesetzt.");
            return;
        }

        // Initialisierung des Notifiers und Versand
        $notifier = new MeinBotNotifier($apiToken, $chatIds, $interval, $duration);
        Logger::log("sendToMeinBot: Initialisiere MeinBotNotifier mit API Token: [geschützt]");
        $notifier->sendProductNotification($product);
    }
}

adminmenu/template/meinbottemplate.tpl
Code:
<button id="testConnectionButton">Verbindung zu MeinBot testen</button>
<div id="testConnectionResult"></div>
<script>
    document.getElementById('testConnectionButton').addEventListener('click', function () {
        var button = this;
        button.disabled = true; // Button deaktivieren während die Anfrage läuft

        console.log("Button wurde geklickt. Testanfrage wird gesendet."); // Logging in der Konsole

        // Hier wird die Anfrage an testMeinBotConnection.php gesendet
        fetch('plugins/MeinBot/workflows/testMeinBotConnection.php')
            .then(response => {
                if (!response.ok) {
                    throw new Error("Fehlerhafte Antwort vom Server: " + response.statusText);
                }
                return response.text();
            })
            .then(result => {
                console.log("Ergebnis der Anfrage: " + result); // Logging des Ergebnisses in der Konsole
                // Ergebnis im div anzeigen
                document.getElementById('testConnectionResult').innerText = result;
            })
            .catch(error => {
                console.error("Fehler beim Senden der Anfrage: " + error.message); // Logging von Fehlern in der Konsole
                document.getElementById('testConnectionResult').innerText = "Fehler: " + error.message;
            })
            .finally(() => {
                console.log("Anfrage beendet."); // Logging bei Abschluss der Anfrage
                button.disabled = false; // Button wieder aktivieren
            });
    });
</script>
 

karabey

Sehr aktives Mitglied
28. November 2012
907
74
Wieso gibt es eine Dokumentation? Ist es von JTL Entwickler für JTL Entwickler? Da kann auch nichts weiter gehen.
Danke trotzdem für die halbe Antwort.
 

karabey

Sehr aktives Mitglied
28. November 2012
907
74
Wieso suchst du als Moderator auf Google die Dokumentation? Hatte es ganz oben angehängt. Kannst du mal sagen ob der Cronjob z.b kürzer als 1 Stunde geht? Hab nichts gefunden nämlich und dafür gibt es auch eine Hook. Das habe ich herausgefunden weil ich im Datenbank geprüft habe und der Wert in Stunden angegeben wurde.
 

mvh

Sehr aktives Mitglied
26. Oktober 2011
779
280
Moin. Es ist nicht möglich eine php-Datei "direkt" aus dem Plugin aufzurufen, ist in htaccess gesperrt, dafür gibt es IO. Dein Template wird so auch nicht gerendert. S. Demo-Plugin sich an, ist nicht verkehrt der Vorschlag. Viele Grüße, Ihr MVH Team.
 

karabey

Sehr aktives Mitglied
28. November 2012
907
74
Moin. Es ist nicht möglich eine php-Datei "direkt" aus dem Plugin aufzurufen, ist in htaccess gesperrt, dafür gibt es IO. Dein Template wird so auch nicht gerendert. S. Demo-Plugin sich an, ist nicht verkehrt der Vorschlag. Viele Grüße, Ihr MVH Team.
Das habe ich auch schon rausbekommen, danke. Nur ist der Demo-Plugin nicht ausreichend für eine Dokumentation. Das gilt auch für Template Dokumentation. Hab es gerade beim installieren für die Test Umgebung rausgefunden. Die Dokumentation ist alles andere als vollständig auf den aktuellsten Stand. Vielleicht extern ist es so und intern anders..

Laut Doku https://jtl-devguide.readthedocs.io...shop_templates/structure.html#die-templatexml die template.xml Aufbau:

Die template.xml

Jedes Template verfügt über eine Datei namens template.xml, welche die grundlegenden Einstellungen des jeweiligen Templates beinhaltet. Diese Einstellungen werden vom Shop automatisch eingelesen und im Admin-Backend unter "Templates|Template-Einstellungen -> [Template-Name] -> Einstellungen" aufgelistet.

In der template.xml werden neben den verfügbaren Template-Einstellungen auch Basisinformationen in Form von Tags angegeben.

Diese Tags sollten immer gefüllt sein:

TagBeschreibung
<Name>Name des Templates (wird unter "Templates" als Name des Templates angezeigt)
<Author>Name des Autors (wird unter "Templates" als Name des Autors angezeigt)
<URL>Autor-URL (wird unter "Templates" als Verlinkung zum Autor angezeigt)
<Version>Template-Version
<MinShopVersion>Shop-Version
<Preview>Pfad zum Vorschaubild ausgehend vom aktuellen Verzeichnis des Templates
<Descrption>Kurzbeschreibung des Templates (wird unterhalb des Template-Namens unter "Templates" angezeigt)
Um die Einstellungen besser lesbar zu machen und für den Shopbetreiber zu gruppieren, können sie das Attribut "MarginBottom" nutzen. Hier ein Beispiel:

<Section Name="Colors" Key="colors">
<Setting Description="colorPrimary" Key="primary" Type="colorpicker" Value=""/>
<Setting Description="colorSecondary" Key="secondary" Type="colorpicker" Value="" MarginBottom="true"/>
...
</Section>

Es besteht zudem die Möglichkeit eine Überschrift über der aktuellen Einstellung einzufügen. Im folgenden Code erweitern wir das vorangegangene Beispiel:

<Section Name="Colors" Key="colors">
<Setting Description="colorPrimary" Key="primary" Type="colorpicker" Value=""/>
<Setting Description="colorSecondary" Key="secondary" Type="colorpicker" Value="" MarginBottom="true"/>
<Setting Description="colorHeaderBgColor" Key="header-bg-color" Type="colorpicker" Value="" Subheader="header header"/>
</Section>

Neben template-spezifischen Einstellungen werden in der template.xml auch die verfügbaren Themes und die zu inkludierenden CSS/JS-Dateien definiert. Eine Anleitung zum Erstellen eines eigenen Themes finden Sie im Abschnitt "eigenes_theme".

template.xml von Nova der JTL Shop 5.4.0

Code:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Template isFullResponsive="true">
    <Name>NOVA</Name>
    <Author>JTL-Software-GmbH</Author>
    <URL>https://www.jtl-software.de</URL>
    <MinShopVersion>5.4.0</MinShopVersion>
    <Version>1.4.0</Version>
    <Preview>preview.png</Preview>
    <Description>JTL-Shop Responsive-Template</Description>
    <Framework>Bootstrap4</Framework>
    <Settings>
        <Section Name="Allgemein" Key="general">
            <Setting Description="Komprimierung von JavaScript- und CSS-Dateien" Key="use_minify" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="static">Ja, statisch</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Ist Nova Template" Key="is_nova" Type="text" Value="Y" Editable="false"/>
        </Section>
        <Section Name="Theme" Key="theme">
            <Setting Description="Theme" Key="theme_default" Type="select" Value="clear">
                <Option Value="clear">clear - Handgemacht mit <![CDATA[&hearts;]]> von JTL</Option>
                <Option Value="midnight">midnight</Option>
                <Option Value="blackline">blackline</Option>
            </Setting>
            <Setting Description="Animation für Schaltflächen beim Hovern" Key="button_animated" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Wunschzettel und Vergleichsliste - Animation anzeigen" Key="wish_compare_animation" Type="select" Value="mobile">
                <Option Value="both">Auf Desktop und mobilen Geräten</Option>
                <Option Value="mobile">Nur mobil</Option>
                <Option Value="desktop">Nur Desktop</Option>
                <Option Value="none">Keine</Option>
            </Setting>
            <Setting Description="Schaltfläche „Nach oben scrollen“ anzeigen"  Key="button_scroll_top" Type="select" Value="Y">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Sliderposition" Key="slider_full_width" Type="select" Value="N">
                <Option Value="N">im Contentbereich</Option>
                <Option Value="Y">zwischen Header und Content</Option>
            </Setting>
            <Setting Description="Bannerposition" Key="banner_full_width" Type="select" Value="N">
                <Option Value="N">im Contentbereich</Option>
                <Option Value="Y">zwischen Header und Content</Option>
            </Setting>
            <Setting Description="Linke Seitenleiste anzeigen" Key="left_sidebar" Type="select" Value="N">
                <Option Value="N">Nur auf Artikellisten</Option>
                <Option Value="Y">Auf allen Seiten</Option>
            </Setting>
            <Setting Description="Favicon" Key="favicon" Type="upload" Value="favicon.ico" maxFileSize="123456" showPreview="false" allowedFileExtensions="['ico','png']" accept="image/*" target="favicon/" targetFileName="favicon.ico"/>
        </Section>
        <Section Name="Header" Key="header">
            <Setting Description="Gewählte Vorlage" Key="menu_template" Type="select" Value="standard" MarginBottom="true">
                <Option Value="headerStandard">Standard</Option>
                <Option Value="headerLogo">Logo zentriert</Option>
                <Option Value="headerSingle">Menü in eigener Zeile</Option>
                <Option Value="headerBoxed">Header Boxed - Menü mehrspaltig</Option>
                <Option Value="headerTopbar">Ohne Topbar - Header volle breite</Option>
                <Option Value="headerCustom">Custom</Option>
            </Setting>
            <Setting Description="Menü in eigener Zeile anzeigen" Key="menu_single_row" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Anzeige bei vielen Menüeinträgen" Key="menu_multiple_rows" Type="select" Value="scroll">
                <Option Value="multiple">Mehrzeilig</Option>
                <Option Value="scroll">Einzeilig und scrollbar nach links/rechts</Option>
            </Setting>
            <Setting Description="Menüausrichtung" Key="menu_center" Type="select" Value="center">
                <Option Value="center">Zentriert</Option>
                <Option Value="left">Linksbündig</Option>
                <Option Value="space-between">Blocksatz</Option>
            </Setting>
            <Setting Description="Anzeige beim Scrollen" Key="menu_scroll" Type="select" Value="menu">
                <Option Value="menu">Menü</Option>
                <Option Value="all">Menü, Logo, Suche</Option>
                <Option Value="none">Nichts</Option>
            </Setting>
            <Setting Description="Logo Höhe (in px)" Key="menu_logoheight" Type="number" Value="49"/>
            <Setting Description="Logo zentriert" Key="menu_logo_centered" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Topbar anzeigen" Key="menu_show_topbar" Type="select" Value="Y">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Suchfeld Breite (in px)" Key="menu_search_width" Type="number" Value="0"/>
            <Setting Description="Suchfeld Positionierung" Key="menu_search_position" Type="select" Value="center">
                <Option Value="left">Linksbündig</Option>
                <Option Value="right">Rechtsbündig</Option>
                <Option Value="center">Zentriert</Option>
            </Setting>
            <Setting Description="Header über gesamte Bildschirmbreite darstellen" Key="header_full_width" Type="select" Value="N" MarginBottom="true">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
                <Option Value="B">Boxed</Option>
            </Setting>
            <Setting Description="Anzeige der Suche auf mobilen Geräten" Key="mobile_search_type" Type="select" Value="fixed">
                <Option Value="fixed">Suche beim Hochscrollen einblenden</Option>
                <Option Value="dropdown">Icon mit Dropdown</Option>
            </Setting>
        </Section>
        <Section Name="Megamenu" Key="megamenu">
            <Setting Description="Kategorien (anstelle einer Kategoriebox / Boxenverwaltung)" Key="show_categories" Type="select" Value="Y">
                <Option Value="Y">Auf Desktop und mobilen Geräten</Option>
                <Option Value="mobile">Nur mobil</Option>
                <Option Value="desktop">Nur Desktop</Option>
                <Option Value="N">Inaktiv</Option>
            </Setting>
            <Setting Description="Mobile Geräte: Menü in aktueller Kategorie öffnen" Key="mobile_start_category" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Kategoriebilder für erste Unterkategorie" Key="show_category_images" Type="select" Value="N">
                <Option Value="Y">Aktiv</Option>
                <Option Value="N">Inaktiv</Option>
            </Setting>
            <Setting Description="Unterkategorien" Key="show_subcategories" Type="select" Value="Y" MarginBottom="true">
                <Option Value="Y">Aktiv</Option>
                <Option Value="N">Inaktiv</Option>
            </Setting>
            <Setting Description="Seiten der Linkgruppe „megamenu“" Key="show_pages" Type="select" Value="Y" MarginBottom="true">
                <Option Value="Y">Aktiv</Option>
                <Option Value="N">Inaktiv</Option>
            </Setting>
            <Setting Description="Hersteller-Dropdown" Key="show_manufacturers" Type="select" Value="N">
                <Option Value="Y">Aktiv</Option>
                <Option Value="N">Inaktiv</Option>
            </Setting>
            <Setting Description="Herstellerbilder" Key="show_manufacturer_images" Type="select" Value="N">
                <Option Value="Y">Aktiv</Option>
                <Option Value="N">Inaktiv</Option>
            </Setting>
        </Section>
        <Section Name="Listen- und Galerieansicht" Key="productlist">
            <Setting Description="Auswahloptionen bei „Filter anzeigen in (Desktop)“" Key="filter_placement" Type="select" Value="sidebar">
                <Option Value="sidebar">Seitenleiste (Einstellung einzelner Filter unter „Standardelemente > Footer /Boxen“ und „Standardansichten > Artikelübersicht“)</Option>
                <Option Value="modal">Eigenes Fenster (Einstellung einzelner Filter unter „Standardansichten > Artikelübersicht“)</Option>
            </Setting>
            <Setting Description="Suchfeld in Filtern anzeigen ab x Einträgen" Key="filter_search_count" Type="number" Value="20"/>
            <Setting Description="Filter immer ausgeklappt" Key="filter_items_always_visible" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Anzahl der sichtbaren Filteroptionen in Boxen" Key="filter_max_options" Type="select" Value="5" MarginBottom="true">
                <Option Value="3"><![CDATA[max. 3]]></Option>
                <Option Value="5"><![CDATA[max. 5]]></Option>
                <Option Value="9"><![CDATA[max. 9]]></Option>
                <Option Value="12"><![CDATA[max. 12]]></Option>
                <Option Value="-1"><![CDATA[keine Beschränkung]]></Option>
            </Setting>
            <Setting Description="Artikel über die Artikelübersicht (Liste) in den Warenkorb legen" Key="buy_productlist" Type="select" Value="Y" Subheader="header list">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Variationsauswahl in Liste anzeigen" Key="variation_select_productlist_list" Type="select" Value="3">
                <Option Value="N"><![CDATA[0 - Keine Auswahl anzeigen]]></Option>
                <Option Value="1"><![CDATA[max. 1]]></Option>
                <Option Value="2"><![CDATA[max. 2]]></Option>
                <Option Value="3"><![CDATA[max. 3]]></Option>
                <Option Value="5"><![CDATA[max. 5]]></Option>
                <Option Value="9999"><![CDATA[keine Beschränkung]]></Option>
            </Setting>
            <Setting Description="Anzahl der möglichen Variationswerte für Radio und Swatches in der Liste" Key="variation_max_werte_productlist_list" Type="select" Value="3" MarginBottom="true">
                <Option Value="3"><![CDATA[max. 3]]></Option>
                <Option Value="5"><![CDATA[max. 5]]></Option>
                <Option Value="9"><![CDATA[max. 9]]></Option>
                <Option Value="12"><![CDATA[max. 12]]></Option>
                <Option Value="9999"><![CDATA[keine Beschränkung]]></Option>
            </Setting>
            <Setting Description="Variationsvorschau in Galerie anzeigen" Key="variation_select_productlist_gallery" Type="select" Value="2" Subheader="header gallery">
                <Option Value="N"><![CDATA[0 - Keine Auswahl anzeigen]]></Option>
                <Option Value="1"><![CDATA[max. 1]]></Option>
                <Option Value="2"><![CDATA[max. 2]]></Option>
            </Setting>
            <Setting Description="Anzahl der möglichen Variationswerte für Radio und Swatches in der Galerie" Key="variation_max_werte_productlist_gallery" Type="select" Value="3" MarginBottom="true">
                <Option Value="3"><![CDATA[max. 3]]></Option>
                <Option Value="5"><![CDATA[max. 5]]></Option>
                <Option Value="9"><![CDATA[max. 9]]></Option>
                <Option Value="12"><![CDATA[max. 12]]></Option>
                <Option Value="9999"><![CDATA[keine Beschränkung]]></Option>
            </Setting>
            <Setting Description="Preisspanne immer anzeigen (empfohlen)" Key="always_show_price_range" Type="select" Value="Y" Editable="false">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
        </Section>
        <Section Name="Artikeldetailseite" Key="productdetails">
            <Setting Description="Slider für Swatches anzeigen, ab x Elementen" Key="swatch_slider" Type="number" Value="12"/>
            <Setting Description="Position des Konfigurators" Key="config_position" Type="select" Value="details" Editable="false">
                <Option Value="popup">als Popup anzeigen</Option>
                <Option Value="details">in den Artikeldetails anzeigen</Option>
            </Setting>
            <Setting Description="Darstellung der Konfiguratoroptionen" Key="config_layout" Type="select" Value="list" Editable="false">
                <Option Value="list">als kompakte Liste</Option>
                <Option Value="gallery">als Galerie</Option>
            </Setting>
        </Section>
        <Section Name="Colors" Key="colors">
            <Setting Description="colorPrimary" Key="primary" Type="colorpicker" Value=""/>
            <Setting Description="colorSecondary" Key="secondary" Type="colorpicker" Value="" MarginBottom="true"/>
            <Setting Description="colorHeaderBgColor" Key="header-bg-color" Type="colorpicker" Value="" Subheader="header header"/>
            <Setting Description="colorHeaderColor" Key="header-color" Type="colorpicker" Value=""/>
            <Setting Description="colorHeaderBgColorSecondary" Key="header-bg-color-secondary" Type="colorpicker" Value=""/>
            <Setting Description="colorHeaderColorSecondary" Key="header-color-secondary" Type="colorpicker" Value="" MarginBottom="true"/>
            <Setting Description="colorFooterBgColor" Key="footer-bg-color" Type="colorpicker" Value="" Subheader="header footer"/>
            <Setting Description="colorFooterColor" Key="footer-color" Type="colorpicker" Value=""/>
            <Setting Description="colorCopyrightBgColor" Key="copyright-bg-color" Type="colorpicker" Value=""/>
        </Section>
        <Section Name="Custom Sass" Key="customsass">
            <Setting Description="customVariables" Key="customVariables" Type="textarea" Class="codemirror sass" Value=""/>
            <Setting Description="customContent" Key="customContent" Type="textarea" Class="codemirror sass" Value=""/>
        </Section>
        <Section Name="Footer-Einstellungen" Key="footer">
            <Setting Description="Newsletter-Anmeldung im Footer" Key="newsletter_footer" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Social-Media-Schaltflächen im Footer" Key="socialmedia_footer" Type="select" Value="N">
                <Option Value="Y">Ja</Option>
                <Option Value="N">Nein</Option>
            </Setting>
            <Setting Description="Facebook-Link" Key="facebook" Type="text" Value=""/>
            <Setting Description="Twitter-Link" Key="twitter" Type="text" Value=""/>
            <Setting Description="YouTube-Link" Key="youtube" Type="text" Value=""/>
            <Setting Description="Xing-Link" Key="xing" Type="text" Value=""/>
            <Setting Description="LinkedIn-Link" Key="linkedin" Type="text" Value=""/>
            <Setting Description="Vimeo-Link" Key="vimeo" Type="text" Value=""/>
            <Setting Description="Instagram-Link" Key="instagram" Type="text" Value=""/>
            <Setting Description="Pinterest-Link" Key="pinterest" Type="text" Value=""/>
            <Setting Description="Skype-Link" Key="skype" Type="text" Value=""/>
            <Setting Description="TikTok-Link" Key="tiktok" Type="text" Value=""/>
        </Section>
    </Settings>
    <Minify>
        <CSS Name="clear.css">
            <File Path="themes/clear/clear.css"/>
            <File Path="themes/clear/custom.css"/>
        </CSS>
        <CSS Name="midnight.css">
            <File Path="themes/midnight/midnight.css"/>
            <File Path="themes/midnight/custom.css"/>
        </CSS>
        <CSS Name="blackline.css">
            <File Path="themes/blackline/blackline.css"/>
            <File Path="themes/blackline/custom.css"/>
        </CSS>
        <JS Name="jtl3.js">
            <File Path="js/bootstrap-toolkit.js"/>
            <File Path="js/bootstrap.bundle.min.js"/>
            <File Path="js/slick.min.js"/>
            <File Path="js/eModal.min.js"/>
            <File Path="js/jquery.nivo.slider.pack.js"/>
            <File Path="js/bootstrap-select.min.js"/>
            <File Path="js/jtl.evo.js"/>
            <File Path="js/typeahead.bundle.min.js"/>
            <File Path="js/wow.min.js"/>
            <File Path="js/colcade.js"/>
            <File Path="js/global.js"/>
            <File Path="js/slick-lightbox.min.js"/>
            <File Path="js/jquery.serialize-object.min.js"/>
            <File Path="js/jtl.io.js"/>
            <File Path="js/jtl.article.js"/>
            <File Path="js/jtl.basket.js"/>
            <File Path="js/parallax.min.js"/>
            <File Path="js/jqcloud.js"/>
            <File Path="js/nouislider.min.js"/>
            <File Path="js/consent.js"/>
            <File Path="js/consent.youtube.js"/>
        </JS>
    </Minify>
    <Boxes>
        <Container Position="left" Available="1"></Container>
        <Container Position="right" Available="0"></Container>
        <Container Position="top" Available="0"></Container>
        <Container Position="bottom" Available="1"></Container>
    </Boxes>
</Template>
 

Ähnliche Themen