Last updated May 8, 2015. Created on March 7, 2014.
Edited by drupalshrek, Ashford. Log in to edit this page.

Purpose: Change a field value in an existing node.

Version: Tested and worked with Drupal 7.26

Note: If you already know the basics of creating a module, skip to Step 4 and Step 5.

==============================

Is there a Contributed Module already available that will do what I need? Always ask yourself that question before writing a custom module. The Rules.module will easily change the field value; however, I needed a query to get the field's value. I had read a warning somewhere that said any PHP code used in my Rule would be stored in the database and it was better to write your own module.

Creating modules - a tutorial: Drupal 7.x: If you have never written a module before, start here. This step by step tutorial guides you to create a basic module. I will refer to this tutorial versus repeating previously documented information.

I am a beginner at writing modules and PHP code, please feel free to Edit this Book page to improve the explanation. I think it would be terrific if the more experienced Users would Add a Child Page with an alternative way to reach the same goal.

==============================

Example content-type: news
Example module's name: update_news

Step 1 Create the update_news folder and start the php file, update_news.module (Creating Modules tutorial -Getting Started chapter.)
..
..

Step 2 Create the update_news.info file. (Creating Modules tutorial -Telling Drupal about your module chapter.)
..
..

Step 3 -Add the basic Help function to your update_news.module. (Creating Modules tutorial -Writing comments and implementing your first hook chapter.)
..

<?php
/* ***************************
 * Admin help -describe what the module does
 **************************** */
function update_news_help($path, $arg) {
  switch (
$path) {
    case
"admin/help#update_news":
      return
'<p>' . t("Updates fields in News posts") . '</p>';
      break;
  }
}
?>

..
..

Step 4 -Add the menu function, if needed. I did not have a common action, such as node published, or a scheduled event to trigger the module. I used this menu to define a URL path to trigger the action.
..

<?php
/* ***************************
* hook_menu displays menu links
* When I go to this page, trigger the function to update_news_now
* and display the results message
 **************************** */
function update_news_menu() {
 
$items = array();
 
$items['path-to/update-news-results'] = array(
   
// Page title
   
'title' => 'News update completed',
   
// What this link does
   
'description' => 'Display the update News results',
   
'type' => MENU_CALLBACK,
   
// Name of function to execute
   
'page callback' => 'update_news_now',
   
// Who can access this menu item? Select a permission already in your lists.
   
'access arguments' => array('use the administration toolbar '),
  );
  return
$items;
}
?>

..
..

Step 5 -Add the function to update the field value. See the query examples for Drupal 7 posted on www.mousewheel.net.

<?php
/* ******************************
 * Update the node field
 *
 *  Examples of syntax for different field types to set the values
 *  $node->title[$node->language][0]['value'] = 'the value goes here';
 *  $node->field_for_multi-values[$node->language][ ]['value'] = "apple, banana, orange';
 *
 *  $node->field_for_node_reference[$node->language][0]['nid'] = 3730;
 *  $node->field_for_user_reference[$node->language][0]['uid'] = 5;
 *  $node->field_for_taxonomy_term[$node->language][0]['tid'] = 114;
 *
 **************************** */
function update_news_now(){

 
// A message to display on screen when the function is finished
 
$finished_message = 'The Update News module has completed updating the nodes.';
 
 
// Your own query to get the node id (nid) and the field value you need
 
$query = db_select('node', 'N');
      
$query->Fields('N', array('nid', 'title');
       ...
rest of query);

 
// Execute the query
 
$result = $query->execute();

 
// Loop through each row item in the results
 
foreach ($result as $record) {

   
// Results from my query are in these variables
    // $record->nid = node to update
    // $record->ref_node = referenced node value

    // Load the node to update
   
$node = node_load($record->nid);
   
   
// Set the field value
   
$node->field_news_node_reference[$node->language][0]['nid'] = $record->ref_node;
   
   
// Optional lines to make this change a new revision
   
$node->revision = 1;
   
$node->log = 'This node was programmatically updated on ' . date('c');  
   
   
// Save the updated node
   
node_save($node);
  } 
 
 
// Display the message on the page
 
return $finished_message;
}
?>

Looking for support? Visit the Drupal.org forums, or join #drupal-support in IRC.

Comments

gl2748’s picture

The link to 'Writing comments and implementing your first hook'
should be:
https://www.drupal.org/node/1095546

/ /\ / /\/

Ashford’s picture

Thank you for reporting the typo in the link. I edited the text and made the correction.

_____________________________
Pay It Forward at Drupal
When you ask a Forum question, look for one you can answer.