Nodes ohne view-Berechtigung ausblenden
am 16.08.2009 - 17:43 Uhr in
Hallo Forum,
ich bin derzeit dabei ein eigenes Modul zu erstellen, das einen eigenen Content-Typ mit sich bringt. Den Zugriff auf Nodes von diesem Typ reglementiere ich über eine Implementierung von hook_access(). In der Node-Übersicht ("/node") werden jedoch jedem Besucher alle Nodes angezeigt, auch die, auf die er keinen Zugriff hat. Wenn er ein entsprechendes Node dann anklickt kommt die typische "Kein Zugriff"-Meldung. Wie erreiche ich aber, dass die Nodes garnicht erst angezeigt werden, wenn dafür keine Berechtigung da ist?
Und ergänzend hierzu: Wie schaffe ich es, dass solche Nodes auch in der Suche nicht angezeigt werden?
Vielen Dank im Voraus und viele Grüße
Sebastian
- Anmelden oder Registrieren um Kommentare zu schreiben

Implementiere hook_node_access_records und hook_node_grants
am 16.08.2009 - 21:48 Uhr
Implementiere
hook_node_access_recordsundhook_node_grants.Wenn Drupal eine Liste von Nodes aus der Datenbank haben will, dann wird die Datenbankabfrage mittels
db_rewrite_sqlumgeschrieben, indemhook_db_rewrite_sqlausgeführt wird. Eine Implementierung dieses Hooks istnode_db_rewrite_sql, welche dafür sorgt, das die Zugriffsrechte, die du inhook_node_access_recordsvergeben hast, beachtet werden.Es wäre dann konsequent, deine Implementierung von
hook_accesswegzuwerfen, da du sonst zwei Mechanismen verwendest, Zugriffe zu regeln. Wenn diese Mechanismen das gleiche Ergebniss haben, dann ist einer überflüssig, wenn sie unterschiedliche Ergebnisse liefern dann kommt es zu genau den Ungereimtheiten, die du gerade erlebst. Alternativ könntest du deine eigene Impolementierung vonhook_db_rewrite_sqlanbieten.--

Hi! Vielen Dank für die
am 17.08.2009 - 15:39 Uhr
Hi!
Vielen Dank für die schnelle Antwort, so ganz hilft sie mir leider noch nicht.
Folgendes Problem: Ich habe einen Content Type "MeinTyp". MeinTyp hat neben den normalen Feldern "title" und "body" zwei weitere Felder: "is_public" und "access_token". Jetzt hätte ich gerne folgendes: Wenn das Feld: "is_public" gesetzt ist, dann soll jeder die Nodes von eben diesem Typ sehen können. Wenn is_public = 0 ist, dann soll das Node nur sichtbar sein, wenn der Access Token an die URL angehängt wird.
Mit Hilfe von hook_node_access_records($node) kann ich ja die verschiedenen Berechtigungen für jedes Node definieren. Mit hook_node_grants($account, $op) sage ich dann, was der Benutzer darf und was nicht. Jetzt hängt mein Access Token ja aber am Node dran und unter hook_node_grants($account, $op) komme ich ja nicht an mein Node dran. Könnte ich da einfach ein realm mit meinem Token erstellen und bei hook_node_grands eben diesen Realm übergeben? Funktionieren tut es, die Frage ist nur: Ist das ein schöner Weg oder gibt es einen schöneren? :-)
Und noch ein Problem: Wenn ich ein Node aktualisiere und beispielsweise is_public von 0 auf 1 ändere, dann hat in hook_node_access_records($node) das Node den Wert nicht. Wenn ich per node_load($node->nid) mein Node nachlade, dann bekomme ich den alten Wert. Ich schreibe und aktualisiere mein Node über hook_insert() und hook_update(), da man hook_nodeapi() ja nur bei "modulfremden" Content Types nutzen soll. Im Beispiel wird jedoch hook_nodeapi() genutzt, um insert und update abzudecken. Auch hier die Frage: Muss ich hook_nodeapi() nutzen oder geht das irgendwie besser?
Ich hoffe, das Problem ist irgendwie verständlich und von mir nicht zu kompliziert beschrieben.
Vielen Dank und viele Grüße
Sebastian