HTML im Beitrag

Dieses Thema im Forum "Diskussionen rund um XenForo" wurde erstellt von Heffalump, 26. Aug. 2018.

  1. Heffalump

    Heffalump Bekanntes Mitglied Lizenzinhaber

    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 (Text):


    <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>
     
  2. Boothby

    Boothby Aktives Mitglied Lizenzinhaber

    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: 2. Sep. 2018
    Masetrix, Tamara-Jasmin und McAtze gefällt das.
  3. Heffalump

    Heffalump Bekanntes Mitglied Lizenzinhaber

    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.
     
  4. Boothby

    Boothby Aktives Mitglied Lizenzinhaber

    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.
     
  5. Boothby

    Boothby Aktives Mitglied Lizenzinhaber

    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]
     
  6. Heffalump

    Heffalump Bekanntes Mitglied Lizenzinhaber

    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.
     
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden