HTML im Beitrag

Heffalump

Bekanntes Mitglied
Lizenzinhaber
Registriert
6. Apr. 2014
Beiträge
945
Punkte
133
XF Version
  1. 2.1.2
PHP-Version
7.3
Provider/Hoster
FC-Hosting
Suche mir einen Wolf.

Gibt es eine Möglichkeit in XF2 HTML im Beitrag zu parsen? Z.B. über die Erstellung eines BB-Codes oder die Textfelder?
Das sollen nur Admins dürfen oder besser nur ich.

Es funktioniert mit dem Editor Manager Addon (Editor & BB Code Manager), aber das verursacht bei mir einen Fehler und scheint nicht einsetzbar.

Irgendwie muss es doch möglich sein HTML zu parsen....

Ich möchte bei Bedarf einen Widget Code eingeben können, der individuell erstellt wird und so aussieht:

Code:
<div data-wid="RXQ0C" data-task="listings/one" data-id="301" data-userrating="1" data-readreviews="1" data-writereview="1" data-photolayout="contacts" data-photos="1"></div>
<script>(function(d,o,j,w,m){w=d.createElement(o),m=d.getElementsByTagName(o)[0];
w.async=1;w.src=j;m.parentNode.insertBefore(w,m)
})(document,'script','https://www.kuechen-forum.de/components/com_jreviews_addons/widgetfactory/views/js/widget.loader.min.js');</script>
 
Erstelle einen BB-Code mit Callback

BB Code tag: method
Replacement method: PHP-callback:
Supports option parameter: no

Callback: XF\_CustomWork\BBCode :: getBBCode

Nun erstelle unter src/XF/_CustomWork (Verzeichnis mußt du anlegen) eine PHP Datei BBCode.php mit folgendem Inhalt:

PHP:
<?php

namespace XF\_CustomWork;

use XF\BbCode\Renderer\AbstractRenderer;

class BBCode
{
    public static function getBBCode($tagChildren, $tagOption, $tag, array $options, AbstractRenderer $renderer)
    {
        $postEntity = $options['entity'];
      
       $errorReturn = $tag['original'][0] . htmlspecialchars($tag['children'][0]). $tag['original'][1];
      
        // nur User-Id = 1 zulassen
      
        if($postEntity->user_id != 1)
        {
            return $errorReturn;
        }
      
        $method = $tag['children'][0];
      
        if($method == 'getBBCode')
        {
            return $errorReturn;     
        }
      
        if(method_exists(__CLASS__, $method))
        {
            return call_user_func("self::$method", $tagChildren, $tagOption, $tag, $options, $renderer);
        }
      
        return $errorReturn;
    }
  
    protected static function admin1($tagChildren, $tagOption, $tag, array $options, AbstractRenderer $renderer)
    {
        return 'TEST <div data-wid="RXQ0C" data-task="listings/one" data-id="301" data-userrating="1" data-readreviews="1" data-writereview="1" data-photolayout="contacts" data-photos="1"></div>
<script>(function(d,o,j,w,m){w=d.createElement(o),m=d.getElementsByTagName(o)[0];
w.async=1;w.src=j;m.parentNode.insertBefore(w,m)
})(document,\'script\',\'https://www.kuechen-forum.de/components/com_jreviews_addons/widgetfactory/views/js/widget.loader.min.js\');</script>';
    }
}

Der BB-Code lautet dann wie folgt:

[method]deineMethode[/method]

Für deineMethode kannst du beliebig viele Methoden (Funktionen) in der Klasse anlegen, die den jeweiligen HTML-Code ausgeben. Die Userabfrage kannst du auch method-bezogen einfügen. Du müßtest dann die entsprechende Codezeile aus der Methode getBBCode entfernen und bei den eigenen Methoden einfügen.

Im vorliegenden Beispiel heißt die Methode dann admin1 und der vollständige der BB-Code dann [method]admin1[/method] und gibt dein obiges HTML aus. Achte darauf, Single- oder Doublequotes im HTML-Code je nach Erfordernis durch Backslash zu escapen.

Nachtrag: Error im Code gefixed.
 
Zuletzt bearbeitet:
Danke Boothby,

aber das ist mir zu einfach. Geht es nicht noch komplizierter? :D

Puh.... Ich habe ja keine Ahnung davon, aber der BB-Code sieht mir so aus als ob damit immer das gleiche Widget eingeblendet wird. Diese Widgets, die ich einbinden möchte, sollen aber bei Bedarf individuell konfiguriert werden und dann an entsprechender Stelle eingebunden werden.

Da stelle ich mir einen BB-Code vor, der mir als admin erlaubt diesen individuellen Code in Tags zu setzen und er wird ausgeführt. Quasi einen HTML-BB-Code, der das HTML parst. Geht das auch?

Hier ist der Link zur Seite wo der Code generiert wird:
Küchen-Forum Widgets für Ihre Homepage - Einzelner Beitrag

Du kannst jetzt oben im Feld z.B. eingeben "Küchenstudio sonstwas" eines davon auswählen und das Widget wird angezeigt wie es erscheinen soll. Dann generiert man den Code dafür und dieser soll dann im Post eingegeben werden können um das Widget anzuzeigen.
 
Weitere Widgets hinzuzufügen ist doch kein Problem,

Erstelle einfach eine neue Methode, z.B. admin2

PHP:
    protected static function admin2($tagChildren, $tagOption, $tag, array $options, AbstractRenderer $renderer)
    {
        return '<div>Hallo Welt</div>';
    }

Einzufügen in Posts dann analog oben wie folgt: [method]admin2[/method]

usw. usf.
 
Da stelle ich mir einen BB-Code vor, der mir als admin erlaubt diesen individuellen Code in Tags zu setzen und er wird ausgeführt. Quasi einen HTML-BB-Code, der das HTML parst. Geht das auch?
Gehen tut alles und wenn man sich eine potentielle Sicherheitslücke einbauen will, dann macht man folgendes:

Du erstellst wie oben beschrieben deine Datei. Erzeugst den BB-Code mit PHP Callback, z.B. [admin][/admin] mit folgendem Callback:

XF\_CustomWork\BBCode :: getAdminHTMLCode

PHP:
<?php

namespace XF\_CustomWork;

use XF\BbCode\Renderer\AbstractRenderer;

class BBCode
{
   public static function getAdminHTMLCode($tagChildren, $tagOption, $tag, array $options, AbstractRenderer $renderer)
   {
       $postEntity = $options['entity'];
      
       $errorReturn = $tag['original'][0] . htmlspecialchars($tag['children'][0]). $tag['original'][1];
      
       // nur User-Id = 1 zulassen
      
       if($postEntity->user_id == 1)
       {
           return $tag['children'][0];
       }
       else
       {
           return $errorReturn;
       }
   }

   public static function getBBCode($tagChildren, $tagOption, $tag, array $options, AbstractRenderer $renderer)
   {
       $postEntity = $options['entity'];
      
       $errorReturn = $tag['original'][0] . htmlspecialchars($tag['children'][0]). $tag['original'][1];
      
       // nur User-Id = 1 zulassen
      
       if($postEntity->user_id != 1)
       {
           return $errorReturn;
       }
      
       $method = $tag['children'][0];
      
       if($method == 'getBBCode')
       {
           return $errorReturn;      
       }
      
       if(method_exists(__CLASS__, $method))
       {
           return call_user_func("self::$method", $tagChildren, $tagOption, $tag, $options, $renderer);
       }

       // Widget deaktivieren? Einfach ein Underscore davor setzen, z.B. protected static _admin1(...
       if(method_exists(__CLASS__, '_' . $method))
       {
           // dann leeren String zurück
           return '';
       }
      
       return $errorReturn;
   }

    protected static function admin1($tagChildren, $tagOption, $tag, array $options, AbstractRenderer $renderer)
    {
        return 'TEST <div data-wid="RXQ0C" data-task="listings/one" data-id="301" data-userrating="1" data-readreviews="1" data-writereview="1" data-photolayout="contacts" data-photos="1"></div>
<script>(function(d,o,j,w,m){w=d.createElement(o),m=d.getElementsByTagName(o)[0];
w.async=1;w.src=j;m.parentNode.insertBefore(w,m)
})(document,\'script\',\'https://www.kuechen-forum.de/components/com_jreviews_addons/widgetfactory/views/js/widget.loader.min.js\');</script>';
    }
  
   protected static function admin2($tagChildren, $tagOption, $tag, array $options, AbstractRenderer $renderer)
   {
       return '<div>Hallo Welt</div>';
   }
}

Aufzurufen dann wie folgt:

[admin]<div>Hallo Welt</div>[/admin]
 
Danke Boothby,

die zweite Methode klingt geil und ich werde das mal ausprobieren. Der Hinweis mit der potenziellen Sicherheitslücke ist auch gerechtfertigt, aber ich nehme das mal in Kauf. Es kennt ja niemand diese Funktion (Außer ihr jetzt hier.... :oops:)

Muchas Gratias Senor.
 
Zurück
Oben