diff --git a/modules/field/field.form.inc b/modules/field/field.form.inc index 280f778..814f9fc 100644 --- a/modules/field/field.form.inc +++ b/modules/field/field.form.inc @@ -201,6 +201,8 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form, $field_elements = array(); + $orderable = !isset($instance['widget']['orderable']) || $instance['widget']['orderable']; + $function = $instance['widget']['module'] . '_field_widget_form'; if (function_exists($function)) { for ($delta = 0; $delta <= $max; $delta++) { @@ -223,7 +225,7 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form, ); if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) { // Input field for the delta (drag-n-drop reordering). - if ($multiple) { + if ($multiple && $orderable) { // We name the element '_weight' to avoid clashing with elements // defined by widget. $element['_weight'] = array( @@ -254,7 +256,7 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form, if ($field_elements) { $field_elements += array( - '#theme' => 'field_multiple_value_form', + '#theme' => $orderable ? 'field_multiple_value_orderable_form' : 'field_multiple_value_form', '#field_name' => $field['field_name'], '#cardinality' => $field['cardinality'], '#title' => $title, @@ -289,7 +291,7 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form, /** * Returns HTML for an individual form element. * - * Combine multiple values into a table with drag-n-drop reordering. + * Combine multiple values into a form element. * TODO : convert to a template. * * @param $variables @@ -303,6 +305,45 @@ function theme_field_multiple_value_form($variables) { $output = ''; if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) { + $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : ''; + $output .= ''; + foreach (element_children($element) as $key) { + if ($key === 'add_more') { + $add_more_button = &$element[$key]; + } + else { + $output .= drupal_render($element[$key]); + } + } + $output .= $element['#description'] ? '
' . $element['#description'] . '
' : ''; + $output .= '
' . drupal_render($add_more_button) . '
'; + } + else { + foreach (element_children($element) as $key) { + $output .= drupal_render($element[$key]); + } + } + + return $output; +} + +/** + * Returns HTML for an individual form element. + * + * Combine multiple values into a table with drag-n-drop reordering. + * TODO : convert to a template. + * + * @param $variables + * An associative array containing: + * - element: A render element representing the form element. + * + * @ingroup themeable + */ +function theme_field_multiple_value_orderable_form($variables) { + $element = $variables['element']; + $output = ''; + + if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) { $table_id = drupal_html_id($element['#field_name'] . '_values'); $order_class = $element['#field_name'] . '-delta-order'; $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : ''; diff --git a/modules/field/field.module b/modules/field/field.module index 52faf35..1de1e1a 100644 --- a/modules/field/field.module +++ b/modules/field/field.module @@ -327,6 +327,9 @@ function field_theme() { 'field_multiple_value_form' => array( 'render element' => 'element', ), + 'field_multiple_value_orderable_form' => array( + 'render element' => 'element', + ), ); } diff --git a/modules/field_ui/field_ui.admin.inc b/modules/field_ui/field_ui.admin.inc index 5d74a5c..dbba2d5 100644 --- a/modules/field_ui/field_ui.admin.inc +++ b/modules/field_ui/field_ui.admin.inc @@ -1681,6 +1681,14 @@ function field_ui_widget_type_form($form, &$form_state, $instance) { '#default_value' => $instance['widget']['type'], '#description' => t('The type of form element you would like to present to the user when creating this field in the %type type.', array('%type' => $bundle_label)), ); + if ($field['cardinality'] != 1) { + $form['basic']['orderable'] = array( + '#type' => 'checkbox', + '#title' => t('Orderable'), + '#default_value' => isset($instance['widget']['orderable']) ? $instance['widget']['orderable'] : TRUE, + '#description' => t('Orderable multiple fields widgets are in a table with drag and drop.'), + ); + } $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Continue')); @@ -1709,6 +1717,9 @@ function field_ui_widget_type_form_submit($form, &$form_state) { $instance['widget']['type'] = $form_values['widget_type']; $instance['widget']['module'] = $widget_module; + if (isset($form_values['orderable'])) { + $instance['widget']['orderable'] = $form_values['orderable']; + } try { field_update_instance($instance);