drupal_set_message on node edit page shows twice with theme hook I want to display a value of a field which the user has no access to in a dsm when the user edits the page. The dsm is showing up after saving the node, and while that's fine (I'd even consider it a feature) it's showing the before-edit value of the node.

I believe I've run into this problem but there doesn't seem to be an easy fix. Here's a look at the template.php function.

function themename_form_vakature_node_form_alter(&amp;$form){
    if(isset($form['#node']-&gt;field_vacature_scheduled_for_unp)){
        if($form['#node']-&gt;field_vacature_scheduled_for_unp['und'][0]['value']){
            $expirydate = date("F j Y",$form['#node']-&gt;field_unpublish_date['und'][0]['value']);

            if($form['#node']-&gt;field_unpublish_date['und'][0]['value'] &lt; time()){
                drupal_set_message(t("This vacature has expired."),'status',FALSE);
            }
            else{
                drupal_set_message(t("This vacature will expire at: ").$expirydate,'status',FALSE);
            }
        }
    }
}


Basically, the message displayed on the edit page is repeated after a save. I need it to either not repeat or show the correct updated information.
Form alter changes the form when it's being built for display.

If you want to use the value on the node after update, use a hook like


hook_node_presave or
hook_node_update


instead.

To tweak your code snippet, something like:

/**
 * Implements hook_node_presave
 */
function mymodule_node_presave($node){
  if ($items = field_get_items('node', $node, 'field_vacature_scheduled_for_unp')) {
    $vacature = reset($items); // Use first field item value
    $expirydate = date("F j Y", $vacature['value']);
    $items = field_get_items('node', $node, 'field_unpublish_date')
    $unpublish = reset($items); // Use first field value
    if ($unpublish['value'] &lt; time()) {
      drupal_set_message(t("This vacature has expired."), 'status', FALSE);
    }
    else{
      drupal_set_message(t("This vacature will expire at: "). $expirydate, 'status', FALSE);
    }
  }
}