Neu Template Dateien Rendern im Plugin

karabey

Sehr aktives Mitglied
28. November 2012
899
73
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>
 

Ähnliche Themen