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.881
524
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.881
524
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.881
524
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.369
345
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.881
524
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.881
524
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.881
524
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
4
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 Shop 5.3.x - PHP Fatal Error - PriceRange.php JTL-Shop - Fehler und Bugs 6
Neu Google Bilder Bot Zugriff auf /dbeS/bild.php?a=1375538&n=1&url=0&s=0 Allgemeine Fragen zu JTL-Shop 3
Neu Kleines PHP Skript für MySQL Shop Datenbank Backup - gratis Betrieb / Pflege von JTL-Shop 3
Welche GPSR Plugin-Einstellungen mit WaWi 1.9.6.1 JTL-Wawi 1.9 4
Neu Felder vom neuen Plugin importieren möglich? Shopware-Connector 0
Neu GPSR Plugin für Gambio Connector steht bereit Gambio-Connector 0
Neu DRINGEND Hilfe - Google Analytics Plugin JTL-Shop - Fehler und Bugs 4
Neu PlugIn: JTL GPSR Plugins für JTL-Shop 15
Neu Plugin Suche: Mailchimp Plugins für JTL-Shop 0
Neu Plugin mit transparentem Hintergrund (Auswahlassistent) Plugins für JTL-Shop 1
Neu Probleme mit PayPal-Plugin: Bestellungen "pending" & doppelte Zahlungen nach Direktzahlung Plugins für JTL-Shop 0
Neu Template Dateien Rendern im Plugin Plugins für JTL-Shop 6
Neu 🎉 Neues Plugin: "Versandkosten und Lieferzeit automatisch beziehen - ShipMonk Extension" 🎉 Plugins für JTL-Shop 1
Neu 🎉 Neues Plugin: "Versandkosten und Lieferzeit automatisch beziehen - DHL-Express Extension" 🎉 Plugins für JTL-Shop 3
Neu S: Plugin Dropdown-Menü für meine Kategorien Plugins für JTL-Shop 10
Neu "Warenkorb teilen als Link" Plugin by Visitmedia Plugins für JTL-Shop 2
Neu Das JTL Shop gratis Plugin GPSR Verordnung - sieht mies aus, belastet die Datenbank, Excel Bearbeitung unmöglich Betrieb / Pflege von JTL-Shop 30
Neu PAYONE Plugin keine Bestellabschluss Seite Plugins für JTL-Shop 0
Neu 📢 Neues Plugin: "GPSR Herstellerinformationen" 📢 Plugins für JTL-Shop 31
Neu Anbindung an Idealo mit Plugin gesucht Schnittstellen Import / Export 1
Neu Mollie Plugin und stornierte "Klarna Pay Later" Zahlungsaufforderungen. Plugins für JTL-Shop 0
Neu Plugin: WooCommerce Wallet oder Gutscheine mit JTL nutzen - Fehler in der MwSt User helfen Usern - Fragen zu JTL-Wawi 0
Neu JTL Plugin fuer Wordpress Plugin wirft Error/success Fehler WooCommerce-Connector 2
Neu JTL Google Shopping Plugin - Bilder Updaten Plugins für JTL-Shop 3
Neu Wie andere Länder und Sprachen vom Google Shopping Plugin mit dem Merchant Center verbinden Plugins für JTL-Shop 6
Neu Frage zu Plugin Entwicklung : IO Request im Admin Technische Fragen zu Plugins und Templates 2
Neu Google Shopping Plugin - Artikel filtern Plugins für JTL-Shop 3
Neu Rollenbasiertes Kunden-Plugin (B2B) Plugins für JTL-Shop 1
Neu Frage zur Plugin Entwicklung Plugins für JTL-Shop 3
Neu Eigenes Plugin und der cache.. Plugins für JTL-Shop 3
Neu REST-API - Auftrag erstellen - wie Versandposition hinzufügen? Schnittstellen Import / Export 0
Neu JTL Shop 5.4.0 eigene Inhalte/Seiten hinzufügen nicht möglich JTL-Shop - Fehler und Bugs 5
Neu Kontaktformular auf einer eigenen Seite hinzufügen Allgemeine Fragen zu JTL-Shop 1
Neu Meta-Tag zum HTML-Quellcode hinzufügen Allgemeine Fragen zu JTL-Shop 3
Neu Toplevel-Banner hinzufügen und/oder über Wawi Steuern Allgemeine Fragen zu JTL-Shop 0
Neu Freitextfeld mit der Ameise hinzufügen User helfen Usern - Fragen zu JTL-Wawi 3
Neu Artikel -> Lieferanten -> Zum eigenen Lager hinzufügen User helfen Usern - Fragen zu JTL-Wawi 4
Neu JTL Vorlage eine zweite Seite hinzufügen Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 6
Zahlungsmodul Bank hinzufügen ... Finom JTL-Wawi 1.9 1
Neu Probleme mit Varianten dann Stückliste und beim Hinzufügen ist dann schluss JTL-Wawi - Fehler und Bugs 7
Versandkostenfrei bei hinzufügen eines Bestimmten Artikels Einrichtung JTL-Shop5 2
Neu Eigene Alerts im Template ausgeben bzw. hinzufügen Templates für JTL-Shop 0

Ähnliche Themen