PHP8 Script im Beitrag mit Parameterübergabe

  • Hallo, Gemeinschaft!


    Ich möchte automatisiert im Beitrag 1-8 Tabellen mit Text und Bild darstellen. Ich habe ein Problem, da die Sicherheitsmechanismen in Joomla 5 mich dabei einschränken. In Summe werden es ca. 160 Tabellen in 40 Beiträgen.

    Ich benutze das Helixultimate Template.


    Habe ein Script im Ordner '/templates/shaper_helixultimate/js/ verortet'.

    mj_tab.txt

    Im Benutzerdefinierten Modul kann ich das Script problemlos starten, allerdings fehlt der Parameter mit dem Suchstring, z.B. '1.002.'

    PHP
    {source}<?php
    
    // Startbasis für scripte im Modul
    $tabScript = './templates/shaper_helixultimate/js/mj_tab.php';
    echo "<br />" . "Tabelle mit $tabScript aus .csv Datei!\n<br />";
    //phpinfo();
    
    include $tabScript;
    
    ?>{/source}

    Der Versuch im Beitrag das Script zu starten, funktioniert nicht (weil unterbunden):

    PHP
    {source}<?php
    drawTable('1.002.');
    /php>{/source}

    Auch mit include geht es nicht. Habe Parameterübergabe mit Environment Variable und get() probiert. Es ging nicht, vermutlich habe ich es falsch gemacht.


    Habe schon ein Contend Plugin erstellt und geladen, auch dann steht 'drawTable()' nicht zur Verfügung.

    Alles andere mit Plugins überfordert mich schon etwas.

    Das etwas onContentPrepare() ausgeführt wird, wäre gut zum Laden des Ganzen .csv Files. Im Beitrag an geeigneter Stelle möchte ich dann eben die Tabelle hingeklatscht haben - mit dem passenden Suchstring.

    mj_dimtab.xml.txt - mj_dimtab.php.txt


    Habe schon stundenlang das Web durchforstet, und finde kein geeigneteres Muster, das ich auch verstehe und umsetzen kann.

    Kann mir bitte jemand damit helfen ?


    LG Rudolf

    Was ich schon alles wieder vergessen habe, müssen die Jungen erst mal lernen... thinking

  • PHP
    {source}<?php
    include getcwd() . "/templates/shaper_helixultimate/js/mj_tab.php";
    drawTable( '1.190.' );
    ?>{/source}

    Nachdem ich das probiert habe, funktioniert es für mich. Interessanterweise hat das bevor dem Versuch mit der Plugin-Variante und mit Verzeichnis "./templates/..." nicht funktioniert.

    Allerdings ist es laut Forenaussagen nicht sicher, ein Script so reinzuhängen. Besser wäre das Eventsystem. Hat jemand die bessere Lösung ?

    Danke schon mal im Voraus.


    LG Rudolf

    Was ich schon alles wieder vergessen habe, müssen die Jungen erst mal lernen... thinking

  • Habe das Script umgebaut auf extending CMSPlugin class, wie als "contentplugindemo" gepostet.

    Wenn Compilerfehler eingebaut sind, meckert es als Fehlermeldung in System/Erweiterungen, gibt auch mal einen red screen in jedem Beitrag auf Joomla.

    Wo nun scheinbar alle Fehler debugged sind, tut es einfach - nichts. hmm


    Habe Joomla 5.0.3, PHP8, Firefox Browser.


    Ich kann weder mit echo eine Meldung ausgeben, noch $article->test verändern.

    Was passiert hier ? Kann bitte hier jemand drüberschauen ?


    LG Rudolf

  • Dateipfad überprüfen: Stelle sicher, dass der Dateipfad zu mj_tab.php korrekt ist. Verwende den vollen Pfad oder überprüfe, ob sich die Datei im selben Verzeichnis wie das aktuelle Skript befindet.

    Code
    $tabScript = './templates/shaper_helixultimate/js/mj_tab.php';

    Fehlerberichterstattung aktivieren: Überprüfe, ob PHP-Fehlerberichterstattung aktiviert ist. Füge die folgenden Zeilen am Anfang deines Skripts hinzu, um PHP-Fehler anzuzeigen:

    Code
    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    Dadurch werden PHP-Fehlermeldungen direkt auf der Seite angezeigt aber das ist dir bestimmt bekannt.

    Dateiberechtigungen überprüfen:

    Stelle sicher, dass die Dateiberechtigungen für mj_tab.php richtig gesetzt sind. Die Datei sollte lesbar für den Webserver oder den PHP-Prozess sein.

    Inhalt von mj_tab.php überprüfen:

    Überprüfe den Inhalt von mj_tab.php auf Syntaxfehler oder andere Probleme. Stelle sicher, dass es keine Direktausgaben gibt, die die Header-Ausgabe stören könnten. Wenn die Datei mj_tab.php selbst Fehler enthält, kann dies dazu führen, dass die Ausgabe unterbunden wird.

    Header-Ausgaben überprüfen: Stelle sicher, dass es keine vorherigen Header-Ausgaben vor dem echo gibt. Header müssen vor jeder Ausgabe erfolgen, andernfalls wird die Ausgabe blockiert.


    Das sind aber nur Ansatzpunkte für dich. Mehr kann ich dazu auch nicht schreiben.

    Vielleicht kommt ja noch was von anderen im Forum.

  • Hallo Dirk,


    Danke für die schnelle Reaktion. Die mj_tab.php läuft, allerdings ab und zu red screen wenn die Funktionen redeklariert wurden, d.h. das Script läuft an anderer stelle mehrfach. Deshalb habe ich alles auf class umgeschrieben, und mit

    final class PlgContentMjDimtab extends CMSPlugin

    {

    und mit

    public function onContentPrepare($context, &$article, &$params, $page = 0)

    {

    aufgerufen. Siehe mj_dimtab.php.txt (#3 vom Dialog). Das Plugin läßt sich einwandfrei installieren, und gibt dann auch keine Compilerfehler aus. Nur verändert es nie was am Output des Beitrages...


    Irgendwie passt das Thema nunmehr wohl eher in die Beitragsrubrik "Plugins" ...


    Werde heute abend der Reihe nach Deine Vorschläge überprüfen. :)


    LG Rudolf

    Was ich schon alles wieder vergessen habe, müssen die Jungen erst mal lernen... thinking

  • Hallo Dirk,


    Dateipfad überprüfen:

    /plugins/content/mj_dimtab/mj_dimtab.php

    Hat Joomla selbst dort installiert.


    Fehlerberichterstattung aktivieren:

    Debugger in Joomla ist Aktiviert. Habe noch Reporting von Standard auf Maximum gesetzt.


    Dateiberechtigungen überprüfen:

    Wenn ich im Script ein paar ))))) zuviel einfüge, meckert im "Erweiterungen verwalten" der Compiler. Also lesbar.

    Hatte auch schon Red Screens auf dem Home-Beitrag.


    Inhalt von mj_dimtab.php überprüfen:

    Verwende nur echo oder manipuliere articel->text ?


    Header-Ausgaben überprüfen:

    Verwende header() nicht. Wenn ichs probeweise tue, vor echo, hilft es auch nix.


    Nochmals das aktuelle, etwas verbastelte script.


    LG Rudolf



  • Ich versuchs mal auf die Schnelle:

    In der Methode get_csvFile() fehlt der Pfeil (Arrow Operator) vor $this:

    Statt:

    Code
    return this->csvFile;

    Sollte es heißen:

    Code
    return $this->csvFile;

    In der Methode onContentPrepare() gibt es einen Typo in der Verwendung von $this->$tabAnz. Es sollte $this->tabAnz sein:

    Statt:

    Code
    $this->$tabAnz = preg_match_all('/{dimTab.*?\/dimTab}/s', $article->text, $matches);

    Sollte es heißen:

    Code
    $this->tabAnz = preg_match_all('/{dimTab.*?\/dimTab}/s', $article->text, $matches);

    In der Methode drawTable() gibt es einen Fehler in der Verwendung von str_starts_with(). Die Funktion str_starts_with() erfordert PHP 8.0 oder höher. Wenn Du eine ältere PHP-Version verwendest, kannst du strpos() verwenden:

    Statt:

    Code
    if( str_starts_with( $row[0], $search ) ) {

    Sollte es heißen:

    Code
    if( strpos( $row[0], $search ) === 0 ) {


    In der Methode drawTable() wird die Methode isGraf() aufgerufen, aber sie gehört nicht zur Klasse. Du könntest dies in der Klasse definieren oder die Funktion global definieren.


    Du könntest dich auch einmal bei CodePen anmelden und dort testen.

    Ich denke das geht hier im Forum etwas zu tief in die Entwicklung.

    CodePen
    An online code editor, learning environment, and community for front-end web development using HTML, CSS and JavaScript code snippets, projects, and web…
    codepen.io

  • Hallo Dirk,


    ich dachte ich hätte vorher schon alle this->that und $this->$that Typos erwischt. Leider nicht <X. Sehr Nachlässig von mir. Habe schon Augenkrebs.

    Das Script (ohne Klasse) lief vorher schon einwandfrei am Webserver mit PHP8.


    Bei Code Pen hab' ich mich angemeldet, ist sehr cool. PHP scripts kann ich dort aber nicht laufen lassen ?


    Nach der Fehlerbehebung konnte ich noch immer keinen Output im Beitrag erzeugen. Entweder ist noch min. ein Fehler da, oder ich habe die onContentPrepare() Methoden von J5 fehlerhaft benutzt. Ohne Output schwer zu fassen.


    :S Vielen Dank auf jeden Fall !


    LG Rudolf

    Was ich schon alles wieder vergessen habe, müssen die Jungen erst mal lernen... thinking

  • Hallo Dirk,


    ich denke ich hab's gefunden: Statt

    PHP
    class PlgContentMjDimtab extends CMSPlugin {

    muß es heißen:

    PHP
    class PlgContentMj_dimtab extends CMSPlugin {

    weil das im Manifest (.xml) der Name des Scriptes ist - ergo auch das der Klassenname sein muß. Siehe:

    J4 Creating a Plugin for Joomla. Achtung! Die Anfänge der einzelnen Datensegmente sollen aber schon Uppercase sein...

    PHP
    class Plg<PluginGroup><PluginName> extends CMSPlugin implements SubscriberInterface {

    Die Schreibweise hier ist strenger als eine Domina ;)


    Jetzt bekomme ich jede Menge weitere Fehlermeldungen wenn ich in TinyMCE den Beitrag speichere, da dann mein Plugin aktiviert wird. Darauf gekommen bin ich durch diesen Link: J4 Plugin example. Danke mal dafür. Wer liest ist klar im Vorteil.


    Nun kann ich abends gemütlich weiterentwickeln...


    LG Rudolf

    Was ich schon alles wieder vergessen habe, müssen die Jungen erst mal lernen... thinking