function file_field_widget_form

Implements hook_field_widget_form().

1 call to file_field_widget_form()
image_field_widget_form in modules/image/image.field.inc
Implements hook_field_widget_form().

File

modules/file/file.field.inc, line 463

Code

function file_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
    $defaults = array(
        'fid' => 0,
        'display' => !empty($field['settings']['display_default']),
        'description' => '',
    );
    // Load the items for form rebuilds from the field state as they might not be
    // in $form_state['values'] because of validation limitations. Also, they are
    // only passed in as $items when editing existing entities.
    $field_state = field_form_get_state($element['#field_parents'], $field['field_name'], $langcode, $form_state);
    if (isset($field_state['items'])) {
        $items = $field_state['items'];
    }
    // Essentially we use the managed_file type, extended with some enhancements.
    $element_info = element_info('managed_file');
    $element += array(
        '#type' => 'managed_file',
        '#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',
        )),
        '#progress_indicator' => $instance['widget']['settings']['progress_indicator'],
        // Allows this field to return an array instead of a single value.
'#extended' => TRUE,
    );
    if ($field['cardinality'] == 1) {
        // Set the default value.
        $element['#default_value'] = !empty($items) ? $items[0] : $defaults;
        // If there's only one field, return it as delta 0.
        if (empty($element['#default_value']['fid'])) {
            $element['#description'] = theme('file_upload_help', array(
                'description' => $element['#description'],
                'upload_validators' => $element['#upload_validators'],
            ));
        }
        $elements = array(
            $element,
        );
    }
    else {
        // If there are multiple values, add an element for each existing one.
        foreach ($items as $item) {
            $elements[$delta] = $element;
            $elements[$delta]['#default_value'] = $item;
            $elements[$delta]['#weight'] = $delta;
            $delta++;
        }
        // And then add one more empty row for new uploads except when this is a
        // programmed form as it is not necessary.
        if (($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta < $field['cardinality']) && empty($form_state['programmed'])) {
            $elements[$delta] = $element;
            $elements[$delta]['#default_value'] = $defaults;
            $elements[$delta]['#weight'] = $delta;
            $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).
        $elements['#file_upload_delta'] = $delta;
        $elements['#theme'] = 'file_widget_multiple';
        $elements['#theme_wrappers'] = array(
            'fieldset',
        );
        $elements['#process'] = array(
            'file_field_widget_process_multiple',
        );
        $elements['#title'] = $element['#title'];
        $elements['#description'] = $element['#description'];
        $elements['#field_name'] = $element['#field_name'];
        $elements['#language'] = $element['#language'];
        $elements['#display_field'] = $field['settings']['display_field'];
        // 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
        // a hook_form_alter().
        $elements['#file_upload_title'] = t('Add a new file');
        $elements['#file_upload_description'] = theme('file_upload_help', array(
            'description' => '',
            'upload_validators' => $elements[0]['#upload_validators'],
        ));
    }
    return $elements;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.