function field_ui_field_overview_form in Drupal 7
Form constructor for the 'Manage fields' form of a bundle.
Allows fields and pseudo-fields to be re-ordered.
See also
field_ui_field_overview_form_validate()
field_ui_field_overview_form_submit()
Related topics
1 string reference to 'field_ui_field_overview_form'
- field_ui_menu in modules/
field_ui/ field_ui.module - Implements hook_menu().
File
- modules/
field_ui/ field_ui.admin.inc, line 288 - Administrative interface for custom field type creation.
Code
function field_ui_field_overview_form($form, &$form_state, $entity_type, $bundle) {
$bundle = field_extract_bundle($entity_type, $bundle);
field_ui_inactive_message($entity_type, $bundle);
$admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
// When displaying the form, make sure the list of fields is up-to-date.
if (empty($form_state['post'])) {
field_info_cache_clear();
}
// Gather bundle information.
$instances = field_info_instances($entity_type, $bundle);
$field_types = field_info_field_types();
$widget_types = field_info_widget_types();
$extra_fields = field_info_extra_fields($entity_type, $bundle, 'form');
$form += array(
'#entity_type' => $entity_type,
'#bundle' => $bundle,
'#fields' => array_keys($instances),
'#extra' => array_keys($extra_fields),
);
$table = array(
'#type' => 'field_ui_table',
'#tree' => TRUE,
'#header' => array(
t('Label'),
t('Weight'),
t('Parent'),
t('Machine name'),
t('Field type'),
t('Widget'),
array(
'data' => t('Operations'),
'colspan' => 2,
),
),
'#parent_options' => array(),
'#regions' => array(
'main' => array(
'message' => t('No fields are present yet.'),
),
'add_new' => array(
'title' => ' ',
),
),
'#attributes' => array(
'class' => array(
'field-ui-overview',
),
'id' => 'field-overview',
),
);
// Fields.
foreach ($instances as $name => $instance) {
$field = field_info_field($instance['field_name']);
$admin_field_path = $admin_path . '/fields/' . $instance['field_name'];
$table[$name] = array(
'#attributes' => array(
'class' => array(
'draggable',
'tabledrag-leaf',
),
),
'#row_type' => 'field',
'#region_callback' => 'field_ui_field_overview_row_region',
'label' => array(
'#markup' => check_plain($instance['label']),
),
'weight' => array(
'#type' => 'textfield',
'#title' => t('Weight for @title', array(
'@title' => $instance['label'],
)),
'#title_display' => 'invisible',
'#default_value' => $instance['widget']['weight'],
'#size' => 3,
'#attributes' => array(
'class' => array(
'field-weight',
),
),
),
'parent_wrapper' => array(
'parent' => array(
'#type' => 'select',
'#title' => t('Parent for @title', array(
'@title' => $instance['label'],
)),
'#title_display' => 'invisible',
'#options' => $table['#parent_options'],
'#empty_value' => '',
'#attributes' => array(
'class' => array(
'field-parent',
),
),
'#parents' => array(
'fields',
$name,
'parent',
),
),
'hidden_name' => array(
'#type' => 'hidden',
'#default_value' => $name,
'#attributes' => array(
'class' => array(
'field-name',
),
),
),
),
'field_name' => array(
'#markup' => $instance['field_name'],
),
'type' => array(
'#type' => 'link',
'#title' => t($field_types[$field['type']]['label']),
'#href' => $admin_field_path . '/field-settings',
'#options' => array(
'attributes' => array(
'title' => t('Edit field settings.'),
),
),
),
'widget_type' => array(
'#type' => 'link',
'#title' => t($widget_types[$instance['widget']['type']]['label']),
'#href' => $admin_field_path . '/widget-type',
'#options' => array(
'attributes' => array(
'title' => t('Change widget type.'),
),
),
),
'edit' => array(
'#type' => 'link',
'#title' => t('edit'),
'#href' => $admin_field_path,
'#options' => array(
'attributes' => array(
'title' => t('Edit instance settings.'),
),
),
),
'delete' => array(
'#type' => 'link',
'#title' => t('delete'),
'#href' => $admin_field_path . '/delete',
'#options' => array(
'attributes' => array(
'title' => t('Delete instance.'),
),
),
),
);
if (!empty($instance['locked'])) {
$table[$name]['edit'] = array(
'#value' => t('Locked'),
);
$table[$name]['delete'] = array();
$table[$name]['#attributes']['class'][] = 'menu-disabled';
}
}
// Non-field elements.
foreach ($extra_fields as $name => $extra_field) {
$table[$name] = array(
'#attributes' => array(
'class' => array(
'draggable',
'tabledrag-leaf',
),
),
'#row_type' => 'extra_field',
'#region_callback' => 'field_ui_field_overview_row_region',
'label' => array(
'#markup' => check_plain($extra_field['label']),
),
'weight' => array(
'#type' => 'textfield',
'#default_value' => $extra_field['weight'],
'#size' => 3,
'#attributes' => array(
'class' => array(
'field-weight',
),
),
'#title_display' => 'invisible',
'#title' => t('Weight for @title', array(
'@title' => $extra_field['label'],
)),
),
'parent_wrapper' => array(
'parent' => array(
'#type' => 'select',
'#title' => t('Parent for @title', array(
'@title' => $extra_field['label'],
)),
'#title_display' => 'invisible',
'#options' => $table['#parent_options'],
'#empty_value' => '',
'#attributes' => array(
'class' => array(
'field-parent',
),
),
'#parents' => array(
'fields',
$name,
'parent',
),
),
'hidden_name' => array(
'#type' => 'hidden',
'#default_value' => $name,
'#attributes' => array(
'class' => array(
'field-name',
),
),
),
),
'field_name' => array(
'#markup' => $name,
),
'type' => array(
'#markup' => isset($extra_field['description']) ? $extra_field['description'] : '',
'#cell_attributes' => array(
'colspan' => 2,
),
),
'edit' => array(
'#markup' => isset($extra_field['edit']) ? $extra_field['edit'] : '',
),
'delete' => array(
'#markup' => isset($extra_field['delete']) ? $extra_field['delete'] : '',
),
);
}
// Additional row: add new field.
$max_weight = field_info_max_weight($entity_type, $bundle, 'form');
$field_type_options = field_ui_field_type_options();
$widget_type_options = field_ui_widget_type_options(NULL, TRUE);
if ($field_type_options && $widget_type_options) {
$name = '_add_new_field';
$table[$name] = array(
'#attributes' => array(
'class' => array(
'draggable',
'tabledrag-leaf',
'add-new',
),
),
'#row_type' => 'add_new_field',
'#region_callback' => 'field_ui_field_overview_row_region',
'label' => array(
'#type' => 'textfield',
'#title' => t('New field label'),
'#title_display' => 'invisible',
'#size' => 15,
'#description' => t('Label'),
'#prefix' => '<div class="label-input"><div class="add-new-placeholder">' . t('Add new field') . '</div>',
'#suffix' => '</div>',
),
'weight' => array(
'#type' => 'textfield',
'#default_value' => $max_weight + 1,
'#size' => 3,
'#title_display' => 'invisible',
'#title' => t('Weight for new field'),
'#attributes' => array(
'class' => array(
'field-weight',
),
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
),
'parent_wrapper' => array(
'parent' => array(
'#type' => 'select',
'#title' => t('Parent for new field'),
'#title_display' => 'invisible',
'#options' => $table['#parent_options'],
'#empty_value' => '',
'#attributes' => array(
'class' => array(
'field-parent',
),
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
'#parents' => array(
'fields',
$name,
'parent',
),
),
'hidden_name' => array(
'#type' => 'hidden',
'#default_value' => $name,
'#attributes' => array(
'class' => array(
'field-name',
),
),
),
),
'field_name' => array(
'#type' => 'machine_name',
'#title' => t('New field name'),
'#title_display' => 'invisible',
// This field should stay LTR even for RTL languages.
'#field_prefix' => '<span dir="ltr">field_',
'#field_suffix' => '</span>‎',
'#size' => 15,
'#description' => t('A unique machine-readable name containing letters, numbers, and underscores.'),
// 32 characters minus the 'field_' prefix.
'#maxlength' => 26,
'#prefix' => '<div class="add-new-placeholder"> </div>',
'#machine_name' => array(
'source' => array(
'fields',
$name,
'label',
),
'exists' => '_field_ui_field_name_exists',
'standalone' => TRUE,
'label' => '',
),
'#required' => FALSE,
),
'type' => array(
'#type' => 'select',
'#title' => t('Type of new field'),
'#title_display' => 'invisible',
'#options' => $field_type_options,
'#empty_option' => t('- Select a field type -'),
'#description' => t('Type of data to store.'),
'#attributes' => array(
'class' => array(
'field-type-select',
),
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
),
'widget_type' => array(
'#type' => 'select',
'#title' => t('Widget for new field'),
'#title_display' => 'invisible',
'#options' => $widget_type_options,
'#empty_option' => t('- Select a widget -'),
'#description' => t('Form element to edit the data.'),
'#attributes' => array(
'class' => array(
'widget-type-select',
),
),
'#cell_attributes' => array(
'colspan' => 3,
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
),
// Place the 'translatable' property as an explicit value so that contrib
// modules can form_alter() the value for newly created fields.
'translatable' => array(
'#type' => 'value',
'#value' => FALSE,
),
);
}
// Additional row: add existing field.
$existing_fields = field_ui_existing_field_options($entity_type, $bundle);
if ($existing_fields && $widget_type_options) {
// Build list of options.
$existing_field_options = array();
foreach ($existing_fields as $field_name => $info) {
$text = t('@type: @field (@label)', array(
'@type' => $info['type_label'],
'@label' => $info['label'],
'@field' => $info['field'],
));
$existing_field_options[$field_name] = truncate_utf8($text, 80, FALSE, TRUE);
}
asort($existing_field_options);
$name = '_add_existing_field';
$table[$name] = array(
'#attributes' => array(
'class' => array(
'draggable',
'tabledrag-leaf',
'add-new',
),
),
'#row_type' => 'add_new_field',
'#region_callback' => 'field_ui_field_overview_row_region',
'label' => array(
'#type' => 'textfield',
'#title' => t('Existing field label'),
'#title_display' => 'invisible',
'#size' => 15,
'#description' => t('Label'),
'#attributes' => array(
'class' => array(
'label-textfield',
),
),
'#prefix' => '<div class="label-input"><div class="add-new-placeholder">' . t('Add existing field') . '</div>',
'#suffix' => '</div>',
),
'weight' => array(
'#type' => 'textfield',
'#default_value' => $max_weight + 2,
'#size' => 3,
'#title_display' => 'invisible',
'#title' => t('Weight for added field'),
'#attributes' => array(
'class' => array(
'field-weight',
),
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
),
'parent_wrapper' => array(
'parent' => array(
'#type' => 'select',
'#title' => t('Parent for existing field'),
'#title_display' => 'invisible',
'#options' => $table['#parent_options'],
'#empty_value' => '',
'#attributes' => array(
'class' => array(
'field-parent',
),
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
'#parents' => array(
'fields',
$name,
'parent',
),
),
'hidden_name' => array(
'#type' => 'hidden',
'#default_value' => $name,
'#attributes' => array(
'class' => array(
'field-name',
),
),
),
),
'field_name' => array(
'#type' => 'select',
'#title' => t('Existing field to share'),
'#title_display' => 'invisible',
'#options' => $existing_field_options,
'#empty_option' => t('- Select an existing field -'),
'#description' => t('Field to share'),
'#attributes' => array(
'class' => array(
'field-select',
),
),
'#cell_attributes' => array(
'colspan' => 2,
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
),
'widget_type' => array(
'#type' => 'select',
'#title' => t('Widget for existing field'),
'#title_display' => 'invisible',
'#options' => $widget_type_options,
'#empty_option' => t('- Select a widget -'),
'#description' => t('Form element to edit the data.'),
'#attributes' => array(
'class' => array(
'widget-type-select',
),
),
'#cell_attributes' => array(
'colspan' => 3,
),
'#prefix' => '<div class="add-new-placeholder"> </div>',
),
);
}
$form['fields'] = $table;
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
$form['#attached']['css'][] = drupal_get_path('module', 'field_ui') . '/field_ui.css';
$form['#attached']['js'][] = drupal_get_path('module', 'field_ui') . '/field_ui.js';
// Add settings for the update selects behavior.
$js_fields = array();
foreach ($existing_fields as $field_name => $info) {
$js_fields[$field_name] = array(
'label' => $info['label'],
'type' => $info['type'],
'widget' => $info['widget_type'],
);
}
$form['#attached']['js'][] = array(
'type' => 'setting',
'data' => array(
'fields' => $js_fields,
'fieldWidgetTypes' => field_ui_widget_type_options(),
),
);
// Add tabledrag behavior.
$form['#attached']['drupal_add_tabledrag'][] = array(
'field-overview',
'order',
'sibling',
'field-weight',
);
$form['#attached']['drupal_add_tabledrag'][] = array(
'field-overview',
'match',
'parent',
'field-parent',
'field-parent',
'field-name',
);
return $form;
}