- Patch #567064 by yched, sun: widgets done 'the easy way' have too many limitations. Removes more code than it adds!
parent
e4ca439ba1
commit
342ebd7776
|
|
@ -632,11 +632,15 @@ function hook_field_widget_info_alter(&$info) {
|
|||
* Array of default values for this field.
|
||||
* @param $delta
|
||||
* The order of this item in the array of subelements (0, 1, 2, etc).
|
||||
* @param $element
|
||||
* A form element array containing basic properties for the widget: #title,
|
||||
* #description, #required, #field, #field_instance, #field_name, #delta,
|
||||
* #columns.
|
||||
* @return
|
||||
* The form item for a single element for this field.
|
||||
*/
|
||||
function hook_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) {
|
||||
$element = array(
|
||||
function hook_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$element += array(
|
||||
'#type' => $instance['widget']['type'],
|
||||
'#default_value' => isset($items[$delta]) ? $items[$delta] : '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -57,18 +57,18 @@ function field_default_form($obj_type, $object, $field, $instance, $langcode, $i
|
|||
$delta = isset($get_delta) ? $get_delta : 0;
|
||||
$function = $instance['widget']['module'] . '_field_widget';
|
||||
if (function_exists($function)) {
|
||||
if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta)) {
|
||||
$defaults = array(
|
||||
'#required' => $get_delta > 0 ? FALSE : $instance['required'],
|
||||
$element = array(
|
||||
'#object_type' => $instance['object_type'],
|
||||
'#bundle' => $instance['bundle'],
|
||||
'#field_name' => $field['field_name'],
|
||||
'#columns' => array_keys($field['columns']),
|
||||
'#title' => check_plain(t($instance['label'])),
|
||||
'#description' => field_filter_xss($instance['description']),
|
||||
// Only the first widget should be required.
|
||||
'#required' => $delta == 0 && $instance['required'],
|
||||
'#delta' => $delta,
|
||||
'#field_name' => $field['field_name'],
|
||||
'#bundle' => $instance['bundle'],
|
||||
'#object_type' => $instance['object_type'],
|
||||
);
|
||||
$element = array_merge($element, $defaults);
|
||||
if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) {
|
||||
// If we're processing a specific delta value for a field where the
|
||||
// field module handles multiples, set the delta in the result.
|
||||
// For fields that handle their own processing, we can't make assumptions
|
||||
|
|
@ -84,14 +84,6 @@ function field_default_form($obj_type, $object, $field, $instance, $langcode, $i
|
|||
}
|
||||
|
||||
if ($form_element) {
|
||||
$defaults = array(
|
||||
'#field_name' => $field['field_name'],
|
||||
'#tree' => TRUE,
|
||||
'#weight' => $instance['widget']['weight'],
|
||||
);
|
||||
|
||||
$form_element = array_merge($form_element, $defaults);
|
||||
|
||||
// Add the field form element as a child keyed by language code to match the
|
||||
// field data structure: $object->{$field_name}[$langcode][$delta][$column].
|
||||
// The '#language' key can be used to access the field's form element when
|
||||
|
|
@ -99,7 +91,7 @@ function field_default_form($obj_type, $object, $field, $instance, $langcode, $i
|
|||
// form element.
|
||||
$addition[$field['field_name']] = array(
|
||||
'#tree' => TRUE,
|
||||
'#weight' => $form_element['#weight'],
|
||||
'#weight' => $instance['widget']['weight'],
|
||||
'#language' => $langcode,
|
||||
$langcode => $form_element,
|
||||
);
|
||||
|
|
@ -145,6 +137,7 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form,
|
|||
|
||||
$form_element = array(
|
||||
'#theme' => 'field_multiple_value_form',
|
||||
'#field_name' => $field['field_name'],
|
||||
'#cardinality' => $field['cardinality'],
|
||||
'#title' => $title,
|
||||
'#required' => $instance['required'],
|
||||
|
|
@ -157,21 +150,21 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form,
|
|||
$function = $instance['widget']['module'] . '_field_widget';
|
||||
if (function_exists($function)) {
|
||||
for ($delta = 0; $delta <= $max; $delta++) {
|
||||
if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta)) {
|
||||
$multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED;
|
||||
$defaults = array(
|
||||
$element = array(
|
||||
'#object_type' => $instance['object_type'],
|
||||
'#bundle' => $instance['bundle'],
|
||||
'#field_name' => $field_name,
|
||||
'#columns' => array_keys($field['columns']),
|
||||
// For multiple fields, title and description are handled by the wrapping table.
|
||||
'#title' => $multiple ? '' : $title,
|
||||
'#description' => $multiple ? '' : $description,
|
||||
// Only the first widget should be required.
|
||||
'#required' => $delta == 0 && $instance['required'],
|
||||
'#weight' => $delta,
|
||||
'#delta' => $delta,
|
||||
'#columns' => array_keys($field['columns']),
|
||||
'#field_name' => $field_name,
|
||||
'#object_type' => $instance['object_type'],
|
||||
'#bundle' => $instance['bundle'],
|
||||
'#weight' => $delta,
|
||||
);
|
||||
|
||||
if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) {
|
||||
// Input field for the delta (drag-n-drop reordering).
|
||||
if ($multiple) {
|
||||
// We name the element '_weight' to avoid clashing with elements
|
||||
|
|
@ -184,14 +177,12 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form,
|
|||
'#weight' => 100,
|
||||
);
|
||||
}
|
||||
|
||||
$form_element[$delta] = array_merge($element, $defaults);
|
||||
$form_element[$delta] = $element;
|
||||
}
|
||||
}
|
||||
|
||||
// Add 'add more' button, if not working with a programmed form.
|
||||
if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) {
|
||||
|
||||
$form_element[$field_name . '_add_more'] = array(
|
||||
'#type' => 'submit',
|
||||
'#name' => $field_name . '_add_more',
|
||||
|
|
|
|||
|
|
@ -313,37 +313,9 @@ function number_element_info() {
|
|||
|
||||
/**
|
||||
* Implement hook_field_widget().
|
||||
*
|
||||
* Attach a single form element to the form. It will be built out and
|
||||
* validated in the callback(s) listed in hook_element_info(). We build it
|
||||
* out in the callbacks rather than here in hook_widget so it can be
|
||||
* plugged into any module that can provide it with valid
|
||||
* $field information.
|
||||
*
|
||||
* Field module will set the weight, field name and delta values
|
||||
* for each form element.
|
||||
*
|
||||
* If there are multiple values for this field, the Field module will
|
||||
* call this function as many times as needed.
|
||||
*
|
||||
* @param $form
|
||||
* the entire form array, $form['#node'] holds node information
|
||||
* @param $form_state
|
||||
* the form_state, $form_state['values'] holds the form values.
|
||||
* @param $field
|
||||
* The field structure.
|
||||
* @param $instance
|
||||
* the field instance array
|
||||
* @param $langcode
|
||||
* The language associated to $items.
|
||||
* @param $delta
|
||||
* the order of this item in the array of subelements (0, 1, 2, etc)
|
||||
*
|
||||
* @return
|
||||
* the form item for a single element for this field
|
||||
*/
|
||||
function number_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) {
|
||||
$element = array(
|
||||
function number_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$element += array(
|
||||
'#type' => $instance['widget']['type'],
|
||||
'#default_value' => isset($items[$delta]) ? $items[$delta] : NULL,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -94,8 +94,8 @@ function options_element_info() {
|
|||
/**
|
||||
* Implement hook_field_widget().
|
||||
*/
|
||||
function options_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = NULL) {
|
||||
$element = array(
|
||||
function options_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$element += array(
|
||||
'#type' => $instance['widget']['type'],
|
||||
'#default_value' => !empty($items) ? $items : array(),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -563,40 +563,9 @@ function text_element_info() {
|
|||
|
||||
/**
|
||||
* Implement hook_field_widget().
|
||||
*
|
||||
* Attach a single form element to the form. It will be built out and
|
||||
* validated in the callback(s) listed in hook_element_info(). We build it
|
||||
* out in the callbacks rather than here in hook_field_widget so it can be
|
||||
* plugged into any module that can provide it with valid
|
||||
* $field information.
|
||||
*
|
||||
* Field module will set the weight, field name and delta values
|
||||
* for each form element.
|
||||
*
|
||||
* If there are multiple values for this field, the field module will
|
||||
* call this function as many times as needed.
|
||||
*
|
||||
* @param $form
|
||||
* the entire form array, $form['#node'] holds node information
|
||||
* @param $form_state
|
||||
* the form_state, $form_state['values'][$field['field_name']]
|
||||
* holds the field's form values.
|
||||
* @param $field
|
||||
* The field structure.
|
||||
* @param $instance
|
||||
* the field instance array
|
||||
* @param $langcode
|
||||
* The language associated to $items.
|
||||
* @param $items
|
||||
* array of default values for this field
|
||||
* @param $delta
|
||||
* the order of this item in the array of subelements (0, 1, 2, etc)
|
||||
*
|
||||
* @return
|
||||
* the form item for a single element for this field
|
||||
*/
|
||||
function text_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) {
|
||||
$element = array(
|
||||
function text_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$element += array(
|
||||
'#type' => $instance['widget']['type'],
|
||||
'#default_value' => isset($items[$delta]) ? $items[$delta] : '',
|
||||
);
|
||||
|
|
@ -721,7 +690,6 @@ function text_textarea_with_summary_process($element, $form_state, $form) {
|
|||
'#weight' => 0,
|
||||
'#title' => t('Summary'),
|
||||
'#description' => t('Leave blank to use trimmed value of full text as the summary.'),
|
||||
'#required' => $element['#required'],
|
||||
'#display' => $display,
|
||||
'#attached' => array('js' => array(drupal_get_path('module', 'text') . '/text.js')),
|
||||
'#attributes' => array('class' => array('text-textarea-summary')),
|
||||
|
|
@ -738,7 +706,6 @@ function text_textarea_with_summary_process($element, $form_state, $form) {
|
|||
'#title' => $display ? t('Full text') : $element['#title'],
|
||||
'#description' => $element['#description'],
|
||||
'#required' => $element['#required'],
|
||||
'#required' => $instance['required'],
|
||||
'#attributes' => array('class' => array('text-full-textarea')),
|
||||
'#prefix' => '<div class="text-full-wrapper">',
|
||||
'#suffix' => '</div>',
|
||||
|
|
|
|||
|
|
@ -429,7 +429,7 @@ function file_field_widget_settings_form($field, $instance) {
|
|||
/**
|
||||
* Implementation of hook_field_widget().
|
||||
*/
|
||||
function file_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) {
|
||||
function file_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$form['#attributes'] = array('enctype' => 'multipart/form-data');
|
||||
|
||||
$defaults = array(
|
||||
|
|
@ -461,27 +461,21 @@ function file_field_widget(&$form, &$form_state, $field, $instance, $langcode, $
|
|||
|
||||
// Essentially we use the managed_file type, extended with some enhancements.
|
||||
$element_info = element_info('managed_file');
|
||||
$element = array(
|
||||
$element += array(
|
||||
'#type' => 'managed_file',
|
||||
'#default_value' => isset($items[$delta]) ? $items[$delta] : $defaults,
|
||||
'#required' => $instance['required'],
|
||||
'#upload_location' => file_field_widget_uri($field, $instance),
|
||||
'#upload_validators' => file_field_widget_upload_validators($field, $instance),
|
||||
'#value_callback' => 'file_field_widget_value',
|
||||
'#process' => array_merge($element_info['#process'], array('file_field_widget_process')),
|
||||
// Allows this field to return an array instead of a single value.
|
||||
'#extended' => TRUE,
|
||||
// Add extra Field properties.
|
||||
'#field_name' => $field['field_name'],
|
||||
'#bundle' => $instance['bundle'],
|
||||
'#object_type' => $instance['object_type'],
|
||||
);
|
||||
|
||||
if ($field['cardinality'] == 1) {
|
||||
// If there's only one field, return it as delta 0.
|
||||
$element['#title'] = $instance['label'];
|
||||
if (empty($element['#default_value']['fid'])) {
|
||||
$element['#description'] = theme('file_upload_help', array('description' => $instance['description'], 'upload_validators' => $element['#upload_validators']));
|
||||
$element['#description'] = theme('file_upload_help', array('description' => $element['#description'], 'upload_validators' => $element['#upload_validators']));
|
||||
}
|
||||
$elements = array($element);
|
||||
}
|
||||
|
|
@ -499,7 +493,7 @@ function file_field_widget(&$form, &$form_state, $field, $instance, $langcode, $
|
|||
$elements[$delta] = $element;
|
||||
$elements[$delta]['#default_value'] = $defaults;
|
||||
$elements[$delta]['#weight'] = $delta;
|
||||
$elements[$delta]['#required'] = ($instance['required'] && $delta == 0);
|
||||
$elements[$delta]['#required'] = ($element['#required'] && $delta == 0);
|
||||
}
|
||||
// The group of elements all-together need some extra functionality
|
||||
// after building up the full list (like draggable table rows).
|
||||
|
|
@ -508,8 +502,11 @@ function file_field_widget(&$form, &$form_state, $field, $instance, $langcode, $
|
|||
$elements['#theme_wrappers'] = array('fieldset');
|
||||
$elements['#attributes']['class'] = array('file-widget');
|
||||
$elements['#process'] = array('file_field_widget_process_multiple');
|
||||
$elements['#title'] = $instance['label'];
|
||||
$elements['#description'] = $instance['description'];
|
||||
$elements['#title'] = $element['#title'];
|
||||
$elements['#description'] = $element['#description'];
|
||||
$elements['#object_type'] = $element['#object_type'];
|
||||
$elements['#bundle'] = $element['#bundle'];
|
||||
$elements['#field_name'] = $element['#field_name'];
|
||||
|
||||
// Add some properties that will eventually be added to the file upload
|
||||
// field. These are added here so that they may be referenced easily through
|
||||
|
|
|
|||
|
|
@ -305,8 +305,8 @@ function image_field_widget_settings_form($field, $instance) {
|
|||
/**
|
||||
* Implementation of hook_field_widget().
|
||||
*/
|
||||
function image_field_widget(&$form, &$form_state, $field, $instance, $items, $delta = 0) {
|
||||
$elements = file_field_widget($form, $form_state, $field, $instance, $items, $delta);
|
||||
function image_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$elements = file_field_widget($form, $form_state, $field, $instance, $langcode, $items, $delta, $element);
|
||||
$settings = $instance['settings'];
|
||||
|
||||
foreach (element_children($elements) as $delta) {
|
||||
|
|
|
|||
|
|
@ -489,40 +489,12 @@ function field_test_field_widget_info() {
|
|||
|
||||
/**
|
||||
* Implement hook_field_widget().
|
||||
*
|
||||
* Attach a single form element to the form. It will be built out and
|
||||
* validated in the callback(s) listed in hook_element_info(). We build it
|
||||
* out in the callbacks rather than here in hook_widget so it can be
|
||||
* plugged into any module that can provide it with valid
|
||||
* $field information.
|
||||
*
|
||||
* If there are multiple values for this field, the field module will
|
||||
* call this function as many times as needed.
|
||||
*
|
||||
* @param $form
|
||||
* the entire form array, $form['#node'] holds node information
|
||||
* @param $form_state
|
||||
* the form_state, $form_state['values'][$field['field_name']]
|
||||
* holds the field's form values.
|
||||
* @param $field
|
||||
* The field structure.
|
||||
* @param $instance
|
||||
* the instance array
|
||||
* @param $items
|
||||
* array of default values for this field
|
||||
* @param $delta
|
||||
* the order of this item in the array of subelements (0, 1, 2, etc)
|
||||
*
|
||||
* @return
|
||||
* the form item for a single element for this field
|
||||
*/
|
||||
function field_test_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) {
|
||||
function field_test_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$element = array(
|
||||
'value' => array(
|
||||
'#title' => $instance['label'],
|
||||
'value' => $element + array(
|
||||
'#type' => 'textfield',
|
||||
'#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : '',
|
||||
'#required' => $instance['required'],
|
||||
),
|
||||
);
|
||||
return $element;
|
||||
|
|
|
|||
|
|
@ -1211,8 +1211,8 @@ function taxonomy_term_title($term) {
|
|||
/**
|
||||
* Implement hook_field_widget().
|
||||
*/
|
||||
function taxonomy_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = NULL) {
|
||||
$element = array(
|
||||
function taxonomy_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||
$element += array(
|
||||
'#type' => $instance['widget']['type'],
|
||||
'#default_value' => !empty($items) ? $items : array(),
|
||||
);
|
||||
|
|
|
|||
Loading…
Reference in New Issue