You are here

function webform_node_update in Webform 7.3

Same name and namespace in other branches
  1. 6.3 webform.module \webform_node_update()
  2. 7.4 webform.module \webform_node_update()

Implements hook_node_update().

File

./webform.module, line 1173
This module provides a simple way to create forms and questionnaires.

Code

function webform_node_update($node) {
  if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
    return;
  }

  // Check if this node needs a webform record at all. If it matches the
  // defaults, any existing record will be deleted.
  webform_check_record($node);

  // If a webform row doesn't even exist, we can assume it needs to be inserted.
  // If the the webform matches the defaults, no row will be inserted.
  if (!$node->webform['record_exists']) {
    webform_node_insert($node);
    return;
  }

  // Update the webform entry.
  $node->webform['nid'] = $node->nid;
  drupal_write_record('webform', $node->webform, array(
    'nid',
  ));

  // Compare the webform components and don't do anything if it's not needed.
  // The internal cache needs to be reset here so that the cached node entity
  // does not get loaded and invalidate the comparisons.
  $original = node_load($node->nid, NULL, TRUE);
  if ($original->webform['components'] != $node->webform['components']) {
    module_load_include('inc', 'webform', 'includes/webform.components');
    $original_cids = array_keys($original->webform['components']);
    $current_cids = array_keys($node->webform['components']);
    $all_cids = array_unique(array_merge($original_cids, $current_cids));
    $deleted_cids = array_diff($original_cids, $current_cids);
    $inserted_cids = array_diff($current_cids, $original_cids);
    foreach ($all_cids as $cid) {
      if (in_array($cid, $inserted_cids)) {
        webform_component_insert($node->webform['components'][$cid]);
      }
      elseif (in_array($cid, $deleted_cids)) {
        webform_component_delete($node, $original->webform['components'][$cid]);
      }
      elseif ($node->webform['components'][$cid] != $original->webform['components'][$cid]) {
        $node->webform['components'][$cid]['nid'] = $node->nid;
        webform_component_update($node->webform['components'][$cid]);
      }
    }
  }

  // Compare the webform e-mails and don't do anything if it's not needed.
  if ($original->webform['emails'] != $node->webform['emails']) {
    module_load_include('inc', 'webform', 'includes/webform.emails');
    $original_eids = array_keys($original->webform['emails']);
    $current_eids = array_keys($node->webform['emails']);
    $all_eids = array_unique(array_merge($original_eids, $current_eids));
    $deleted_eids = array_diff($original_eids, $current_eids);
    $inserted_eids = array_diff($current_eids, $original_eids);
    foreach ($all_eids as $eid) {
      if (in_array($eid, $inserted_eids)) {
        webform_email_insert($node->webform['emails'][$eid]);
      }
      elseif (in_array($eid, $deleted_eids)) {
        webform_email_delete($node, $original->webform['emails'][$eid]);
      }
      elseif ($node->webform['emails'][$eid] != $original->webform['emails'][$eid]) {
        $node->webform['emails'][$eid]['nid'] = $node->nid;
        webform_email_update($node->webform['emails'][$eid]);
      }
    }
  }

  // Just delete and re-insert roles if they've changed.
  if ($original->webform['roles'] != $node->webform['roles']) {
    db_delete('webform_roles')
      ->condition('nid', $node->nid)
      ->execute();
    foreach (array_filter($node->webform['roles']) as $rid) {
      db_insert('webform_roles')
        ->fields(array(
        'nid' => $node->nid,
        'rid' => $rid,
      ))
        ->execute();
    }
  }

  // Flush the block cache if block settings have been changed.
  if ($node->webform['block'] != $original->webform['block']) {
    block_flush_caches();
  }
}