You are here

function fel_fields_field_attach_form in Form element layout 7

Implements hook_field_attach_form().

Convert field setting for description position to Form API attribute '#description_display' and insert it in the form element tree where the configured field description resides.

File

modules/fel_fields/fel_fields.module, line 106
Field support for Form element layout (fel.module).

Code

function fel_fields_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
  ctools_include('plugins');
  list(, , $bundle) = entity_extract_ids($entity_type, $entity);
  $instances = field_info_instances($entity_type, $bundle);
  $field_langcodes = field_language($entity_type, $entity, NULL, $langcode);
  foreach ($instances as $instance) {
    $field_name = $instance['field_name'];
    $field_lang = empty($field_langcodes[$field_name]) ? LANGUAGE_NONE : $field_langcodes[$field_name];
    if (empty($form[$field_name][$field_lang])) {
      continue;
    }
    $field = field_info_field($field_name);
    $default_behavior = field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT;
    $multiple = ($field['cardinality'] > 1 or $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED);
    $field_form =& $form[$field_name][$field_lang];

    // We're unconditionally taking over the theme for rendering fields with
    // default behavior, for all fields, all over.
    if ($default_behavior) {
      $field_form['#theme'] = 'fel_fields_multiple_form';
    }

    // Add attributes to the root item. For default behavior with single
    // values, also add it to $delta = 0. This covers a lot of ground.
    _fel_fields_add_attributes($field_form, $instance);
    if ($default_behavior and !$multiple) {
      _fel_fields_add_attributes($field_form[0], $instance);
    }

    // The plugin system should run independent of whether descriptions exists
    // or not. Some plugins use this to replace themes down the form tree.
    $plugin = ctools_get_plugins('fel_fields', 'description_display', $instance['widget']['module']);
    if ($plugin) {
      $columns = array();
      if (!empty($plugin['callback'])) {
        $ret = $plugin['callback']($field, $instance, $field_form);
        $columns = is_array($ret) ? $ret : array();
      }
      elseif (!empty($plugin['columns'])) {
        $columns = $plugin['columns'];
      }
    }
    if ($default_behavior) {
      if ($multiple) {

        // This is handled in theme_fel_fields_multiple_form().
        continue;
      }

      // Adapt to field.module's default behavior.
      $field_form =& $field_form[0];
    }
    if ($plugin) {
      foreach ($columns as $column) {
        _fel_fields_add_attributes($field_form[$column], $instance);
      }
    }
    else {

      // Last resort. Do a recursive search for #description and add
      // complementary #description_display if found.
      fel_fields_assign_layout_deep($field_form, $instance);
    }
  }
}