Hyperlinks für bestimmte Rollen verbieten/ausblenden
Eingetragen von stixer2 (113)
am 03.04.2015 - 13:43 Uhr in
am 03.04.2015 - 13:43 Uhr in
Hi.
Ich habe 2 User-Rollen: 1=Basic und 2=Premium.
Basic-user dürfen keine Links veröffentlichen. Das habe ich mit field-validation und folgendem script gelöst:
$mystring = $this->value;
$arr = array("http", "https", "www", ".com", ".org", ".net", ".info", ".mil", ".mobi", ".edu", ".gov", ".biz", ".ac", ".ad", ".ae", ".af", ".ai", ".al", ".am", ".ao", ".aq", ".ar", ".as", ".at", ".au", ".aw", ".ax", ".az", ".ba", ".bb", ".bd", ".be", ".bf", ".bg", ".bh", ".bi", ".bj", ".bm", ".bn", ".bo", ".br", ".bs", ".bt", ".bw", ".by", ".bz", ".ca", ".cc", ".cd", ".cf", ".cg", ".ch", ".ci", ".ck", ".cl", ".cm", ".cn", ".co", ".cr", ".cu", ".cv", ".cw", ".cx", ".cy", ".cz", ".de", ".dj", ".dk", ".dm", ".do", ".dz", ".ec", ".ee", ".eg", ".er", ".es", ".et", ".eu", ".fi", ".fj", ".fk", ".fm", ".fo", ".fr", ".ga", ".gd", ".ge", ".gf", ".gg", ".gh", ".gi", ".gl", ".gm", ".gn", ".gp", ".gq", ".gr", ".gs", ".gt", ".gu", ".gw", ".gy", ".hk", ".hm", ".hn", ".hr", ".ht", ".hu", ".id", ".ie", ".il", ".im", ".in", ".io", ".iq", ".ir", ".is", ".it", ".je", ".jm", ".jo", ".jp", ".ke", ".kg", ".kh", ".ki", ".km", ".kn", ".kp", ".kr", ".kw", ".ky", ".kz", ".la", ".lb", ".lc", ".li", ".lk", ".lr", ".ls", ".lt", ".lu", ".lv", ".ly", ".ma", ".mc", ".md", ".me", ".mh", ".mk", ".ml", ".mn", ".mo", ".mp", ".mq", ".mr", ".ms", ".mt", ".mu", ".mv", ".mw", ".mx", ".my", ".mz", ".na", ".nc", ".ne", ".nf", ".ng", ".ni", ".nl", ".no", ".np", ".nr", ".nu", ".nz", ".om", ".pa", ".pe", ".pf", ".pg", ".ph", ".pk", ".pl", ".pm", ".pn", ".pr", ".ps", ".pt", ".pw", ".py", ".qa", ".re", ".ro", ".rs", ".ru", ".rw", ".sa", ".sb", ".sc", ".sd", ".se", ".sg", ".sh", ".si", ".sk", ".sl", ".sm", ".sn", ".sp", ".sr", ".ss", ".st", ".sv", ".su", ".sx", ".sy", ".sz", ".tc", ".td", ".tf", ".tg", ".th", ".tj", ".tk", ".tl", ".tm", ".tn", ".to", ".tr", ".tt", ".tv", ".tw", ".tz", ".ua", ".ug", ".uk", ".us", ".uy", ".uz", ".va", ".vc", ".ve", ".vg", ".vi", ".vn", ".vu", ".wf", ".ws", ".ye", ".za", ".zm", ".zw", ".name", ".pro", ".aero", ".asia", ".cat", ".coop", ".jobs", ".museum", ".tel", ".travel");
foreach ($arr as &$findme) {
$value = strpos($mystring, $findme);
if ($value === false) {
} else {
$this->set_error();
}
}
Jetzt meine Frage/Problem:
Wenn ein Premium-user ein Basic-user wird, stehen in seiner node ja eventuell noch Links. Die müssten dann dort aber verschwinden. Umgekehrt sollte der Link wieder erscheinen, wenn der user später wieder Premium-user wird.
Ich habe bisher kein Modul gefunden. Wie kann man das lösen? Ich glaube es gibt Module, die bestimmte Worte ersetzen oder löschen (z.B. um Schimpfworte aus comments zu entfernen), ich weiß aber nicht mehr, wie das heißt. Wäre das ein Ansatz?
Danke und Grüße!
- Anmelden oder Registrieren um Kommentare zu schreiben
Du kannst die Links natürlich
am 03.04.2015 - 14:22 Uhr
Du kannst die Links natürlich auch (rollenabhängig) mit der JQuery ausblenden.
Natürlich ist das nicht so sicher, man kann ja JavaScript auch ausschalten, aber dann blieben in der Node natürlich die Links enthalten.
Gruß
Berthold Lausch
Drupal Video-Tutorials
oder aber
am 03.04.2015 - 20:14 Uhr
Du verwendest unterschiedliche content_types und unterschiedliche Textfilter.
Grüße
Ronald
hook_node_view
am 04.04.2015 - 13:46 Uhr
Javascript lässt die Daten nicht wirklich verschwinden (lässt sich ja abschalten) und ein zweiter Node-Typ steht der Anforderung entgegen, daß die Rollen sich auch ständig ändern können. Somit müsste man bei einem Rollenwechsel alle Nodes des entsprechenden Benutzers dann ihren Typ wechseln lassen. Deswegen macht ein Field-Validierung nicht viel Sinn, wenn die Inhalte gleich bleiben sollen, nur deren anzeige sich aufgrund der Rollen des Autoren ändern soll.
Die meisten Module, die z.B. "böse Wörter" zensieren operieren über das Filter-System. Das hat leider keine Meta-Informationen zur Verfügung. Ich habe mich bemüht, diese in Drupal 8 einzubringen, allerdings ohne Erfolg bisher. Somit würde ich z.B. am Node-View ansetzen mit hook_node_view. Dort hat man Zugriff auf den Autoren und kann anhand dessen Rollen die Anzeige des Nodes manipulieren.
# DrupalCenter-Moderator # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: Tech. Concepts | Security + Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
Zitat: Dort hat man Zugriff
am 04.04.2015 - 15:42 Uhr
Dort hat man Zugriff auf den Autoren und kann anhand dessen Rollen die Anzeige des Nodes manipulieren.
Gute Idee :-)
ein spezielles node-Template ist sicherlich eine sicherere Lösung, als die Links einfach per JavaScript auszublenden.
Aufwendig wird es nur, wenn es sehr viele unterschiedlichen Inhaltstypen gibt, bei denen man ja immer ein neues Template erstellen müßte.
Drupal Video-Tutorials
Angenommen, die Links wären
am 05.04.2015 - 23:44 Uhr
Angenommen, die Links wären separate Felder, könnte man diese Rollengerecht ein- und ausblenden. man müsste dann aber im Text die Verwendung von Links für alle verbieten...
lg leda
"Du liebst es, Du brauchst es oder Du gibst es weg"
www.leda.ch
Aufwendig wird es nur, wenn
am 06.04.2015 - 15:07 Uhr
Aufwendig wird es nur, wenn es sehr viele unterschiedlichen Inhaltstypen gibt, bei denen man ja immer ein neues Template erstellen müßte.
Könnte man das Entfernen des Links nicht global auf ein Template für das Body-Field (field--body.tpl.php) anwenden?
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Hallo Regina, Zitat: Könnte
am 06.04.2015 - 15:48 Uhr
Hallo Regina,
Könnte man das Entfernen des Links nicht global auf ein Template für das Body-Field (field--body.tpl.php) anwenden?
Das kommt darauf an, ob man den Textkörper auch immer so nennt.
Ich mache das meist nicht, ich löschen immer das Body-Feld und nehme ein neues Feld her, welches im Namen einen Bezug zum Inhaltstyp hat.
Österliche Grüße
Berthold
Drupal Video-Tutorials
Hi Berthold,Ja, stimmt, das
am 06.04.2015 - 16:59 Uhr
Hi Berthold,
Ja, stimmt, das wäre natürlich Voraussetzung.
Warum benennst Du das Feld routinemäßig um?
Dir - und Allen anderen - auch Schöne Ostern.
Heute ist Computer-Wetter. ;-)
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Zitat: Warum benennst Du das
am 06.04.2015 - 18:00 Uhr
Warum benennst Du das Feld routinemäßig um?
Damit ich in Views leichter sehen kann, welches Feld ich da zu packen habe und deshalb schreibe ich eben auch noch zu dem "Textkörper" dazu, zu welchem Inhaltstypen er gehört.
Beispiel:
event_body für Kalendereinträge
Das ist nur so eine Art von mir, muß ja nicht sein.
@Wetter
also hier war ganz schönes Wetter heute. Eben habe ich noch mit jemandem aus Hannover telefoniert und die saßen auf dem Balkon :-)
Naja, aber normalerweise ist das Wetter bei euch im tiefen Süden ja besser :-)
Gruß
Berthold
Drupal Video-Tutorials
ronald schrieb Du verwendest
am 07.04.2015 - 09:18 Uhr
Du verwendest unterschiedliche content_types und unterschiedliche Textfilter.
Das ist leider nicht möglich, weil dazu schon zu viele user Inhalte gepostet haben und weil das auch bis zu 20 Felder betreffen würde.
Wenn es überall das Body-Feld
am 07.04.2015 - 10:01 Uhr
Wenn es überall das Body-Feld betrifft, dann würde ich wirklich das Field-Template anpassen und mir eine der Code-Beispiele im Netz suchen, mit denen man mittels Regulärem Ausdruck Links entfernt.
Und das ganze natürlich abhängig von der Benutzerrolle.
Ich wüßte nicht, wie man das ohne Code hinbekommen könnte.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
das es sich um bestehende Inhalte handelt
am 07.04.2015 - 10:15 Uhr
und der Zustand auch wieder zurückwecheln können soll, also intern der Link gespeichert werden soll, bleibt eigentlich nur eine Kombination aus CSS und JQUERY übrig.
$('a').hide();
Ist ein Ansatz.
Dies muss natürlich mit einer Berechtigkeitsprüfung und dem Setzen eines entsprechenden Flags einhergehen.
Das kann wohl am ehesten das Template leisten.
Grüße
Ronald
Warum Ronald? Man könnte doch
am 07.04.2015 - 10:24 Uhr
Warum Ronald?
Man könnte doch auch das Template wieder entfernen.
Das löscht ja nichts aus der Datebank, sondern unterdrückt nur serverseitig die Ausgabe.
Das mit jQuery würde ich davon abhängig machen, wie wichtig die Unterdrückung ist.
Wenn es egal ist, daß es ohne JS doch angezeigt wird, dann kann man das natürlich machen und es ist dann auch die einfachste Lösung.
Wichtig finde ich in jedem Fall, daß der User mit eingeschränkten Rechten informiert wird, warum seine Links nicht angezeigt werden.
Ansonsten fummelt jemand da stundenlang rum...;-)
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
wenn ich das richtig verstanden habe
am 07.04.2015 - 10:34 Uhr
soll die Anzeige nicht vom Recht des Users, sondern dem des Publishers abhängig sein.
Die Anzeige soll jeweils wechseln, wenn der Publisher einen Obulus entrichtet hat, oder nicht.
Damit müssen alle Daten immer da sein, eber gelegentlich unterdrückt werden.
Mit display:none kann man zwar im Quellcode den Link finden, er wird aber nicht angezeigt.
Setzt man dies als default, würden bei unterdrücktem JavaScript keine Links angezeigt.
Da sonst auch nicht viel ohne JS läuft, sollte man damit leben können.
Dies würde auch die sonstige Rechtestrategie von Drupal bestätigen, in der Rechte nur gegeben, also erweitert werden.
Das muss dann antürlich im Template ablaufen.
Natürlich get das auch in einer Funktion der Ausgabe, also vor oder während dem rendern der Section.
Dann könnte man sogar auf JS verzichten.
Grüße
Ronald