From d8c739586bef3b51309d40740fc994e1ec642a6e Mon Sep 17 00:00:00 2001 From: Nathaniel <catch@35733.no-reply.drupal.org> Date: Fri, 2 Dec 2011 14:05:37 +0900 Subject: [PATCH] Issue #1346760 by xjm, droplet, catch: Fixed Drag and drop needs a scalable weight select element. --- core/includes/form.inc | 26 ++++++++++++++++++++------ core/modules/system/system.module | 7 +++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/core/includes/form.inc b/core/includes/form.inc index a12fb34d0212..aecf0daa3c3a 100644 --- a/core/includes/form.inc +++ b/core/includes/form.inc @@ -3792,13 +3792,27 @@ function theme_password($variables) { * Expand weight elements into selects. */ function form_process_weight($element) { - for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) { - $weights[$n] = $n; - } - $element['#options'] = $weights; - $element['#type'] = 'select'; $element['#is_weight'] = TRUE; - $element += element_info('select'); + + // If the number of options is small enough, use a select field. + $max_elements = variable_get('drupal_weight_select_max', DRUPAL_WEIGHT_SELECT_MAX); + if ($element['#delta'] <= $max_elements) { + $element['#type'] = 'select'; + for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) { + $weights[$n] = $n; + } + $element['#options'] = $weights; + $element += element_info('select'); + } + // Otherwise, use a text field. + else { + $element['#type'] = 'textfield'; + // Use a field big enough to fit most weights. + $element['#size'] = 10; + $element['#element_validate'] = array('element_validate_integer'); + $element += element_info('textfield'); + } + return $element; } diff --git a/core/modules/system/system.module b/core/modules/system/system.module index 77d6ebfa46ee..32b12833c2e0 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -45,6 +45,13 @@ */ const DRUPAL_REQUIRED = 2; +/** + * Maximum number of values in a weight select element. + * + * If the number of values is over the maximum, a text field is used instead. + */ +const DRUPAL_WEIGHT_SELECT_MAX = 100; + /** * Return only visible regions. * -- GitLab