Hallo, Gast! (Registrieren)

Wir wünschen allen Besuchern frohe Ostern!

Letzte Ankündigung: MyBB 1.8.20 veröffentlicht (27.02.19)


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
Spoiler mit Gruppenrechten
#1
Wir nutzen MySpoiler im Forum https://www.mybb.de/erweiterungen/18x/pl...-spoiler2/, das nur vorne weg; ich habe kein Problem damit, ein anderes Spoiler-Plugin zu nehmen.

Gibt es ein Spoiler-Plugin, bei dem man über die Gruppenrechte einschränken kann, so dass bestimmte Gruppen (z.B. Gäste) die Spoiler nicht öffnen können?

Oder hat jemand eine Idee, wie man das sonst bewerkstelligen kann?
schönen Gruß
bv64 / Lu

kein Support per PN, Mail, Messenger etc.
still alive

Zitieren
#2
Nabend,

"Nicht öffnen" wird etwas schwieriger. Müsste mir dazu den Code vom Plugin mal angucken. Man könnte durch ein zusätzliches Plugin jede Nachricht durchsuchen und den Text zwischen den zwei Tags
[spoiler][/spoiler] löschen oder halt durch anderen Text ersetzen, z. B. "Nicht erlaubt diesen Inhalt zu sehen"..

Wüsste (noch) nicht genau wie man das "öffnen" verhindert. Jemand sonst eine Idee?
My  PHP-Version: 7.3.1 | MySQL-Version: 5.7.21
My  Plugins: Hide urls/links for specific usergroups
(see more/all)




Zitieren
#3
man müsste verhindern, dass für die betroffenen Gruppen der Button zum öffnen des Spoilers angezeigt wird

Ich schlaf mal eine Nacht drüber, oft hab ich dann irgendwann eine Idee Big Grin Aber ich hoffe auf die Schwarmintelligenz Wink

edit: Schlaf war nicht nötig

in der Plugin-Datei folgendes geändert:
Code:
while(preg_match('#\[spoiler\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>'.$lang->my_spoiler_spoil.':</div>
        <div class="spoiler_content" style="display: none;">$1</div>
    </div>',$message);

    // Creamos el MyCode complejo con comillas: [spoiler="título aquí"]contenido aquí[/spoiler]

    while(preg_match('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>$1:</div>
        <div class="spoiler_content" style="display: none;">$2</div>
    </div>',$message);

    // Creamos el MyCode complejo sin comillas: [spoiler=título aquí]contenido aquí[/spoiler]

    while(preg_match('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>$1:</div>
        <div class="spoiler_content" style="display: none;">$2</div>
    </div>',$message);

    return $message;

zu:
Code:
if($mybb->user['uid'] > 0) {
    while(preg_match('#\[spoiler\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>'.$lang->my_spoiler_spoil.':</div>
        <div class="spoiler_content" style="display: none;">$1</div>
    </div>',$message);

    // Creamos el MyCode complejo con comillas: [spoiler="título aquí"]contenido aquí[/spoiler]

    while(preg_match('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>$1:</div>
        <div class="spoiler_content" style="display: none;">$2</div>
    </div>',$message);

    // Creamos el MyCode complejo sin comillas: [spoiler=título aquí]contenido aquí[/spoiler]

    while(preg_match('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>$1:</div>
        <div class="spoiler_content" style="display: none;">$2</div>
    </div>',$message);

    return $message;
    } else {
    while(preg_match('#\[spoiler\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title">'.$lang->my_spoiler_spoil.':</div>
        <div class="spoiler_content" style="display: none;">$1</div>
    </div>',$message);

    // Creamos el MyCode complejo con comillas: [spoiler="título aquí"]contenido aquí[/spoiler]

    while(preg_match('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title">$1:</div>
        <div class="spoiler_content" style="display: none;">$2</div>
    </div>',$message);

    // Creamos el MyCode complejo sin comillas: [spoiler=título aquí]contenido aquí[/spoiler]

    while(preg_match('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si',$message))
    $message = preg_replace('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si','<div class="spoiler">
        <div class="spoiler_title">$1:</div>
        <div class="spoiler_content" style="display: none;">$2</div>
    </div>',$message);    
}

}
Also einfach geprüft, ist es ein User oder Gast und für die Gäste den kompletten Button-Link eliminiert Wink
Nicht schön, aber wirkungsvoll; allerdings kann man über den Seitenquelltext die Spoiler immer noch lesen, hm, gefällt mir nicht

edit2: ok das $2 noch raus genommen und durch eigenen Text ersetzt, der im Quelltext dann erscheint Wink
schönen Gruß
bv64 / Lu

kein Support per PN, Mail, Messenger etc.
still alive

Zitieren
#4
(14.04.2019, 23:27)bv64 schrieb: man müsste verhindern, dass für die betroffenen Gruppen der Button zum öffnen des Spoilers angezeigt wird

Ich schlaf mal eine Nacht drüber, oft hab ich dann irgendwann eine Idee Big Grin Aber ich hoffe auf die Schwarmintelligenz Wink

Das mit dem Schlafen unterschreibe ich genau so Wink naja, selbst wenn der öffnen Button weg ist muss überprüft werden ob der Inhalt trotzdem schon im Quellcode geladen wurde. Wenn ja, macht das kaum Sinn.
My  PHP-Version: 7.3.1 | MySQL-Version: 5.7.21
My  Plugins: Hide urls/links for specific usergroups
(see more/all)




Zitieren
#5
siehe mein edit Wink
schönen Gruß
bv64 / Lu

kein Support per PN, Mail, Messenger etc.
still alive

Zitieren
#6
Hallo bv64,

du kannst das ganze auch direkt für Benutzergruppen abfragen. Dazu sind nur einige Zeilen Code notwendig. Eine komfortablere Einstellung der Benutzergruppenrechte im Backend spare ich mir mal an dieser Stelle. Aber vielleicht hilft dir die kleine Codemodifikation ja auch schon weiter...

Suche in der Plugindatei folgendes:
Code:
function myspoiler_run(&$message)
{
global $db, $lang, $mybb;
   $lang->load("my_spoiler", false, true);

// Creamos el MyCode simple: [spoiler]contenido aquí[/spoiler]

while(preg_match('#\[spoiler\](.*?)\[\/spoiler\]#si',$message))
$message = preg_replace('#\[spoiler\](.*?)\[\/spoiler\]#si','<div class="spoiler">
<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>'.$lang->my_spoiler_spoil.':</div>
<div class="spoiler_content" style="display: none;">$1</div>
</div>',$message);

// Creamos el MyCode complejo con comillas: [spoiler="título aquí"]contenido aquí[/spoiler]

while(preg_match('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si',$message))
$message = preg_replace('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si','<div class="spoiler">
<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>$1:</div>
<div class="spoiler_content" style="display: none;">$2</div>
</div>',$message);

// Creamos el MyCode complejo sin comillas: [spoiler=título aquí]contenido aquí[/spoiler]

while(preg_match('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si',$message))
$message = preg_replace('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si','<div class="spoiler">
<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\''.$lang->my_spoiler_show.'\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\''.$lang->my_spoiler_hide.'\'; }">'.$lang->my_spoiler_show.'</span>$1:</div>
<div class="spoiler_content" style="display: none;">$2</div>
</div>',$message);

return $message;
}

und ersetze mit folgendem Code:
Code:
function myspoiler_run(&$message) {
   global $db, $lang, $mybb;
   $lang->load("my_spoiler", false, true);
   // Array Nicht erlaubte Benutzergruppen
   $nichterlaubt = array(1);
   // Array Ende
   // Creamos el MyCode simple: [spoiler]contenido aquí[/spoiler]
   // Abfrage der Benutzergruppen die den Spoiler nicht sehen dürfen
   if (in_array($mybb->usergroup['gid'], $nichterlaubt)) {
       $message = "<div class=\"spoiler_content\" style=\"color: red;\">Hier versteckt sich ein Spoiler! Den kannst du aber leider mit deinen mickrigen Benutzerrechten nicht sehen...</div>";
   // Ende der Abfrage und Ausgabe der alternativen Meldung für nicht berechtigte Usergruppen

   } else {
    // Falls GID nicht im Array vorhanden, zeige den Spoiler. Die Gruppe darf den Spoiler also sehen.
       while (preg_match('#\[spoiler\](.*?)\[\/spoiler\]#si', $message)) {
           $message = preg_replace('#\[spoiler\](.*?)\[\/spoiler\]#si', '<div class="spoiler">
       <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\'' . $lang->my_spoiler_show . '\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\'' . $lang->my_spoiler_hide . '\'; }">' . $lang->my_spoiler_show . '</span>' . $lang->my_spoiler_spoil . ':</div>
       <div class="spoiler_content" style="display: none;">$1</div>
   </div>', $message);
       }

       // Creamos el MyCode complejo con comillas: [spoiler="título aquí"]contenido aquí[/spoiler]

       while (preg_match('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si', $message)) {
           $message = preg_replace('#\[spoiler="(.*?)"\](.*?)\[\/spoiler\]#si', '<div class="spoiler">
       <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\'' . $lang->my_spoiler_show . '\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\'' . $lang->my_spoiler_hide . '\'; }">' . $lang->my_spoiler_show . '</span>$1:</div>
       <div class="spoiler_content" style="display: none;">$2</div>
   </div>', $message);
       }

       // Creamos el MyCode complejo sin comillas: [spoiler=título aquí]contenido aquí[/spoiler]

       while (preg_match('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si', $message)) {
           $message = preg_replace('#\[spoiler=(.*?)\](.*?)\[\/spoiler\]#si', '<div class="spoiler">
       <div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display == \'block\'){ parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'none\'; this.innerHTML=\'' . $lang->my_spoiler_show . '\'; } else { parentNode.parentNode.getElementsByTagName(\'div\')[1].style.display = \'block\'; this.innerHTML=\'' . $lang->my_spoiler_hide . '\'; }">' . $lang->my_spoiler_show . '</span>$1:</div>
       <div class="spoiler_content" style="display: none;">$2</div>
   </div>', $message);
       }

       return $message;
   }
}

In das Array $nichterlaubt trägst du dann die IDs der Benutzergruppen ein die den Spoiler nicht sehen dürfen sollen. In meinem Beispiel ist das die GID 1, also Gäste. Die Farbe des Textes (rot) sowie den Text selber der erscheinen soll, kannst du natürlich entsprechend anpassen. Ist alles ein wenig dokumentiert wo was gemacht wird. Smile
Cheers
Zitieren
#7
@The Incredible danke für deine Mühe; die anderen Usergruppen werden ja schon über die Gruppenrechte gesteuert, ob sie die Sachen lesen dürfen oder nicht; das Problem sind aktuell nur die Gäste.
Ich habe inzwischen auch noch weiter überarbeitet; es reicht vollkommen im neuen Bereich für die Gäste das $2 (bei Variante 2 und 3) bzw. das $1 (bei Variante 1) durch eigenen Text zu ersetzen. Der Button bleibt dann erhalten und der Text wird eben durch eigenen ersetzt.

Aber aktuell ist das bei uns eh wieder vom Tisch; man kann ein Problem gar nicht gründlich genug durchdenken. Schnellschüsse beinhalten immer die Gefahr, etwas Relevantes zu übersehen.
Aber für den Fall, dass wir uns dazu durch ringen, habe ich nun eine feine und praktikable Lösung und wer es für Gruppen braucht, kann sich bei The Incredible bedienen Wink
schönen Gruß
bv64 / Lu

kein Support per PN, Mail, Messenger etc.
still alive

Zitieren
#8
Kein Probem. Smile
Ist ja nichts aufwendiges gewesen. Von daher... Wenn es so jemand nutzen möchte kann er/sie das natürlich gerne machen.
Cheers
Zitieren
#9
Hab mir gerade mal paar Minuten genommen, vielleicht hilft es dir ja weiter.. 

Für Gäste (also alle mit User-ID 0) wird nun folgendes angezeigt: 

   

Kannst die Datei einfach Copy&Paste ersetzen.


/edit:
Hab deinen letzten Beitrag nicht 100% verstanden, kann natürlich sein, dass du bereits fündig geworden bist.  Ansonsten können sich andere dran bedienen.  Big Grin


Angehängte Dateien
.php   myspoiler.php (Größe: 10,45 KB / Downloads: 5)
My  PHP-Version: 7.3.1 | MySQL-Version: 5.7.21
My  Plugins: Hide urls/links for specific usergroups
(see more/all)




Zitieren
#10
genau meine Lösung, Jay Wink
Nur dass ich das eben mit einer Abfrage ob Gast oder nicht um den kompletten Block gemacht habe und nicht nur jede Variante des Spoilers einzeln. Das Resultat sieht identisch aus Wink

Ich war die Nacht nur zu faul, das hier noch mal auseinander zu klamüsern, wie sie jetzt aussieht; etwas viel Stress zur Zeit, viel zu wenig Schlaf und dann noch solche "Probleme"...

Auch dir danke für deine Mühe Wink
Immerhin sieht es aktuell so aus, als wäre die Arbeit doch nicht umsonst gewesen; der Rest des Teams arbeitet dran, dass wir mit der Lösung auch online gehen können Big Grin
schönen Gruß
bv64 / Lu

kein Support per PN, Mail, Messenger etc.
still alive

Zitieren