TransWikia.com

Restrict delete operation on a node referenced by another node

Drupal Answers Asked by user48552 on December 19, 2021

I am using References module to make a node reference in my course content type that reference to school content type (a course belong to one school and a school have many courses).

Now what I want is if I’m going to delete a school, the delete operation will not be completed if the school referenced by any courses.

I’ve read hook_node_delete() and hook_delete(), written them in my custom module, tried to dpm($node) but no use!

function mymodule_delete($node) {
    dpm($node);
}
function mymodule_node_delete($node) {
    dpm($node);
}

The school node still be deleted!

According to hook_node_info() , I create:

function mymodule_node_info() {
  return array(
     'school' => array(
      'name' => t('School'),
      'base' => 'school',
      'description' => t('A short description'),
    )
  );
}

base: (required) The base name for implementations of
node-type-specific hooks that respond to this node type. Base is
usually the name of the module or ‘node_content’, but not always

And then in my mymodule.module:

function school_delete($node) {
    dpm($node);
}

The code still not working!

2 Answers

If you are familiar with Rules (if you are not check here) you can use this selection :

add an integer field to school content type (this field is going to count courses which are referenced to a school)

on node creation event , check if it is a course type , if it is before saving that read the school reference value , then go and increase the school course count .

on node deletion , check if it is a course , then before deletion read the field school and decrease its course count value ,

and finally we are going to use some code :

//Implement hook_delete
function ModuleName_delete($node) {
   if($node->type == "school") //if your type machine readable name is school
   {
       if($node->course_count[LANGUAGE_NONE][0]['value'] < 0) //check field name ...
       {
           node_delete($node->nid);
       }
   }
}

Answered by Alireza Tabatabaeian on December 19, 2021

I believe you are invoking the hook incorrectly - according to the API page for hook_delete():

This is a node-type-specific hook, which is invoked only for the node type being affected

Further disccussed on the Node API Hooks Page:

Node-type-specific hooks: When defining a node type, hook_node_info() returns a 'base' component. Node-type-specific hooks are named base_hookname() instead of mymodule_hookname() (in a module called 'mymodule' for example). Only the node type's corresponding implementation is invoked. For example, poll_node_info() in poll.module defines the base for the 'poll' node type as 'poll'. So when a poll node is created, hook_insert() is invoked on poll_insert() only. Hooks that are node-type-specific are noted below.

Answered by Geoff on December 19, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP