You are here

public function CivicrmInlineEntityFormController::entityFormSubmit in CiviCRM Entity 7.2

Handles the submission of an entity form.

Prepares the entity stored in $entity_form['#entity'] for saving by copying the values from the form to matching properties and, if the entity is fieldable, invoking Field API submit.

Parameters

$entity_form: The entity form.

$form_state: The form state of the parent form.

Overrides EntityInlineEntityFormController::entityFormSubmit

File

modules/civicrm_entity_inline/includes/civicrm.civicrm_entity_inline.inc, line 348

Class

CivicrmInlineEntityFormController

Code

public function entityFormSubmit(&$entity_form, &$form_state) {

  //$entity_type = $form_state['entity_type'];
  $entity_type = $entity_form['#entity_type'];
  $ief_id = $entity_form['#ief_id'];
  $field_name = $form_state['inline_entity_form'][$ief_id]['instance']['field_name'];
  $op = $entity_form['#op'];
  civicrm_initialize();
  $civicrm_entity_fields = civicrm_api(substr_replace($entity_type, '', 0, 8), 'getfields', array(
    'version' => 3,
    'action' => 'create',
  ));
  if ($op == 'edit') {
    foreach ($form_state['inline_entity_form'][$ief_id]['entities'] as $k => &$entity_array) {
      if (isset($form_state['values'][$field_name]['und']['entities'][$k]['form'])) {
        foreach ($form_state['values'][$field_name]['und']['entities'][$k]['form'] as $key => $value) {
          if (substr($key, 0, 7) == 'custom_') {
            if ($civicrm_entity_fields['values'][$key]['html_type'] == 'CheckBox') {
              if (is_array($value)) {
                $stored_value = array();
                foreach ($value as $option => $checkbox_value) {
                  if ($checkbox_value) {
                    $stored_value[] = $option;
                  }
                }
                $entity_array['entity']->{$key} = !empty($stored_value) ? $stored_value : array(
                  '',
                );
              }
            }
            else {
              if (is_array($value) && isset($value['value'])) {
                $value = $value['value'];
                $form_state['values'][$field_name]['und']['entities'][$k]['form'][$key] = $value;
              }
              $entity_array['entity']->{$key} = $value;
            }
            if (!empty($civicrm_entity_fields['values'][$key]['is_view'])) {
              unset($entity_array['entity']->{$key});
            }
          }
          else {
            if (is_array($value) && isset($value['value'])) {
              $value = $value['value'];
              $form_state['values'][$field_name]['und']['entities'][$k]['form'][$key] = $value;
            }
            $entity_array['entity']->{$key} = $value;
          }
        }
        if ($entity_array['entity']->is_new = isset($entity_array['entity']->is_new) ? $entity_array['entity']->is_new : 0) {
          $entity_array['entity']->created = time();
        }
        $entity_array['entity']->changed = time();
        field_attach_submit($entity_type, $entity_array['entity'], $entity_form, $form_state);
      }
    }
  }
  elseif ($op == 'create' || $op == 'add') {
    $entity = $entity_form['#entity'];
    $child_form_state_values = drupal_array_get_nested_value($form_state['values'], $entity_form['#parents']);
    $field_info = field_info_field($field_name);
    $field_target_id_column = !empty($field_info['settings']['target_id_column']) ? $field_info['settings']['target_id_column'] : '';
    $field_host_source_id = !empty($field_info['settings']['host_source_id']) ? $field_info['settings']['host_source_id'] : '';
    $this
      ->fillEntityValues($child_form_state_values, $entity, $civicrm_entity_fields);
    if (!empty($entity->is_new) && !empty($entity->id)) {
      $entity->is_new = FALSE;
      if ($entity_type == 'civicrm_contact') {
        $entity->contact_id = $entity->id;
      }
    }
    if ($entity->is_new = isset($entity->is_new) ? $entity->is_new : 0) {
      $entity->created = time();
    }
    $entity->changed = time();

    // First parent name is not the field name, then this reference field is nested inside another
    if ($field_name != $entity_form['#parents'][0]) {
      $parent_field_parents = array();
      foreach ($entity_form['#parents'] as $index => $name) {
        $parent_field_parents[] = $name;
        if ($name == $field_name) {
          unset($parent_field_parents[$index]);
          $parent_field_name = $entity_form['#parents'][$index - 3];
          break;
        }
      }
      $parent_field_info = field_info_field($parent_field_name);
      if (!empty($parent_field_info['settings']['target_type'])) {
        $parent_field_entity_type = $parent_field_info['settings']['target_type'];
      }
      elseif (!empty($parent_field_info['settings']['target_entity_type'])) {
        $parent_field_entity_type = $parent_field_info['settings']['target_entity_type'];
      }
      if (!empty($parent_field_parents) && !empty($parent_field_entity_type) && !empty($field_host_source_id) && !empty($field_target_id_column)) {
        $parent_submitted_values = drupal_array_get_nested_value($form_state['values'], $parent_field_parents);
        if (empty($parent_submitted_values[$field_host_source_id])) {

          // save parent entity and update something?
          $parent_field_entity = new CivicrmEntity(array(), $parent_field_entity_type);
          $this
            ->fillEntityValues($parent_submitted_values, $parent_field_entity, $civicrm_entity_fields);
          $parent_field_wrapper = entity_metadata_wrapper($parent_field_entity_type, $parent_field_entity);
          $parent_field_wrapper
            ->save();
          $parent_submitted_values[$field_host_source_id] = $parent_field_wrapper->{$field_host_source_id}
            ->value();
          if ($parent_field_entity_type == 'civicrm_contact') {
            $parent_field_wrapper->contact_id
              ->set($parent_field_wrapper->{$field_host_source_id}
              ->value());
            $parent_submitted_values['contact_id'] = $parent_field_wrapper->{$field_host_source_id}
              ->value();
          }
          $child_form_state_values[$field_target_id_column] = $parent_field_wrapper->{$field_host_source_id}
            ->value();

          //$entity->{$field_target_id_column} = $parent_field_wrapper->{$field_host_source_id}->value();
          drupal_array_set_nested_value($form_state['values'], $parent_field_parents, $parent_submitted_values);
          foreach ($form_state['inline_entity_form'] as $iefid => $ief_data) {
            if ($ief_data['instance']['field_name'] == $parent_field_name) {
              $entity_count = count($form_state['inline_entity_form'][$iefid]['entities']);

              //$form_state['inline_entity_form'][$iefid]['entities'][$entity_count]['entity'] = $parent_field_wrapper->value();
              if ($parent_field_entity_type == 'civicrm_contact') {

                //$form_state['inline_entity_form'][$iefid]['entities'][$entity_count]['entity']->contact_id = $parent_field_wrapper->{$field_host_source_id}->value();
              }

              //$form_state['inline_entity_form'][$iefid]['entities'][$entity_count]['needs_save'] = FALSE;
            }
          }
        }
        else {
          $child_form_state_values[$field_target_id_column] = $parent_submitted_values[$field_host_source_id];

          //$entity->{$field_target_id_column} = $parent_submitted_values[$field_host_source_id];
        }
      }
    }
    drupal_array_set_nested_value($form_state['values'], $entity_form['#parents'], $child_form_state_values);
  }

  // Add in created and changed times.
  parent::entityFormSubmit($entity_form, $form_state);
}