You are here

function wf_crm_configure_form_submit in Webform CiviCRM Integration 7.3

Same name and namespace in other branches
  1. 7.5 includes/wf_crm_admin_form.inc \wf_crm_configure_form_submit()
  2. 7.4 includes/wf_crm_admin_form.inc \wf_crm_configure_form_submit()

Submission handler, saves CiviCRM options for a Webform node

File

./webform_civicrm_admin.inc, line 767

Code

function wf_crm_configure_form_submit($form, &$form_state) {
  $button = $form_state['clicked_button']['#id'];
  $node = node_load($nid = $form_state['storage']['nid']);
  $vals = wf_crm_aval($form_state, 'storage:vals', $form_state['values']);
  if (empty($node->webform_civicrm) && !$vals['nid'] || $button == 'edit-cancel') {
    $form_state['rebuild'] = TRUE;
    unset($form_state['storage']['msg']);
    return;
  }
  unset($form_state['storage']);
  civicrm_initialize();
  $delete_me = $enabled = $existing = wf_crm_enabled_fields($node, NULL, TRUE);
  $created = $deleted = 0;
  $fields = wf_crm_get_fields();
  $sets = wf_crm_get_fields('sets');

  // Fields to delete
  foreach ($enabled as $key => $val) {
    $val = (array) wf_crm_aval($vals, $key);
    if (in_array('create_civicrm_webform_element', $val, TRUE) && $vals['nid'] || strpos($key, 'fieldset') !== FALSE) {
      unset($delete_me[$key]);
    }
  }

  // Display a confirmation before deleting fields
  if ($delete_me && $button == 'edit-submit') {
    $msg = '<p>' . t('These existing fields are no longer needed for CiviCRM processing based on your new form settings.') . '</p><ul>';
    foreach ($delete_me as $key => $id) {
      list(, $c, $ent, $n, $table, $name) = explode('_', $key, 6);
      $info = '';
      if ($ent == 'contact' || $ent == 'participant') {
        $info = '<em>' . t('Contact !num', array(
          '!num' => $c,
        ));
      }
      if ($info && isset($sets[$table]['max_instances'])) {
        $info .= ' ' . $sets[$table]['label'] . ' ' . $n;
      }
      $info .= $info ? ':</em> ' : '';
      $msg .= '<li>' . $info . $node->webform['components'][$id]['name'] . '</li>';
    }
    $msg .= '</ul><p>' . t('Would you like them to be automatically removed from the webform? This is recommended unless you need to keep webform-results information from these fields. (They can still be deleted manually later if you choose not to remove them now.)') . '</p><p><em>' . t('Note: Deleting webform components cannot be undone, and will result in the loss of webform-results info for those elements. Data in the CiviCRM database will not be affected.') . '</em></p>';
    $form_state['storage']['msg'] = $msg;
    $form_state['storage']['vals'] = $vals;
    $form_state['rebuild'] = TRUE;
    return;
  }
  module_load_include('inc', 'webform', 'includes/webform.components');
  module_load_include('inc', 'webform_civicrm', 'contact_component');
  $form_state['redirect'] = 'node/' . $nid . '/webform';

  // Delete/disable fields
  if ($button === 'edit-delete' || $button === 'edit-disable' && $vals['nid']) {
    foreach ($delete_me as $id) {
      $field = $node->webform['components'][$id];
      unset($enabled[$field['form_key']]);
      ++$deleted;
      if ($button === 'edit-delete') {
        webform_component_delete($node, $field);
      }
      else {
        $field['form_key'] = 'disabled' . substr($field['form_key'], 7);
        webform_component_update($field);
      }
    }
    if ($deleted == 1) {
      $p = array(
        '%name' => $field['name'],
      );
      drupal_set_message($button === 'edit-delete' ? t('Deleted field: %name', $p) : t('Disabled field: %name', $p));
    }
    else {
      $p = array(
        '!num' => $deleted,
      );
      drupal_set_message($button === 'edit-delete' ? t('Deleted !num fields.', $p) : t('Disabled !num fields.', $p));
    }
    if ($button === 'edit-disable') {
      drupal_set_message(t('Disabled fields will still be processed as normal Webform fields, but they will not be autofilled from or saved to the CiviCRM database.'));
    }
    else {

      // Remove empty fieldsets for deleted contacts
      foreach ($enabled as $key => $id) {
        if (substr($key, -8) == 'fieldset') {
          list(, $c, $ent, $i) = explode('_', $key);
          if ($ent == 'contact' && $i == 1 && (!$vals['nid'] || $c > $vals['number_of_contacts'])) {
            if (!_wf_crm_child_components($node->nid, $id)) {
              webform_component_delete($node, $node->webform['components'][$id]);
            }
          }
        }
      }
    }
  }

  // Disable CiviCRM for this form
  if (!$vals['nid']) {
    wf_crm_disable($nid);
    drupal_set_message(t('CiviCRM processing for this form is now disabled.'));
  }
  else {
    webform_ensure_record($node);
    wf_crm_process_form_settings($vals);
    if (!$vals['toggle_message']) {
      $vals['message'] = '';
    }

    // Index disabled components
    $disabled = array();
    foreach (wf_crm_aval($node->webform, 'components', array()) as $field) {
      if (substr($field['form_key'], 0, 9) === 'disabled_') {
        $field['form_key'] = 'civicrm' . substr($field['form_key'], 8);
        $disabled[$field['form_key']] = $field;
      }
    }
    $i = 0;
    foreach ($vals as $key => $val) {
      if (substr($key, 0, 7) == 'civicrm') {
        ++$i;
        list(, $c, $ent, $n, $table, $name) = explode('_', $key, 6);
        $aval = (array) $val;
        if (is_array($val)) {
          unset($val['create_civicrm_webform_element']);
        }
        elseif ($val == 'create_civicrm_webform_element') {
          $val = '';
        }
        if (!isset($enabled[$key]) && in_array('create_civicrm_webform_element', $aval, TRUE)) {

          // Restore disabled component
          if (isset($disabled[$key])) {
            webform_component_update($disabled[$key]);
            $enabled[$key] = $disabled[$key]['cid'];
            drupal_set_message(t('Re-enabled field: %name', array(
              '%name' => $disabled[$key]['name'],
            )));
          }
          else {
            $field = $fields[$table . '_' . $name];
            $field['nid'] = $nid;
            $field['form_key'] = $key;
            $field['weight'] = $i;
            wf_crm_component_insert($field, $enabled, $vals);
            ++$created;
          }
        }
        elseif (isset($fields[$table . '_' . $name]['expose_list']) && !empty($val)) {
          $vals['data'][$ent][$c][$table][$n][$name] = $val;
        }
      }
    }
    if ($created == 1) {
      drupal_set_message(t('Created field: %name', array(
        '%name' => $field['name'],
      )));
    }
    elseif ($created) {
      drupal_set_message(t('Created !num new fields.', array(
        '!num' => $created,
      )));
    }

    // Create record
    if (empty($node->webform_civicrm)) {
      drupal_write_record('webform_civicrm_forms', $vals);
      drupal_set_message(t('CiviCRM processing for this form is now enabled.'));
    }
    else {
      drupal_write_record('webform_civicrm_forms', $vals, 'nid');
      drupal_set_message(t('Your CiviCRM form settings have been updated.'));
    }

    // Update existing contact fields
    foreach ($existing as $fid => $id) {
      if (substr($fid, -8) === 'existing') {
        wf_crm_update_existing_component($node->webform['components'][$id], $enabled, $vals['data']);
      }
    }
  }

  // Make sure the updates are visible to anonymous users.
  cache_clear_all();

  // Clear the entity cache.
  if (module_exists('entitycache')) {
    cache_clear_all($nid, 'cache_entity_node');
  }
}