You are here

function _relation_add_field_instance_settings_form in Relation add 7

Process callback for relation_add_field_instance_settings_form().

1 string reference to '_relation_add_field_instance_settings_form'
relation_add_field_instance_settings_form in ./relation_add.module
Implements hook_field_instance_settings_form().

File

./relation_add.module, line 389
Relation Add module file.

Code

function _relation_add_field_instance_settings_form($form, $form_state) {
  $field = isset($form_state['relation_add']['field']) ? $form_state['relation_add']['field'] : $form['#field'];
  $instance = isset($form_state['relation_add']['instance']) ? $form_state['relation_add']['instance'] : $form['#instance'];
  $relation_types = relation_get_types();
  $bundle_key = $instance['entity_type'] . ':' . $instance['bundle'];
  $bundle_wildcard_key = $instance['entity_type'] . ':*';
  $options = array();
  foreach ($relation_types as $relation_type => $relation_type_data) {
    foreach ($relation_type_data->source_bundles as $relation_bundle_key) {
      if ($bundle_key == $relation_bundle_key || $bundle_wildcard_key == $relation_bundle_key) {
        $options[$relation_type] = $relation_type_data->label;
      }
    }
    foreach ($relation_type_data->target_bundles as $relation_bundle_key) {
      if ($bundle_key == $relation_bundle_key || $bundle_wildcard_key == $relation_bundle_key) {
        $options[$relation_type . ':reverse'] = t('@relation_label (reverse)', array(
          '@relation_label' => $relation_type_data->label,
        ));
      }
    }
  }
  ksort($options);
  $form['relation_type'] = array(
    '#type' => 'select',
    '#title' => t('Relation types'),
    '#description' => t('Select all the relation types you want to display in the relation add field. Only relation types applicable to this entity bundle are shown here. If no relation_types are selected, relations of all types will be displayed.'),
    '#default_value' => $instance['settings']['relation_type'],
    '#options' => $options,
    '#multiple' => TRUE,
    '#ajax' => array(
      'event' => 'change',
      'callback' => 'relation_add_settings_ajax',
      'wrapper' => 'relation_target_bundles',
    ),
  );
  $relation_selected_types = !empty($instance['settings']['relation_type']) ? $instance['settings']['relation_type'] : array();
  $relation_relevant_bundles = array();
  foreach ($relation_selected_types as $rel_type) {
    $type_array = explode(':', $rel_type);
    $relation_type = relation_type_load($type_array[0]);
    if (isset($type_array[1]) && $type_array[1] == 'reverse') {
      foreach ($relation_type->source_bundles as $source_bundle) {
        $relation_relevant_bundles[$source_bundle] = $source_bundle;
      }
    }
    else {
      foreach ($relation_type->target_bundles as $target_bundles) {
        $relation_relevant_bundles[$target_bundles] = $target_bundles;
      }
    }
  }
  $entity_infos = entity_get_info();
  $relation_bundles = array();
  $counter = 0;
  foreach ($relation_relevant_bundles as $relation_bundle) {
    list($entity_type, $bundle) = explode(':', $relation_bundle);
    if ('*' == $bundle) {
      foreach ($entity_infos[$entity_type]['bundles'] as $bundle_name => $bundle) {
        $relation_bundles[$entity_infos[$entity_type]['label']][$entity_type . ':' . $bundle_name] = $bundle['label'];
        ++$counter;
      }
    }
    else {
      if (isset($entity_infos[$entity_type]['bundles'][$bundle])) {
        $relation_bundles[$entity_infos[$entity_type]['label']][$entity_type . ':' . $bundle] = $entity_infos[$entity_type]['bundles'][$bundle]['label'];
        ++$counter;
      }
    }
  }
  $form['relation_target_bundles'] = array(
    '#type' => 'select',
    '#title' => t('Target bundles'),
    '#options' => $relation_bundles,
    '#size' => max(5, $counter),
    '#default_value' => isset($instance['settings']['relation_target_bundles']) ? $instance['settings']['relation_target_bundles'] : '',
    '#multiple' => TRUE,
    '#description' => t("Select the target bundle's type. Useful if you want to create separate fields for different possible target bundles."),
    '#prefix' => '<div id="relation-add-target-bundles">',
    '#suffix' => '</div>',
  );
  if (count($instance['settings']['relation_type']) > 1) {

    // The default value can only be set
    // if there are more than 1 relation types.
    $form['fieldset'] = array(
      '#type' => 'fieldset',
      '#title' => t('Default value'),
      '#collapsible' => FALSE,
    );
    $form['fieldset']['content'] = array(
      '#pre' => '<p>',
      '#markup' => t('The default value for this field, used when creating new content.'),
      '#suffix' => '</p>',
    );
    foreach ($instance['settings']['relation_type'] as $rel_type) {
      $type_array = explode(':', $rel_type);
      $relation_type = relation_type_load($type_array[0]);
      $types[$rel_type] = isset($type_array[1]) ? $relation_type->reverse_label : $relation_type->label;
    }
    $form['fieldset']['default_value'] = array(
      '#type' => 'select',
      '#title' => t('Relation type'),
      '#options' => $types,
      '#default_value' => isset($instance['settings']['fieldset']['default_value']) ? $instance['settings']['fieldset']['default_value'] : '',
      '#empty_value' => '',
      '#empty_option' => t('Select a relation type'),
    );
  }
  return $form;
}