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
523
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
523
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
523
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.365
341
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
523
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
523
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
523
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 Update auf 5.3.3 - JTL Widgets erzeugt Fehler in CampaingController.php JTL-Shop - Fehler und Bugs 2
Neu Läuft der JTL-Shop 4 mit der PHP Version 8.2.20 ??? Einrichtung von JTL-Shop4 2
Neu IT-Recht Kanzlei Plugin fügt immer die Datenschutzerklärung mit in die Mails ein. Plugins für JTL-Shop 5
Neu JTL Google Shopping Plugin - Farbe und Größe bei mehreren Sprachen Plugins für JTL-Shop 0
Neu DHL Wunschzustellung Plugin Plugins für JTL-Shop 0
Neu Payone Plugin Zahlungen werden abgebucht aber keine Aufträge erstellt Plugins für JTL-Shop 0
Neu PayPal Checkout Plugin Update Arbeitsabläufe in JTL-Wawi 1
Neu Webstollen EU-Cookie Plugin ab 1.7. nicht mehr für Shop4 ? Plugins für JTL-Shop 19
Neu PayRexx jetzt mit eigenem Plugin für den JTL-Shop Plugins für JTL-Shop 2
Neu Anfrage bezüglich Popup-Plugin für JTL-Shop Plugins für JTL-Shop 1
google shopping plugin - Grundpreis + Sonderpreis Gelöste Themen in diesem Bereich 10
Neu 📢 Neues Plugin "Zahlungsarten kopieren" by NETZdinge.de Plugins für JTL-Shop 1
Neu suche Plugin Kategorien/Artikel ausblenden pro User Plugins für JTL-Shop 1
Neu eMail Adresse ändern PayPal Plugin Plugins für JTL-Shop 0
Neu Gesucht: Plugin, das beim Klick auf "zur Kasse" ein Zusatz-Produkt vorschlägt Plugins für JTL-Shop 4
Neu Google-Shopping-Plugin Fehler Plugins für JTL-Shop 0
Neu JTL und die Sparchdatei Base.mo im Plugin Technische Fragen zu Plugins und Templates 6
Neu Lieferzeit in google shopping plugin Technische Fragen zu Plugins und Templates 0
Neu Plugin Upload Error Allgemeine Fragen zu JTL-Shop 6
Neu Hilfe - Bin nach Plugin-Update(s) ausgesperrt und Shop nicht aufrufbar Allgemeine Fragen zu JTL-Shop 6
Neu Probleme mit Erfassung von Käufen google ads Netzdinge Plugin Allgemeine Fragen zu JTL-Shop 9
Neu Neues Plugin "Stars2Tab" by NETZdinge.de Plugins für JTL-Shop 0
Neu Plugin zum testen wird nicht angezeigt Allgemeine Fragen zu JTL-Shop 1
Neu Template des Adminmenus im Plugin zeigt keine Variablen an Technische Fragen zu Plugins und Templates 6
Neu Anfrage: Sendy Plugin für JTL Shop 5 Plugins für JTL-Shop 0
Neu Plugin Konfigurator für Breite x Höhe Plugins für JTL-Shop 6
Neu JTL PayPal: Plugin - Bestellungen werden nicht angezeigt. Fehlermeldung "Unable to load config 'file:.conf'" Plugins für JTL-Shop 2
INSERT FK_Verkauf_tAuftragPosition_kSteuerschluessel nach Hinzufügen von EU-Steuersätzen für OSS JTL-Wawi 1.9 0
Neu Rechnung erstellen - Zahlung hinzufügen - Ausliefern User helfen Usern - Fragen zu JTL-Wawi 2
Druck- / Email- / Exportvorlagen - Lieferschein neue Vorlage Hinzufügen lässt sich mit wawi 1.9.4.6 nicht mehr öffnen (absturz) JTL-Wawi 1.9 1
Frachtkosten bei Lieferantenbestellung (Import über Ameise) hinzufügen JTL-Wawi 1.7 0
Neu Lokale JTLs zur gehosteten hinzufügen Installation von JTL-Wawi 6
Hinzufügen eines Artikels in gemappte Wawi Kategorie setzt nicht Verkaufskanalkategorie?!? kaufland.de - Anbindung (SCX) 1
Neuen Ausgabeweg allen Artikeln hinzufügen JTL-Wawi 1.8 0
Varkombikind hinzufügen nicht möglich Otto.de - Anbindung (SCX) 4
Neu Ebay neue Farben hinzufügen eBay-Anbindung - Fehler und Bugs 8
Neu Weiteres Icon zu shop-nav nav-right hinzufügen Templates für JTL-Shop 1

Ähnliche Themen