function webform_node_update in Webform 7.3
Same name and namespace in other branches
- 6.3 webform.module \webform_node_update()
- 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();
}
}