Drupal 7 provides accessing of nodes by roles & its permissions, The permissions can be set to different roles & based on permission nodes can be accessible for different operations like view, delete, create & update.
Let’s say we have content type ‘article’ & we have roles HOD, CR, Student. And we have permissions set to Student role as can ‘view the published article’. CR role has permission that ‘can view published article & can edit own article’.
But in case of we need custom permission scenarios, lets discuss some examples -
- If student is author then student can edit own article when it is in unpublished state
- CR role wants to edit own article & Students articles (For unpublished state)
These are some scenarios where permissions will not give options to do these.
We came across some hooks in drupal 7 & found hook_node_access($node, $op, $account). Let’s discuss how we can achieve above scenarios. Create a module called custom_node_access.
Scenario 1 : If student is author then student can edit article when it is in unpublished state
/**
* Implementation of hook_node_access().
*
* Scenario 1 : If student is author then student can edit article when it is in unpublished state
*/
function custom_title_node_access($node, $op, $account) {
// get type of node.
$type = is_string($node) ? $node : $node->type;
// Check content type is article
if ($type == 'article') {
// Check node object is loaded
// Check node status is unpublished
if (isset($node->nid) && $node->status == 0) {
// Check operation is update
if ($op == 'update') {
// Check user is student
// Here 2 is student role id
if (array_key_exists(2, $account->roles)) {
// Check node author & logged in user are same
if($node->uid == $account->uid){
// Access student to update these node
return NODE_ACCESS_ALLOW;
}
}
}
}
}
}
Scenario 2 : CR role wants to edit own article & Students articles (For unpublished state)
/**
* Implementation of hook_node_access().
*
* Scenario 1 : CR role wants to edit own article & Students articles (For unpublished state)
*/
function custom_title_node_access($node, $op, $account) {
// get type of node.
$type = is_string($node) ? $node : $node->type;
// Check content type is article
if ($type == 'article') {
// Check node object is loaded
// Check node status is unpublished
if (isset($node->nid) && $node->status == 0) {
// Check operation is update
if ($op == 'update') {
// Check user is CR
// Here 3 is CR role id
if (array_key_exists(3, $account->roles)) {
// load node author's user object
$node_author = user_load($node->uid);
// Check node author & logged in user are same
// or node author is student (Here 2 is student role id)
if($node->uid == $account->uid || array_key_exists(2, $node_author->roles)){
// Access student to update these node
return NODE_ACCESS_ALLOW;
}
}
}
}
}
}