[gelöst] User soll Profilfeld-Permissions selbst verwalten können
am 12.08.2011 - 15:26 Uhr in
Hallo Forum,
ich bin noch recht neu bei Drupal, habe mir aber schon einige Tutorials angesehen und Bücher gelesen. Ach mit den "Views" komme ich ganz gut zurecht.
Ich habe jetzt ein Projekt, bei dem es registrierten Benutzern möglich sein soll, selbst auszuwählen, wie einzelne Profilfelder (diese lege ich manuell im Content Type "User" an) sichtbar für die Außenwelt sein sollen.
Beispiel:
- E-Mail Adresse: test@test.de SICHTBARKEIT privat[] registrierte Benutzer[] öffentlich[x]
- Telefon: 123456789 SICHTBARKEIT privat[x] registrierte Benutzer[] öffentlich[]
- Bundesland: Hessen SICHTBARKEIT privat[] registrierte Benutzer[x] öffentlich[]
Die Auswahlfelder sollen Radio-Buttons sein.
Meine Frage ist nun, ob ich da mit Bordmitteln oder Views hinkomme, oder ob ich hierfür über die Form-API ein eigenes Modul entwickeln muss.
Im Endeffekt sollen diese "Sichtbarkeitsauswahlfelder" evtl. noch für viele andere Content Types gelten können, z.B. für User-Blogeinträge oder -News
Vielen Dank für jeden Ansatz!
- Anmelden oder Registrieren um Kommentare zu schreiben
Theme zum Beispiel
am 13.08.2011 - 13:04 Uhr
Also ein eigenes Modul muss du sicher nicht entwickeln. (Evtl. gibt es eines für diesen Zweck, das ist mir dann aber noch nicht untergekommen.)
Im Zweifel kannst du es über ein Template für die User-Profile lösen. Zu jedem einzelnen Inhalt gibt es dann zwei relevante Felder. Zum einen das mit dem Inhalt (etwa Telefon), zum anderen eine Liste mit den Optionen. Per Template fragst du die Optionen und die Rollen des Besuchers ab. Je nach Ergebnis zeigt du die betreffenden Daten an oder eben nicht.
Nebenbei. Wozu brauchst du ein Feld privat? Wenn das nur der Benutzer selbst sehen soll, wird er seine eigenen Daten kennen, wozu dann eintragen?
Hi und vielen Dank für die
am 13.08.2011 - 14:27 Uhr
Hi und vielen Dank für die Antwort.
So ganz habe ich es aber noch nicht verstanden. Was ist mit einem "Template für User Profile" genau gemeint? Hat das was mit Theming zu tun ? (http://api.drupal.org/api/drupal/modules--system--theme.api.php/group/th...)
Und wegen dem Wert "privat":
Es geht darum, dass die Benutzer so viel wie möglich Daten eingeben. Die HP soll eine Art Vereinshomepage werden und die Vereins"oberhäupter" hätten natürlich gerne so viel wie möglich an Daten.
Der Benutzer selbst aber möchte diese Daten vielleicht nicht öffentlich und auch nicht anderen Benutzern, sondern nur den Admins und sich selbst zugänglich machen.
Vielen Dank!
begs schrieb und die
am 13.08.2011 - 14:33 Uhr
und die Vereins"oberhäupter" hätten natürlich gerne so viel wie möglich an Daten.
Der Benutzer selbst aber möchte diese Daten vielleicht nicht öffentlich und auch nicht anderen Benutzern, sondern nur den Admins und sich selbst zugänglich machen.
Tja ... dann legst Du am allereinfachsten eine Rolle "oberhaeupter" an und gibst dieser Rolle die entsprechenden Berechtigungen. Da erledigst Du das ganz elegant mit den Bordmitteln von Drupal.
Drupal 7 Screencasts in deutsch!
Thoor schrieb begs
am 13.08.2011 - 15:33 Uhr
und die Vereins"oberhäupter" hätten natürlich gerne so viel wie möglich an Daten.
Der Benutzer selbst aber möchte diese Daten vielleicht nicht öffentlich und auch nicht anderen Benutzern, sondern nur den Admins und sich selbst zugänglich machen.
Tja ... dann legst Du am allereinfachsten eine Rolle "oberhaeupter" an und gibst dieser Rolle die entsprechenden Berechtigungen. Da erledigst Du das ganz elegant mit den Bordmitteln von Drupal.
Ok verstehe ich, aber wie kann ich die Felder für den normalen Benutzer bauen, so dass er sich dann eben entscheiden kann ob all seine Benutzereingaben einzeln entweder öffentlich oder nur eingeloggten Benutzern oder eben niemandem (= nur Admins) zugänglich macht?
Du musst dann für jedes Feld
am 13.08.2011 - 16:49 Uhr
Du musst dann für jedes Feld zusätzlich eine Checkbox anlegen mit jeweils 3 Werten (öffentlich, nur für Registrierte, privat).
Anschließend musst Du die Felder dann einzeln im Template ausgeben und zwar immer mit einer If-Anweisung, welche vor der Ausgabe abfragt wie die Checkbox für das jeweilige Feld gesetzt wurde.
Das wird, wenn Du viele Felder hast, ganz schön aufwendig. Einfacher wird es wenn Du diverse Felder in "Gruppen" oder Blöcken zusammen fasst und die Sichtbarkeit nur der Blöcke regelst. Wenn Du z.B. 5 Blöcke hast, brauchst Du dann auch nur 5 Checkboxen.
Drupal rockt!!!
Ionit schrieb Du musst dann
am 13.08.2011 - 17:25 Uhr
Du musst dann für jedes Feld zusätzlich eine Checkbox anlegen mit jeweils 3 Werten (öffentlich, nur für Registrierte, privat).
Anschließend musst Du die Felder dann einzeln im Template ausgeben und zwar immer mit einer If-Anweisung, welche vor der Ausgabe abfragt wie die Checkbox für das jeweilige Feld gesetzt wurde.
Das wird, wenn Du viele Felder hast, ganz schön aufwendig. Einfacher wird es wenn Du diverse Felder in "Gruppen" oder Blöcken zusammen fasst und die Sichtbarkeit nur der Blöcke regelst. Wenn Du z.B. 5 Blöcke hast, brauchst Du dann auch nur 5 Checkboxen.
Klasse und vielen Dank. Das probiere ich mal aus!
Hi lonit, das klappt schon
am 16.08.2011 - 19:31 Uhr
Hi lonit, das klappt schon ganz gut. Nun habe ich noch die Frage, wie ich heraus finde, welche Werte die Checkboxen/RadioButtons oder auch gerne DropDowns haben müssen.
Sie sollten ja irgendwie die Werte der jeweiligen Gruppe haben und dann in die richtige Datenbanktabelle geschrieben werden, damit später beim Rendern Drupal, bzw. mein eigenes Template weiß, ob das Feld für den jeweiligen Besucher des Profils sichtbar sein soll oder nicht.
Dummymäßig stelle ich mir das so vor:
<select name="field_benutzerprofil_telefon">
<option value="drupal_group_all">Öffentlich</option>
<option value="drupal_group_id_2">Nur Authentifizierte Benutzer</option>
<option value="drupal_group_only_own_user_id">Privat und Admins</option>
</select>
Vielleicht kannst Du mir einen kleinen Stupser in die richtige Richtung geben, und/oder einen Verweis auf einen Bereich in der Doku/API
Vielen Dank!
Wo werden denn die Checkboxen
am 16.08.2011 - 20:13 Uhr
Wo werden denn die Checkboxen angelegt? Nutzt Du "Content-Profile"? Oder das Core-Profile?
Drupal rockt!!!
Ich hatte die Felder jetzt
am 16.08.2011 - 21:35 Uhr
Ich hatte die Felder jetzt mal hier angelegt:
Startseite » Verwaltung » Konfiguration » Benutzer » Kontoeinstellungen->Felder verwalten
Gibt es eine bessere Stelle?
Im Code habe ich dann in der template.php folgendes gemacht:
function MYTHEME_theme() {
return array(
// The form ID.
'user_profile_form' => array(
// Forms always take the form argument.
'arguments' => array('form' => NULL),
'render element' => 'form',
'template' => 'templates/user-profile-edit',
),
);
}
Und in der templates/user-profile-edit.tpl.php
print render($form['form_id']);
print render($form['form_build_id']);
print render($form['form_token']);
print render ($form['field_telefon']);
etc.
Aber ich bin mir überhaupt nicht sicher, ob das auch der richtige Ansatz ist. Irgendwie bin ich ein bisschen verloren, weil ich die Stelle in der Doku nicht wirklich finde, bzw. nicht drauf komme, wie das Gesamtthema überhaupt heißt.
Das ist alles irgendwo zusammengeklaubt und macht mich nicht wirklich glücklich.
Läuft das unter "Theming" oder "Devolp Themes" oder wo steht das denn in Gänze, dann müsste ich wahrscheinlich nicht mehr fragen, sondern einfach lesen...
Vielen Dank für die Mühe
Servus, leg einfach eine
am 16.08.2011 - 21:46 Uhr
Servus,
leg einfach eine datei user-profile.tpl.php in deinem template ordner an und dort kannst du dann die einzelnen felder mit if-abfragen ausgeben, oder eben nicht. Siehe auch: http://api.drupal.org/api/drupal/modules--user--user-profile.tpl.php/7
Und noch ein Tipp, um den Wert eines Feldes zu bekommen, bietet sich in vielen Fällen field_get_items('node', $node, 'field_myfield') an. Siehe auch http://api.drupal.org/api/drupal/modules--field--field.module/function/f...
Viele Grüße,
Walter
http://valderama.net
valderama schrieb Servus, leg
am 17.08.2011 - 08:08 Uhr
Servus,
leg einfach eine datei user-profile.tpl.php in deinem template ordner an und dort kannst du dann die einzelnen felder mit if-abfragen ausgeben, oder eben nicht. Siehe auch: http://api.drupal.org/api/drupal/modules--user--user-profile.tpl.php/7
Und noch ein Tipp, um den Wert eines Feldes zu bekommen, bietet sich in vielen Fällen field_get_items('node', $node, 'field_myfield') an. Siehe auch http://api.drupal.org/api/drupal/modules--field--field.module/function/f...
Viele Grüße,
Walter
Hi valderama,
vielen Dank für die Links.
Das ist aber noch nur die halbe Miete oder? Ich brauche ja auch noch die Seite, in der der jeweilige User seine Felder und Zugriffs/Gruppenrechte selbst verwalten kann.
Und dazu muss ich oben aufgezeigten weg mit dem "user-profile-edit"-Template gehen. Stimmt das?
Vielen Dank
Felder für das User-Profil
am 17.08.2011 - 08:45 Uhr
Das ist aber noch nur die halbe Miete oder? Ich brauche ja auch noch die Seite, in der der jeweilige User seine Felder und Zugriffs/Gruppenrechte selbst verwalten kann.
Und dazu muss ich oben aufgezeigten weg mit dem "user-profile-edit"-Template gehen. Stimmt das?
Erst einmal nicht. Die Felder legst du einfach über /admin/config/people/accounts/fields an. Allenfalls kannst du die noch mit http://drupal.org/project/field_group gruppieren. Und dann mit dem Admin-Theme stylen.
Das Template ist dann nur für die Ausgabe dieser Profile im Frontend-Theme zuständig.
Nicolai Schwarz schrieb Erst
am 17.08.2011 - 08:54 Uhr
Erst einmal nicht. Die Felder legst du einfach über /admin/config/people/accounts/fields an. Allenfalls kannst du die noch mit http://drupal.org/project/field_group gruppieren. Und dann mit dem Admin-Theme stylen.
Das Template ist dann nur für die Ausgabe dieser Profile im Frontend-Theme zuständig.
Oh, das field_group Modul sieht sehr gut aus.
Woher weiß aber denn dann Drupal, dass meine Auswahlfelder "öffentlich" "privat" "nur Mitglieder" pro Feld dann auch die Funktionalität haben sollen, dass diese Felder nur für die jeweilige Benutzergruppe im Frontend angezeigt werden sollen?
Siehe oben
am 17.08.2011 - 09:15 Uhr
Das hat Ionit bereits erklärt:
Du musst dann für jedes Feld zusätzlich eine Checkbox anlegen mit jeweils 3 Werten (öffentlich, nur für Registrierte, privat).
Anschließend musst Du die Felder dann einzeln im Template ausgeben und zwar immer mit einer If-Anweisung, welche vor der Ausgabe abfragt wie die Checkbox für das jeweilige Feld gesetzt wurde.
Das wird, wenn Du viele Felder hast, ganz schön aufwendig. Einfacher wird es wenn Du diverse Felder in "Gruppen" oder Blöcken zusammen fasst und die Sichtbarkeit nur der Blöcke regelst. Wenn Du z.B. 5 Blöcke hast, brauchst Du dann auch nur 5 Checkboxen.
Nach dieser Methode benötigst du keine Änderungen in der template.php und keine templates/user-profile-edit.tpl.php.
Du arbeitest nur mit den Feldern und der user-profile.tpl.php.
Hui, langsam blicke ich gar
am 17.08.2011 - 10:36 Uhr
Hui, langsam blicke ich gar nicht mehr durch ;(
Wenn ich die user-profile.tpl.php ändere, änder ich doch nur die Seite, auf der die Felder, die ein Benutzer ausgefüllt hat, ausgegeben werden.
Hier gibt es für den Benutzer doch gar keine Möglichkeit Felder zu bearbeiten. Dies geht nu, wenn er auf den Tab "bearbeiten" klickt. Dann kommt auch das Formular und dieses kann ich nicht mit user-profile.tpl.php verändern, sondern nur über den user-profile-edit.tpl.php Weg siehe oben.
Oder liege ich hier ganz falsch?
Sorry für die "Verpeilung" ;)
Aneinander vorbei
am 17.08.2011 - 11:00 Uhr
Wenn ich die user-profile.tpl.php ändere, änder ich doch nur die Seite, auf der die Felder, die ein Benutzer ausgefüllt hat, ausgegeben werden.
Hier gibt es für den Benutzer doch gar keine Möglichkeit Felder zu bearbeiten. Dies geht nu, wenn er auf den Tab "bearbeiten" klickt. Dann kommt auch das Formular und dieses kann ich nicht mit user-profile.tpl.php verändern, sondern nur über den user-profile-edit.tpl.php Weg siehe oben.
Ja, ein User kann die Felder nur bearbeiten, wenn er auf "bearbeiten" klickt. Und wofür willst du dort was ändern? Der User benötigt dort nur die Felder für die Inhalte und jeweils eine Radio/Selectbox, um die Rechte zu klären. Die fügst du über einzelne Felder für das User-Profil hinzu. Die Felder stehen dann jedem User zur Verfügung, der sein Profil bearbeitet. Was willst du zusätzlich erreichen?
Das wird schon noch ;) Ich
am 17.08.2011 - 11:05 Uhr
Das wird schon noch ;)
Ich will zusätzlich erreichen, dass die ausgewählten Werte aus den SelectBoxen ("öffentlich" "privat" "nur registrierte Benutzer") auch wirklich Auswirkungen auf Drupal haben.
Je nachdem welchen Wert ein Benutzer für ein Feld setzt, soll dieses Feld nur bestimmten Benutzergruppen beim ansehen des Profils sichtbar gemacht werden.
Ich muss ja dazu wahrscheinlich schon eingreifen und die ausgewählten Werte irgendwo in eine/die Rechtetabelle in Drupal bringen.
Denn nur weil ich die Felder im Backend anlege, hat dies ja noch keine Auswirkungen / Funktionen.
Im Endeffekt soll das ganze genau so laufen wie die Facebook Privatsphäreeinstellungen. Ein Benutzer setzt seine Sichtbarkeiten in seinem Profil und andere Benutzer können oder können nicht diese einzelnen Felder sehen.
Theming
am 17.08.2011 - 11:28 Uhr
Ich will zusätzlich erreichen, dass die ausgewählten Werte aus den SelectBoxen ("öffentlich" "privat" "nur registrierte Benutzer") auch wirklich Auswirkungen auf Drupal haben. Je nachdem welchen Wert ein Benutzer für ein Feld setzt, soll dieses Feld nur bestimmten Benutzergruppen beim ansehen des Profils sichtbar gemacht werden.
Ich muss ja dazu wahrscheinlich schon eingreifen und die ausgewählten Werte irgendwo in eine/die Rechtetabelle in Drupal bringen.
Denn nur weil ich die Felder im Backend anlege, hat dies ja noch keine Auswirkungen / Funktionen.
Und genau das versuchen wir zu erklären: Der User legt seine Daten an. Zu jedem Inhalt gibt es deine Selectbox mit den Rechte-Optionen. Diese liegen erst einmal ohne wirkliche Rechte in der Datenbank. Es sind einfach Felder mit verschiedenen Inhalten.
Nun geht es um die Ausgabe, das Template für user-profile.tpl.php. Wenn du dort nichts machst, werden alle Felder ganz normal angezeigt. Also änderst du das Template: Per PHP fragst du die Rolle des aktuellen Besuchers ab, außerdem fragst du die Felder der Rechte ab. Nach diesen Werten gibst du ein Feld aus oder nicht. Durch einfache if-Abfragen. Im Hintergrund weiß Drupal immer noch nichts von den Rechten. Aber es erscheinen durch das Template nur die Felder, die erscheinen sollen. Die Rechte-Logik wird allein in der Ausgabe erledigt.
Ei ei ei und autsch und
am 17.08.2011 - 11:45 Uhr
Ei ei ei und autsch und sorry. Da stand ich ja mal wirklich auf dem Schlauch.
Jetzt ist alles klaro.
Vielen Dank für's Durchhalten!
So, ich habe es nun und will
am 23.08.2011 - 21:53 Uhr
So, ich habe es nun und will das kurz für alle notieren, die evtl. mal das gleiche Problem haben.
Ich habe das jetzt mit Bordmitteln und einem kleinen eigenen Modul gelöst.
Für Verbesserungsvorschläge bin ich natürlich offen, ist ja mein erstes Modul ;)
Es geht also darum, dass ein Benutzer ganz Facebook-Like seine Profilfelder mit Privatsphäreeinstellungen belegen kann.
Jeder Benutzer soll für jedes Feld in seinem Profil selbst entscheiden können, ob das Feld "Öffentlich", "Nur für Mitglieder" (= eingeloggte Benutzer) oder "Privat" (= nur für sich bzw. Admins) sichtbar ist.
Dazu habe ich über Konfiguration->Benutzer->Kontoeinstellungen->Felder verwalten z.B. ein Feld "field_user_telefon" vom Typ "Text" und dazu gleich darunter ein Feld "field_user_telefon_ps" vom Typ Liste(Text) angelegt.
Das "_ps" (privatsphäre) Feld hat als Listenwerte "Privat", "Öffentlich" und "Nur Mitglieder"
So habe ich dann alle Felder, die ein Benutzer editieren kann angelegt.
Mit ein bisschen "float" und "clear" im CSS, sieht das ganze auch schon sehr ansehnlich im Profil-Bearbeitungsmodus aus
Danach habe ich ein Modul erstellt und den Hook "hook_user_view()" verwendet, um beim Ansehen eines Benutzerprofils zu prüfen, ob der "gerade ansehende Benutzer" die Rechte hat jedes einzelne Feld zu sehen.
Der Code für diesen Hook sieht folgendermaßen aus:
<?
/**
* @file
* Modul für die Anzeige/Das Ausblenden von Privatsphäreeinstellungen
*/
/**
* Implements hook_user_view
*
* Zeigt/Versteckt Profilfelder aufgrund von PS-Einstellungen (= PrivatSphäreeinstellungen)
*
* @param object $account
* @param string $viewmode
*/
function userps_user_view($account, $viewmode){
global $user; //globales User Object
if(! ($account->uid == $user->uid) ){
//Eingeloggter Benutzer ist nicht der gerade Profilbetrachtende,
//PS Einstellungen müssen geprüft werden
//Felder dürfen nur von Admins gesehen werden
//Oder wenn sie für eingeloggte Benutzer / bzw. öffentlich markiert sind
//Felder und PS Felder werden im Benutzerprofil angelegt. Beispiel:
// field_user_telefon (Eingabefeld für Telefon)
// field_user_telefon_ps (PS Feld als Listenfeld z.b. mit "Privat" "Öffentlich" "Nur Mitglieder"
if(!in_array("administrator", $user->roles)){
//Der Betrachtende Benutzer ist kein Administrator, Prüfung muss erfolgen
$checkFields = Array( //Alle Felder, die mit PS Einstellungen belegt sind
"field_user_vorname",
"field_user_nachname",
"field_user_strasse",
"field_user_ort",
"field_telefon",
"field_user_telefon_gesch",
"field_user_fax"
);
foreach($checkFields as $fieldName){
$unsetField = true; //Feld wird grundsätzlich erst einmal verborgen
if(is_array($account->$fieldName)){ //Prüfung: Das Feld existiert
$psField = $fieldName."_ps"; //Feldname des PS Felds
if(is_array($account->$psField)){ //Prüfung: Das PS Feld existiert
if(key_exists("und", $account->$psField)){ //Das PS Feld hat Einträge
$arPsField = $account->$psField; //Wert als Array speichern, um danach mit [] darauf zugreifen zu können
$psValue = $arPsField["und"][0]["value"]; //Der PS Feldwert z.B. "Öffentlich" "Nur Mitglieder" "Privat"
if($psValue == "Öffentlich" || ( $psValue == "Nur Mitglieder" && in_array("authenticated user", $user->roles) ) ){
$unsetField = false; //Das Feld wird nicht versteckt, da die PS entweder auf "Öffentlich" gestellt ist, oder auf
//"Nur Mitglieder" aber der "Profil ansehende Benutzer" ist eingeloggt
}
}
}
unset($account->content[$psField]); //Das PS Feld im Profil-Ansehen Modus nie anzeigen
if($unsetField){
//Das Feld wir versteckt, weil entweder nicht öffentlich oder nur für eingeloggte Benutzer ("Nur Mitglieder") freigegeben
unset($account->content[$fieldName]);
}
}
}
}else{
//Administrator betrachtet das Profil, alle Felder sind sichtbar
}
}else{
//Eingeloggter Benutzer betrachtet sein eigenes Profil
//Alle Felder sind sichtbar
}
//dprint_r($account);
}
Richtig genial wäre natürlich, wenn man das Modul flexibel gestalten könnte, aber soweit bin ich noch nicht ;)
Vielen Dank an alle, die mich bis zu dieser akzeptablen Lösung geführt haben!