You are here

public function EntityReferenceAutofillInstanceBehavior::settingsForm in Entity reference autofill 7

Generate a settings form for this handler.

Overrides EntityReference_BehaviorHandler_Abstract::settingsForm

File

plugins/behavior/EntityReferenceAutofillInstanceBehavior.class.php, line 15
Entity reference behavior handler for autofill module.

Class

EntityReferenceAutofillInstanceBehavior
Class for handling module behavior.

Code

public function settingsForm($field, $instance) {

  // Current settings.
  $settings = $instance['settings']['behaviors']['autofill'];
  $widget = $instance['widget'];

  // Load available fields from instance bundle.
  $entity_type = $instance['entity_type'];
  $bundle_name = $instance['bundle'];
  $bundle_info = field_info_instances($entity_type, $bundle_name);

  // Field target metadata.
  $field_map = field_info_field_map();
  $target_type = $field['settings']['target_type'];
  $target_bundles = isset($field['settings']['handler_settings']['target_bundles']);
  $target_bundles = $target_bundles ? $field['settings']['handler_settings']['target_bundles'] : array();

  // Skip autofill for the reference field.
  unset($bundle_info[$field['field_name']]);

  // Create checkboxes options for available fields.
  $field_options = array();
  foreach ($bundle_info as $field_name => $field_info) {
    if (!empty($field_map[$field_name]['bundles'][$target_type])) {
      $available_bundles = $field_map[$field_name]['bundles'][$target_type];

      // Determine all targeted bundles that use this field.
      $option_bundles = empty($target_bundles) ? $available_bundles : array_intersect($target_bundles, $available_bundles);
      if (!empty($option_bundles)) {
        $field_options[$field_name] = t('@field_label (@field_name): <em>Available in bundle(s) @bundles</em>', array(
          '@field_label' => $field_info['label'],
          '@field_name' => $field_name,
          '@bundles' => implode(', ', $option_bundles),
        ));
      }
    }
  }
  $form['overwrite'] = array(
    '#type' => 'checkbox',
    '#title' => t('Overwrite existing data'),
    '#description' => t('Select if you want to overwrite fields that already have values. <br/><em><strong>NOTE:</strong> Disabling this is experimental and might not work 100%. If you experience issues with fields being overridden nonetheless, please report what field type and settings this occurs on in the modules issue queue on drupal.org</em>'),
    '#default_value' => isset($settings['overwrite']) ? $settings['overwrite'] : 1,
  );
  if (empty($field_options)) {
    $no_fields_found = t('There are no common fields between this bundle and its referenced entities.');
    $usage_instructions = t('To use autofill, you need to add instances of the same fields to its referenced bundles.');
    $form['no_fields'] = array(
      '#markup' => '<div class="messages warning">' . $no_fields_found . $usage_instructions . '</div>',
      '#type' => 'item',
    );
  }
  else {
    $form['fields'] = array(
      '#type' => 'checkboxes',
      '#title' => t('Fields'),
      '#options' => $field_options,
      '#description' => t('Select which fields from the referenced entity you want to load on changing the value of this field.'),
      '#default_value' => isset($settings['fields']) ? $settings['fields'] : array(),
    );
  }
  return $form;
}