0

I have this code in my module.

  $node = new stdClass();
  $node->title = "YOUR TITLE";
  $node->type = "page";
  node_object_prepare($node);

  $node->language = 'it';
  $node->uid = 1; 
  $node->status = 1;
  $node->promote = 0;
  $node->comment = 1;

  $node = node_submit($node);
  node_save($node);

  return "Nodo 222: " . $node->nid;

When I execute this code, it returns "Nodo 222: XXX," where XXX is an integer. If I execute it another time, I get XXX+1. When I try to load node/XXX or node/XXX+1, Drupal give me a Page not found error.

I have seen the "node" table in MySQL (via PHPMyAdmin), and nids XXX and XXX+1 are not present. When I create a page via node/add/page, the new nid is XXX+2 and it is saved in the "node" table too.

I have some modules installed (commerce, rules, logintoboggan and others), but this is the first time that I see this strange behavior.

So, where is my error?

2
  • Have you tried $node->is_new = TRUE;? Is there anything in the logs?
    – Triskelion
    Commented Jul 29, 2013 at 21:37
  • I dont see any issues with your code, try with $node->body['it'][0]['value'] = 'Body goes here'; bit.ly/13iisqB
    – niksmac
    Commented Jul 30, 2013 at 2:22

2 Answers 2

0

Hope this will help you,

In Drupal 7, The $node object you pass to node_save() wouldn't get it's nid member populated unless the node has been successfully saved to the node table in the database.

The auto-increment ID actually comes from the database table so if the $node object has a nid, you can pretty much guarantee the record has been successfully inserted into the table.

Im just guessing check for "node" table paging.

Clear drupal cache and check again.

I have used the below code and it is working fine for me, you can refer this.

  $node = new stdClass();
  $node->type = "page";
  node_object_prepare($node);
  $node->title = 'test node';
  $node->language = 'it';
  // Set node body details
  $node->body[LANGUAGE_NONE]['0']['value'] = 'test body';
  $node->body[LANGUAGE_NONE][0]['summary'] = text_summary('test body');
  $node->body[LANGUAGE_NONE][0]['format'] = 'filtered_html';
  //.. other fields goes here
  $node->uid = 1;
  $node->status = 1;
  $node->promote = 0;
  $node->comment = 1;
  if ($node = node_submit($node)) {
    node_save($node);
    drupal_set_message('NODE : ' .$node->nid);
  }

0

The error in the code shown in the question is that it's setting $node->nid, but not $node->is_new. For node_save(), the node is an existing node that needs to be updated. In fact, the function contains the following code.

// Load the stored entity, if any.
if (!empty($node->nid) && !isset($node->original)) {
  $node->original = entity_load_unchanged('node', $node->nid);
}
field_attach_presave('node', $node);
global $user;

// Determine if we will be inserting a new node.
if (!isset($node->is_new)) {
  $node->is_new = empty($node->nid);
}
// Save the node and node revision.
if ($node->is_new) {

  // For new nodes, save new records for both the node itself and the node
  // revision.
  drupal_write_record('node', $node);
  _node_save_revision($node, $user->uid);
  $op = 'insert';
}
else {
  // For existing nodes, update the node record which matches the value of
  // $node->nid.
  drupal_write_record('node', $node, 'nid');
  
  // …
}

It tries to update a database record that doesn't find, if there aren't nodes with that node ID, and it doesn't save anything. That's why you don't find a node with that node ID, in the table used for the nodes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.