function entityreference_autofill_populate_form_by_field in Entity reference autofill 7
Populate other form fields with respect to this module's field settings.
Parameters
int $referenced_target_id: id of referenced entity to fetch data from.
string $reference_field_name: name of entity reference field triggering this call.
string $langcode: current language.
array $autofill_field_settings: module settings for $reference_field_name in current context.
string $entity_type: the entity type of the referencing form.
string $bundle: the bundle of the referencing form
string $form: the $form array.
string $form_state: the $form_state array.
1 call to entityreference_autofill_populate_form_by_field()
File
- ./entityreference_autofill.module, line 275 
- Entity reference autofill module.
Code
function entityreference_autofill_populate_form_by_field($referenced_target_id, $reference_field_name, $langcode, $autofill_field_settings, $entity_type, $bundle, &$form, &$form_state) {
  // Entity reference field.
  $reference_field = field_form_get_state($form['#parents'], $reference_field_name, LANGUAGE_NONE, $form_state);
  // Reference entity metadata.
  $referenced_entity_type = $reference_field['field']['settings']['target_type'];
  // No value, quit processing.
  if (!is_numeric($referenced_target_id)) {
    return;
  }
  // Load referenced entity.
  $referenced_entity = entity_load_single($referenced_entity_type, $referenced_target_id);
  // Populate fields with values from referenced node.
  $autofill_fields = $autofill_field_settings['fields'];
  $overwrite = $autofill_field_settings['overwrite'];
  // Empty current form_state for this bundle.
  if (!isset($form_state['entityreference_autofill'][$entity_type][$bundle])) {
    $form_state['entityreference_autofill'][$entity_type][$bundle] = array();
  }
  drupal_array_set_nested_value($form_state['entityreference_autofill'][$entity_type][$bundle], $form['#parents'], array());
  $autofill_map =& drupal_array_get_nested_value($form_state['entityreference_autofill'][$entity_type][$bundle], $form['#parents']);
  // Load relevant part of form's input array.
  $form_input =& drupal_array_get_nested_value($form_state['input'], $form['#parents']);
  // Save current form entity, in case field_default_form gets any ideas on
  // multiple value form elements.
  // @see https://www.drupal.org/node/2318109#comment-9068141
  $preserved_entity = isset($form['#entity']) ? $form['#entity'] : FALSE;
  foreach ($autofill_fields as $field_name) {
    if (isset($form[$field_name])) {
      // Language fail-safe for referenced entity.
      // Use field language or undefined if empty.
      // Makes referenced values sensitive to language
      // selection in entity form.
      // @see https://drupal.org/node/2205245
      $referenced_language = isset($form_state['values']['language']) ? $form_state['values']['language'] : $langcode;
      // Limit to allowed language(s) for this field, fallback to undefined.
      $referenced_language = field_language($referenced_entity_type, $referenced_entity, $field_name, $referenced_language);
      if (empty($referenced_language)) {
        $referenced_language = LANGUAGE_NONE;
      }
      // Get current field's language.
      $field_language = $form[$field_name]['#language'];
      // Consider overwrite setting.
      if (!$overwrite) {
        if (_entityreference_autofill_field_has_value($form_input[$field_name][$field_language], $field_name)) {
          continue;
        }
      }
      // Load new value.
      $items = field_get_items($referenced_entity_type, $referenced_entity, $field_name, $referenced_language);
      if (!empty($items)) {
        // Add callback info if AJAX.
        $autofill_map[$field_name] = _entityreference_autofill_get_wrapper($entity_type, $bundle, $field_name, $form['#parents']);
        // Field information for rendering form.
        $field = field_info_field($field_name);
        $instance = field_info_instance($entity_type, $field_name, $bundle);
        // Let other modules interact with $form_state prior to
        // generating this field's form.
        // @see entityreference_autofill.api.php
        $context = array(
          'form' => $form,
          'field' => $field,
          'instance' => $instance,
          'items' => $items,
          'langcode' => $referenced_language,
          'reference_field_name' => $reference_field_name,
        );
        drupal_alter('entityreference_autofill_fill_items', $form_state, $context);
        // Replace field state with referenced values.
        // This is needed for multi-value fields with different
        // cardinality in source and destination.
        $field_state = field_form_get_state($form['#parents'], $field_name, $field_language, $form_state);
        $field_state['items_count'] = count($items);
        field_form_set_state($form['#parents'], $field_name, $field_language, $form_state, $field_state);
        // Replace field with new defaults.
        // @todo $referenced_language or $field_language here?
        // Implications if they differ?
        $field_form = field_default_form($referenced_entity_type, $referenced_entity, $field, $instance, $referenced_language, $items, $form, $form_state);
        // Reset form entity.
        // @see https://www.drupal.org/node/2318109#comment-9068141
        if ($preserved_entity) {
          $form['#entity'] = $preserved_entity;
        }
        $form[$field_name] = reset($field_form);
        // Unset current input to use new default values in form.
        unset($form_input[$field_name]);
      }
    }
  }
}