[solved] Verständinisfrage zu $node->status und best practice
am 29.11.2009 - 18:08 Uhr in
Hi, ich bin relativ bei Drupal gelandet - deshalb diese grundlegende Frage zu Drupal und $node->status
Ich habe ein Modul geschrieben, was einen eigenen Nodetype implementiert. Wenn ein "Gast" eine Node anlegt, wird dieser von dem Modul der Status 0 zugewiesen. Diese Node muss von einem Admin oder Moderator freigeschaltet werden.
<?php
function mynode_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
switch($op) {
case 'presave':
global $user;
if($user->uid == 0) {
$node->status = 0;
}
break;
}
}
?>Soweit funktioniert auch alles wie gewollt.
Allerdings ist die Node trotz Status 0 für jeden Gast und jedes Mitglied sichtbar. Laut Drupal sollte dies bei Status 0 aber nicht der Fall sein ...
Meine Lösung sieht wie folgt aus:
<?php
function mynode_access($op, $node, $account) {
switch($op) {
case 'view':
if($node->status == 0) {
drupal_set_message(t('Diese Node wartet auf Moderation, ...!'));
return false;
}
return true;
}
}
?>Das funktioniert soweit auch wunderbar. Ich bin allerdings nicht sicher, ob das so gehandelt werden sollte oder ob man das besser über das Feld $node->moderate löst bzw. ich da etwas im Bezug auf $node->status und Drupals Art und Weise damit umzugehen missverstanden habe.
Mit der obigen Lösung wird zwar der Node-Inhalt an sich nicht angezeigt, wohl aber andere Dinge im Template, die sich auf diese noch nicht freigeschaltete Node beziehen.
Z.B. die Tagcloud in der Sidebar oder das related/similar Nodes-Listing weiter unten auch der Seite.
Gibt es für die Steuerung dieser nodebezogenen Daten eine generelle Lösung oder muss ich sämtliche Blöcke und Listings über eine if($node->status == 1) Verzweigung steuern?
Danke und ich bin gespannt!
- Anmelden oder Registrieren um Kommentare zu schreiben

Nein, da ist definitiv etwas
am 29.11.2009 - 22:09 Uhr
Nein, da ist definitiv etwas anders falsch. Hast du mal die Berechtigungen des Gast überprüft?
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.de
http://kupferbau.ernst-bloch-uni.de/
Ich habe mir die
am 29.11.2009 - 23:06 Uhr
Ich habe mir die Berechtigungen nochmal angesehen und mit denen anderer Module verglichen. Dort sieht alles ok aus. Meine Node wird sowohl bei Gast, Admin als auch User in jedem Fall angezeigt.
Ich habe es nochmal mit dem Blog-Modul verglichen, eine Blog-Post mit dem Status = 0 wird nicht angezeigt. Was richtig ist. Ich kann aber im Vergleich zum Blog-Modul und in den Zugriffsberechtigungen keine Unterschiede finden.
Hast du ein nodetype Modul?
am 30.11.2009 - 00:36 Uhr
Hast du ein nodetype Modul? Implementierst du dort hook_access?
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.de
http://kupferbau.ernst-bloch-uni.de/
Ja, tue ich wie
am 30.11.2009 - 09:41 Uhr
Ja, tue ich wie folgt:
hook_access
<?php
function mynode_access($op, $node, $account) {
$is_author = $account->uid == $node->uid;
switch($op) {
case 'view':
// muss Node noch moderiert werden?
if($node->status == 0) {
drupal_set_message(t('Diese Node wartet auf Moderation, ...!'));
return false;
}
return true;
case 'create':
return user_access('create mynode', $account);
case 'update':
return user_access('edit own mynode', $account) && $is_author || user_access('edit any mynode', $account);
case 'delete':
return user_access('delete own mynode', $account) && $is_author || user_access('delete any mynode', $account);
}
}
?>
hook_perm
<?phpfunction mynode_perm() {
return array(
'create mynode',
'edit own mynode',
'edit any mynode',
'delete own mynode',
'delete any mynode'
);
}
?>
Ich habe das Modul nochmal
am 03.12.2009 - 22:41 Uhr
Ich habe das Modul nochmal feinkörnig mit einer frischen Drupal-Installation getestet und festgestellt, dass eine unschöne Konstellation in hook_access -> $op == 'view' immer true geliefert hat.
Nun funktioniert es und ich bin beruhigt, dass sich Drupal so verhält, wie man es erwarten würde :)