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
Bootstrap.php
adminmenu/template/meinbottemplate.tpl
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>