Neu PHP in Plugin hinzufügen und von dort auf Datenbank/Variablen zugreifen

Th3_J0k3

Neues Mitglied
13. Oktober 2020
19
1
Hallo,
Ich möchte von einer Form in einem FrontendLink ein externes PHP Script ausführen, welches im Frontend Ordner liegt:
HTML:
<form action="{$oPlugin->cFrontendPfadURL}submit_form.php">
    <input type="submit">
</form>

Das funktioniert auch sehr gut, nur stellt sich das Problem, dass von dieser PHP Datei aus auf keine globalen Variablen zugegriffen werden kann.
z.B. wird folgendes nicht ausgeführt:
PHP:
<?php
    echo $oPlugin->cName;
?>

Kann ich die PHP Datei irgendwie näher ins Plugin einbinden? Oder wie kann ich auch von dort auf solche Variablen zugreifen?
LG
 
  • Gefällt mir
Reaktionen: Horus Sirius

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Hallo,
ein Frontendlink ist zunächst einmal eine normale Einsprungseite für den Shop und muss deshalb auch den Regeln dafür folgen. Mindestens sollte also die /includes/globalinclude.php inkludiert werden, um das "normale" Shop-Framework zur Verfügung zu haben.
Minimal könnte das also so aussehen:
PHP:
<?php

use JTL\Plugin\Helper;

require_once __DIR__ . '/../../../includes/globalinclude.php';

$plugin = Helper::getPluginById('meinePluginID');
In $plugin hast du dann eine Instanz deines Plugins zur Verfügung.
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Wenn man es mehr Klassenorientiert mag und eigenen Content im Inhaltsbereich des Shops anzeigen möchte, dann hat man mit dem Plugin-Bootstrapping von Shop5 auch noch die Möglichkeit die Methode prepareFrontend zu nutzen. Dazu wird in der info.xml der Knoten Filename weggelassen.
XML:
<FrontendLink>
    <Link>
        <Name>Testlink</Name>
        <Template>testlink.tpl</Template>
        <VisibleAfterLogin>N</VisibleAfterLogin>
        <PrintButton>N</PrintButton>
        <SSL>0</SSL>
        <LinkLanguage iso="GER">
            ...
        </LinkLanguage>
    </Link>
</FrontendLink>
In der eigenen Bootstrap-Klasse wird dann die Methode prepareFrontend überschrieben.
PHP:
/**
 * @inheritDoc
 */
public function prepareFrontend(LinkInterface $link, JTLSmarty $smarty): bool
{
    parent::prepareFrontend($link, $smarty);
    if ($link->getTemplate() === 'testlink.tpl') {
        /* do some logic... */
        $myVar = 'Hello World...';
        $smarty->assign('greeting', $myVar)

        return true;
    }

    return false;
}
Mit diesem Verfahren, welches die Nutzung des Links HOOK_SEITE_PAGE_IF_LINKART ersetzt, braucht man sich dann nicht um das Laden des Shop-Framework zu kümmern, da dies bereits erfolgt ist. Vorrangig geeignet ist dies für Frontendlinks, die eigenen Content im Inhaltsbereich des Shops anzeigen.
 
  • Gefällt mir
Reaktionen: elevennerds.de

Steve Iva

Mitglied
31. August 2021
6
1
Hallo,
ein Frontendlink ist zunächst einmal eine normale Einsprungseite für den Shop und muss deshalb auch den Regeln dafür folgen. Mindestens sollte also die /includes/globalinclude.php inkludiert werden, um das "normale" Shop-Framework zur Verfügung zu haben.
Minimal könnte das also so aussehen:
PHP:
<?php

use JTL\Plugin\Helper;

require_once __DIR__ . '/../../../includes/globalinclude.php';

$plugin = Helper::getPluginById('meinePluginID');
In $plugin hast du dann eine Instanz deines Plugins zur Verfügung.

Hierzu habe ich eine Frage:

require_once __DIR__ . '/../../../includes/globalinclude.php';

kann ich da nicht einfach sagen:

 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Nein, das funktioniert nicht. includes/globalinclude.php muss auch in Shop5 explizit inkludiert werden, da darüber u.a. der Autoload-Mechanismus initialisiert wird, ohne den das use nicht funktioniert.
 
  • Gefällt mir
Reaktionen: Steve Iva

Steve Iva

Mitglied
31. August 2021
6
1
Danke für die schnelle Antwort!

D.h. im Umkehrschluss: ich muss das includes/globalincludes.php IMMER mindestens einmal inkludieren, um die anderen, von JTL vorgegebenen, Namespaces, wie zum Beispiel
JTL\Plugin\Bootstrapper, JTL\Events\Dispatcher, JTL\Smarty\JTLSmarty nutzen zu können... richtig?
 

FMoche

Moderator
Mitarbeiter
15. Dezember 2014
1.355
339
Halle (Saale)
Ja. Aber das gilt wie gesagt nur, wenn du ein GET- oder POST-Request direkt an eine PHP-Datei senden willst, ohne den Shop dazwischen zu nutzen.
Bei der Lösung über die info.xml oder über prepareFrontend() in der Bootstrap.php nicht.

Es gibt eigentlich fast keinen Grund, sich das selbst zu bauen.
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Hinzu kommt noch, dass das direkte Ausführen von PHP-Dateien im /plugin-Verzeichnis grundsätzlich per .htaccess verboten ist. Die Verwendung solcher direkten Aufrufe
HTML:
<form action="{$oPlugin->cFrontendPfadURL}submit_form.php">
    <input type="submit">
</form>
unter Umgehung eines Shop-Frontenlinks erfordert immer auch eine Konfigurationsänderung bzw. eine eigene Plugin-.htaccess die den direkten Aufruf dieser Datei wieder erlaubt.
Es gibt also nicht nur fast keinen Grund sich das selbst zu bauen, sondern auch mehrere gute Gründe die explizit dagegen sprechen. ;)
 

Steve Iva

Mitglied
31. August 2021
6
1
Hierzu habe ich noch eine Frage. Ich habe aktuell 2 dropdowns, deren <option> beide via SQL queries befüllt werden. Problem hier ist, dass das erste Dropdown die SQL Query für das zweite Dropdown parametrisieren soll. Sprich, in Abhängigkeit zur Auswahl des Nutzers in erstem Dropdown, soll dann das zweite dynamisch befüllt werden. Beispiel: Wenn jemand in Dropdown 1 die Farbe "ROT" auswählt, soll das zweite Dropdown nur die T-Shirts in ROT anzeigen. Initiales Vorladen und dann via JS Filtern geht leider nicht, weil die DB von uns tausende Einträge dazu hat.

Ich nutze hierfür AJAX, und feuer einen asynchronen Request ab, sobald der User im Dropdown etwas auswählt. Ich stoße aber aktuell auf das Problem, dass ich ein 403 forbidden Fehler bekomme, weil ich im AJAX dann entsprechend die .php Datei, die den SQL Query aufrufen soll, direkt ansprechen möchte. Das ist doch genau das, was ihr hier mit dem .htaccess beschreibt, richtig?

Ich habe gesehen, dass z.B. das JTL_search plugin das so machen möchte, wie ich es mache: https://gitlab.com/jtl-software/jtl-shop/plugins/jtl_search/-/blob/master/frontend/js/suggest.js

Habt ihr hier die .htaccess ändern müssen?

Wenn ihr hier eine Idee haben könntet, wie ich das hier besser (und ohne AJAX) lösen kann, lasst es mich bitte wissen.

Danke,
Steve
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Hallo Steve,
wenn du deine AJAX-Calls explizit an eine eigene PHP-Datei absetzen möchtest, dann musst du für dein Plugin eine eigene .htaccess mitliefern, die dafür eine Ausnahme definiert.
Der Shop stellt aber durchaus einen Weg für AJAX-Calls für Plugins zur Verfügung. Dazu kann der Hook HOOK_IO_HANDLE_REQUEST verwendet werden, um eigene IO-Listener zu registrieren. Dieser IO-Listener wird dann automatisch aufgerufen, wenn der AJAX-Call an /io.php im Shop-Root geht.
Rudimentär sieht das so aus:
Bootstrap.php deines Plugins
PHP:
...
public function boot(Dispatcher $dispatcher): void
{
    ...
    $dispatcher->listen('shop.hook.' . \HOOK_IO_HANDLE_REQUEST, [$this, 'myIORequestListener']);
    ...
}
...
/**
 * @param array $args
 */
public function myIORequestListener(array $args): void
{
    /** @var IO $io */
    $io = $args['io'];
    try {
        $io->register('meine_plugin_id.meinAjaxCall', [$this, 'doMyAjaxCall']);
    } catch (Exception $e) {
       ... do some error handling
    }
}
...
/**
 * @param string $meineAjaxVariable
 * @return object
 */
public function doMyAjaxCall(string $meineAjaxVariable): object
{
    $result = new IOResponse();
    $result->assignDom('my-message-container span', 'innerHTML', $meineAjaxVariable);
    ...
    return $result;
}
JS in deinem Frontend-Template
JavaScript:
$.evo.io().call(
    'meine_plugin_id.meinAjaxCall',
    {meineAjaxVariable: 'Hello world!'},
    {},
    function (error, data) {
        ... do some stuff if ajax call returns
    }
)
 

Frank Hoffmeister

Sehr aktives Mitglied
11. Mai 2014
142
28
@FPrüfer
Hallo, ich versuche schon seit mehreren Tagen, leider erfolglos, so einen io call in der Bootstrap für ein Childtemplate zu registrieren,
Hätten Sie da evtl auch eine Beispiel dafür?

Vielen Dank
Gruß Frank Hoffmeister
 
  • Gefällt mir
Reaktionen: Steve Iva

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Hallo,
über die Bootstrap eines Templates können keine Ajax-Endpoints registriert werden, da diese erst beim Initialisieren des Templates ausgeführt wird. Dieser Zeitpunkt ist für ein erfolgreiches Ajax-Routing viel zu spät. Hierzu sollte das eigene (Child-)Template besser mit einem zugehörigen Plugin kombiniert werden.
 

andrenalin

Aktives Mitglied
10. Mai 2021
3
0
Oberhausen
Hallo zusammen,

ich muss diese Thema noch einmal aufwecken da ich nun sehr lange suche und probiere.

Ich habe ein AlertPopup welches nach X mal schließen nicht mehr aufgehen soll, das funktioniert mit JS auf
einer Seite, sobald ich die Seite wechsle, wird neu gezählt.

Daher möchte ich das per Session tracken und abfragen, ich kann nur die Rückmledung nicht lesen. die Session wird gezählt.
Ob ich das per Object ioResponse oder als string mit json_encode zurückgebe, das Ergebnis bliebt gleich.
Ich habe verschiedenste Ansätze getestet, aber ich werde nicht schlauer.

Code:
public function boot(Dispatcher $dispatcher)
    {
        parent::boot($dispatcher);
        
        $dispatcher->listen('shop.hook.' . \HOOK_IO_HANDLE_REQUEST, [$this, 'registerAjaxCloseSessionChecker']);
        }

/**
     * @param array $args
     */
    public function registerAjaxCloseSessionChecker(array $args): void
    {
        /** @var IO $io */
        $io = $args['io'];
        try {
            $io->register('crispySocialProof.checkCloseStatus', [$this, 'checkCloseSession']);
        } catch (\Exception $e) {
        }
    }


    public function checkCloseSession($var): string
    {
        $ioResponse = new IOResponse();
        $_SESSION['scpCloseCounter']++;
        #if ($_SESSION['scpCloseCounter'] >= $_SESSION['scpStopLoop']) {
        if ($_SESSION['scpCloseCounter'] >= 20) {
            $isEnough = 'Y';
        } else {
            $isEnough = 'N';
        }
        $ioResponse->assignVar('isEnough', $isEnough);
        #return $ioResponse;
        return json_encode(['isEnough' => $isEnough]);
    }

Code:
    $.evo.io().call('crispySocialProof.checkCloseStatus', {'var':1}, this, function (error, data) {
            
        console.log(data);
          
            if (error) {
                console.log(error);
                loopActive = false;
                return;
            }
            if (data == 'Y') {
                loopActive = false;
            }
        }
    )

$var habe ich nur als Platzhalter gelassen, muss nicht genutzt werden.
Eventuell hat jemand eine Idee wie ich das fixen kann.

Vielen Dank!
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu JTL Connector Woocomerce für PHP Version 7.4 WooCommerce-Connector 2
Neu Connector für php 8.3 / Prestashop 8.1.3 PrestaShop-Connector 2
Neu JTL-Shop 5 und PHP OpCache Allgemeine Fragen zu JTL-Shop 8
Neu Richtige Hook zum Berechnen der Lieferzeit in Artikel.php Technische Fragen zu Plugins und Templates 1
Neu keine Vorschläge und suggest.php JTL-Search 1
Neu Update 5.1.2 auf 5.2.4 Struktur-Migration Fehler in 320 Tabellen, PHP 8.2.14 Gelöste Themen in diesem Bereich 3
Neu gelöst: PHP Abfrage Versandklasse und passendes Bild aussteuern Betrieb / Pflege von JTL-Shop 2
Neu PHP mail() Versand Betrieb / Pflege von JTL-Shop 7
Beantwortet Fehler bei Synchronisation [PHP Fatal Error] Gelöste Themen in diesem Bereich 2
Neu PHP Error: Narrowing occurred during type inference of ZEND_FETCH_DIM_RW JTL-Shop - Fehler und Bugs 5
Neu Paypal Plugin erzeugt "Quirks Mode" Betrieb / Pflege von JTL-Shop 0
Neu Mail-Versand & Plugin Doku Technische Fragen zu Plugins und Templates 2
Neu Variationen im Shop Auswahl zurücksetzen (Plugin?) Betrieb / Pflege von JTL-Shop 3
Neu NEU ✔️ PDF-Angebots-Plugin für den JTL-Shop 5 - PDF Angebote von der Produktseite oder aus dem Warenkorb heraus generieren B2C / B2B Plugins für JTL-Shop 0
Neu Neues Plugin: Hersteller Slider Portlet (Zentrierungs- oder Schwarz/Weiß-Modus, Responsive Anpassung..) inkl. 5 kostenlosen Lizenzen Plugins für JTL-Shop 4
Neu Plugin KBA Finder Implementierung/Darstellungsänderung Plugins für JTL-Shop 0
Neu Custom Template für Custom Artikel mit Plugin? Plugins für JTL-Shop 0
Neu JTL Connector Plugin Aktivierunf [Fehlermeldung] WooCommerce-Connector 0
Neu Erfahrung mit LS-Cache Plugin Technische Fragen zu Plugins und Templates 10
Neu 🌟Neues Plugin: FRASPY Altersprüfung & IdentitätsCheck Plugins für JTL-Shop 3
Neu 🎉 Neues Plugin: "Versandkosten und Lieferzeit automatisch beziehen - UPS Extension" 🎉 Plugins für JTL-Shop 2
Neu Neues Plugin: Formular Portlet (Drag&Drop Dateiupload by FilePond, Kontakt, Retoure, Reklamation, Gewerbenachweis..) Plugins für JTL-Shop 10
Neu Neues Plugin - Solar Steuerfrei (Mehrwertsteuerbefreiung nach §12 Abs. 3 UStGt für Solar- und Photovoltaikanlagen) Plugins für JTL-Shop 6
Neu Plugin Mail senden - Cc / Bcc Technische Fragen zu Plugins und Templates 4
Neu [Gelöst] IT Rechtskanzlei AGB Plugin Fehler "Plugin wurde nicht gefunden" Plugins für JTL-Shop 4
Neu neues Paypal-Checkout (plugin) verhindert Bestellung - keine Zahlungsarten angezeigt (hängt) Betrieb / Pflege von JTL-Shop 8
Neu Problem mit Plugin-Aktivierung und WooCommerce-Kompatibilität WooCommerce-Connector 2
Neu CiN TrackID-Import Plugin User helfen Usern - Fragen zu JTL-Wawi 12
Neu JTL Shhop Plugin "Exportformat Google Shopping" - falsche Preise im GMC, wenn Staffelpreise vorhanden JTL-Shop - Fehler und Bugs 10
Neu Checkout Postfinance Plugin installieren (Schweiz) Plugins für JTL-Shop 47
Neu Plugin Entwicklung fehler bei isEditMode() Funktion Technische Fragen zu Plugins und Templates 0
Neu 🌟Neues Plugin: Blogbuster - Premium News Verwaltung Plugins für JTL-Shop 0
Neu ist das Hinzufügen eines zusätzlichen Hinweis bei Artikeln, mit bestimmtem Merkmal, die auf die Einkaufsliste wandern möglich ? User helfen Usern - Fragen zu JTL-Wawi 0
Artikel auf Bestellvorschlagsliste hinzufügen JTL-Wawi 1.8 1
Anzeige der VPE neben "Warenkorb hinzufügen" Einrichtung JTL-Shop5 1
Neu Rechnungsdresse Button "Firmendaten hinzufügen" deaktivieren Gelöste Themen in diesem Bereich 5
Neu Nach Attribut hinzufügen lässt sich Artikel nicht öffnen JTL-Wawi - Fehler und Bugs 0
Beim Datei hinzufügen kommt eine Fehlermeldung JTL-Wawi 1.8 3
Neu Kaufland und Otto als Marktplatz hinzufügen Einrichtung und Installation von JTL-eazyAuction 4
1.8.10 - Kein hinzufügen von Bildern im Artikel möglich JTL-Wawi 1.8 14
Neu Amazon.de hinzufügen nicht möglich URL konnte nicht gefunden werden Amazon-Anbindung - Fehler und Bugs 1

Ähnliche Themen